Пользовательский тип продукта с вариацией, название вариации не отображается в корзине / кассе - PullRequest
0 голосов
/ 17 июня 2020

Я создал ПОЛЬЗОВАТЕЛЬСКИЙ вариант типа продукта, все работает хорошо как в бэкэнде, так и во внешнем интерфейсе, единственная проблема в том, что в корзине / деталях оформления заказа имя продукта не отображается, также после покупки количество товара не уменьшается, 1 товар доступен для переменной, после покупки оставьте 1 товар доступным, а не отсутствующим на складе.

Это используемый код.

* Step 1. Add a custom product type "term" to other hardcoded ones
 */
add_filter( 'product_type_selector', 'misha_ticket_product_type' );
 
function misha_ticket_product_type( $product_types ){
    $product_types[ 'ticket' ] = 'Ticket';
    return $product_types;
}
 
/**
 * Step 2. Each product type has a PHP class WC_Product_{type}
 */
add_action( 'init', 'misha_create_ticket_product_class' );
add_filter( 'woocommerce_product_class', 'misha_load_ticket_product_class',10,2);
 
function misha_create_ticket_product_class(){
    class WC_Product_Ticket extends WC_Product_Variable {


        public function __construct( $product ) {

            $this->product_type = 'ticket';
            $this->supports[]   = 'ajax_add_to_cart';
            parent::__construct( $product );
           
        }

        public function get_type() {
            return 'ticket'; // so you can use $product = wc_get_product(); $product->get_type()
        }
            
    }
}


add_filter('woocommerce_product_data_tabs','ticket_showtabs',10,1);
 function ticket_showtabs($tabs) {

            array_push($tabs['attribute']['class'], 'show_if_variable', 'show_if_ticket');
            array_push($tabs['variations']['class'], 'show_if_ticket');
        
          return $tabs;

        }  

function producttype_custom_js() {

if ( 'product' != get_post_type() ) :
    return;
endif;

?><script type='text/javascript'>
jQuery("body").bind("DOMNodeInserted", function() {
   jQuery(this).find('.enable_variation').addClass('show_if_ticket').show();
});

</script><?php 
} 

add_action( 'admin_footer', 'producttype_custom_js' ,99);
 
function misha_load_ticket_product_class( $php_classname, $product_type ) {
    if ( $product_type == 'ticket' ) {
        $php_classname = 'WC_Product_Ticket';
    }
    return $php_classname;
}

add_filter( 'woocommerce_data_stores', function( $stores ){
    $stores['product-ticket'] = 'WC_Product_Variable_Data_Store_CPT';
    return $stores;
} ); 
    
add_action( 'woocommerce_ticket_add_to_cart', 'woocommerce_variable_add_to_cart' );

//**************************************END*********************************//```

1 Ответ

0 голосов
/ 03 августа 2020

Я столкнулся с той же проблемой, и это происходит потому, что woocommerce_add_to_cart_handler ожидает, что get_type вернет 'variable', чтобы запустить метод add_to_cart_handler_variable.

function misha_custom_add_to_cart_handler( $handler, $adding_to_cart ){
    if( $handler == 'ticket' ){
        $handler = 'variable';
    }
    return $handler;
}
add_filter( 'woocommerce_add_to_cart_handler', 'misha_custom_add_to_cart_handler', 10, 2 );

Вам что-то понадобится как указано выше согласно обсуждению здесь Как добавить пользовательский тип продукта WooCommerce, который расширяет WC_Product_Variable на корзину

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...