Я все еще могу добавить пользовательский тип сообщения в корзину в WooCommerce 2.6, просто добавив фильтр в «woocommerce_product_class»
function wc_product_class( $class, $product_type, $post_type ) { if( 'my_custom_post_type_slug' == $post_type ) $class = 'WC_Product_Simple'; return $class; } add_filter( 'woocommerce_product_class', 'wc_product_class', 10, 3); //This will echo the carti item id echo WC()->cart->add_to_cart($custom_post_type_id, $quantity, null, null, array());
К сожалению, это не работает в последней версии WooCommerce. Кто-нибудь, пожалуйста, помогите мне в решении этой проблемы? Любые предложения, комментарии, решения очень ценятся.
Я продаю плагин, который позволит использовать Custom Post Type как «продукт» WooCommerce . Я много работал над этим.
Но это самая важная часть.
Вы должны создать свой собственный хранилище данных, например:
сначала создайте класс, который распространяется на 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; }
Как только это будет сделано, у вас будет успех, добавив в корзину.