У меня есть личная тема «А», и я хочу, чтобы она также могла работать без Woocommerce. Когда добавлен плагин Woocommerce «WC», я бы интегрировал продукты A с WC. У меня есть пользовательский тип сообщения, называемый «объекты», как я могу сделать «объект» доступным для покупки через WC?
Я уже видел этот ответ на StackOverflow. Добавление пользовательских типов сообщений в Woocommerce. Решение в конце дает бесплатный (не более) плагин для решения.
Я бы предпочел сделать это самостоятельно, без помощи плагина. Мне любопытно, и предварительное решение не то, что я ищу.
Мы можем попробовать легко. Вы хотите, чтобы пользовательский тип сообщения сохранял ваши продукты, а когда WooCommerce интегрирован, добавленные продукты в вашем пользовательском типе сообщений могут работать как продукты woocommerce.
Проверьте, установлена ли woocommerce ot not.
Если нет, то создайте собственный тип сообщения как «продукт» (аналогично woocommerce).
Чтобы проверить, активен ли woocommerce или нет, этот код
<?php if ( class_exists( 'WooCommerce' ) ) { // code that requires WooCommerce } else { // you don't appear to have WooCommerce activated } ?>
Я создал простой учебник, поскольку добавление его здесь было бы слишком длинным.
Чтобы достичь своей цели, ваш тип сообщения должен иметь цену. Тем не менее, пользовательское поле цены должно иметь мета-ключ _price
.
если у вас уже есть мета-ключ, который не является _price
, вы можете добавить фильтр в woocommerce_get_price
показанный ниже.
add_filter('woocommerce_get_price','reigel_woocommerce_get_price',20,2); function reigel_woocommerce_get_price($price,$post){ if ($post->post->post_type === 'post') // change this to your post type $price = get_post_meta($post->id, "price", true); // assuming your price meta key is price return $price; }
При этом теперь вы можете добавить любое сообщение в свой тип сообщения в корзину. Сделайте так, как http://localhost/wordpress/cart/?add-to-cart=1
где 1 – это идентификатор вашего сообщения в вашем типе сообщения.
Образец результата изображения после посещения этой ссылки:
Теперь вам нужно настроить форму, как показано ниже.
<form action="" method="post"> <input name="add-to-cart" type="hidden" value="<?php echo $post->ID ?>" /> <input name="quantity" type="number" value="1" min="1" /> <input name="submit" type="submit" value="Add to cart" /> </form>
вам нужно иметь это, чтобы получить кнопку «Добавить в корзину». Имя входов должно быть как есть.
Я столкнулся с той же проблемой. Проведя дни, я понял, как он должен работать и его решение.
Вот что я сделал
_price
для моей персонализированной почты Изменено условие if
в классе woocommerce/includes/class-wc-product-factory.php
Функция get_product_class
следующим образом:
до
if ( 'product' === $post_type){
после
if ( 'product' === $post_type || 'packages' === $post_type ){
Он отлично работал.
Теперь я хочу изменить этот тип продукта, используя некоторый метод фильтрации. Кто-нибудь может сообщить мне об этом:
if ( 'product' === $post_type || 'packages' === $post_type ){
Я продаю плагин, который позволит использовать Custom Post Type как «продукт» WooCommerce . Я много работал над этим, чтобы сделать его совместимым с WooCommerce 3.0
Но вот самая важная часть.
Вы должны создать свой собственный хранилище данных, например:
сначала создайте класс, который распространяется на WC_Product_Data_Store_CPT
. Идея состоит в том, чтобы перезаписать существующую функцию этого класса, которая проверяет тип сообщения. Я нашел read
и get_product_type
который выполняет проверку.
class WCCPT_Product_Data_Store_CPT extends WC_Product_Data_Store_CPT { /** * Method to read a product from the database. * @param WC_Product */ public function read( &$product ) { $product->set_defaults(); if ( ! $product->get_id() || ! ( $post_object = get_post( $product->get_id() ) ) || ! in_array( $post_object->post_type, array( 'birds', 'product' ) ) ) { // change birds with your post type throw new Exception( __( 'Invalid product.', 'woocommerce' ) ); } $id = $product->get_id(); $product->set_props( array( 'name' => $post_object->post_title, 'slug' => $post_object->post_name, 'date_created' => 0 < $post_object->post_date_gmt ? wc_string_to_timestamp( $post_object->post_date_gmt ) : null, 'date_modified' => 0 < $post_object->post_modified_gmt ? wc_string_to_timestamp( $post_object->post_modified_gmt ) : null, 'status' => $post_object->post_status, 'description' => $post_object->post_content, 'short_description' => $post_object->post_excerpt, 'parent_id' => $post_object->post_parent, 'menu_order' => $post_object->menu_order, 'reviews_allowed' => 'open' === $post_object->comment_status, ) ); $this->read_attributes( $product ); $this->read_downloads( $product ); $this->read_visibility( $product ); $this->read_product_data( $product ); $this->read_extra_data( $product ); $product->set_object_read( true ); } /** * Get the product type based on product ID. * * @since 3.0.0 * @param int $product_id * @return bool|string */ public function get_product_type( $product_id ) { $post_type = get_post_type( $product_id ); if ( 'product_variation' === $post_type ) { return 'variation'; } elseif ( in_array( $post_type, array( 'birds', 'product' ) ) ) { // change birds with your post type $terms = get_the_terms( $product_id, 'product_type' ); return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple'; } else { return false; } } }
после этого добавьте фильтр в woocommerce_data_stores
и используйте свой класс.
add_filter( 'woocommerce_data_stores', 'woocommerce_data_stores' ); function woocommerce_data_stores ( $stores ) { $stores['product'] = 'WCCPT_Product_Data_Store_CPT'; return $stores; }
с этим вы сможете добавить тип birds
в корзину. Но на самом деле не будет успеха добавить в корзину. Потому что нет цены, тележка откажется от нее.
Чтобы решить эту проблему, вам нужен еще один фильтр. Ниже приведен простой способ добавления цены.
add_filter('woocommerce_product_get_price', 'woocommerce_product_get_price', 10, 2 ); function woocommerce_product_get_price( $price, $product ) { if ($product->get_id() == 815 ) { $price = 10; } return $price; }
Как только это будет сделано, у вас будет успех, добавив в корзину.