如何添加将WC_Product_Variable扩展到购物车的自定义WooCommerce产品类型

时间:2018-07-13 02:33:00

标签: php wordpress woocommerce

我创建了一个基于内置可变产品类型的自定义WooCommerce产品类型。我想同时拥有产品变型和自定义特征以及针对我的产品类型的字段。一切正常,并在管理员和我的自定义前端产品页面模板中正常显示。

这是我的自定义产品,仅供参考:

add_action( 'init', 'register_book_type' );
function register_book_type () {
    class WC_Product_Book extends WC_Product_Variable {
        public function __construct( $product ) {
            parent::__construct( $product );
        }

        public function get_type() {
            return 'book';
        }
    }
}

但是,当我将带有变体形式的产品发布到购物车时,行为混乱了,因为$adding_to_cart->get_type()(在add_to_cart_action()类中的代码WC_Form_Handler将产品标识为我的自定义“书”类型,而不将其视为“变量”产品,并且默认情况下会退回到将其视为“简单”产品类型。

这是给我带来麻烦的内置WooCommerce区域:

$add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->get_type(), $adding_to_cart );
if ( 'variable' === $add_to_cart_handler || 'variation' === $add_to_cart_handler ) {
    $was_added_to_cart = self::add_to_cart_handler_variable( $product_id );
} elseif ( 'grouped' === $add_to_cart_handler ) {
    $was_added_to_cart = self::add_to_cart_handler_grouped( $product_id );
} elseif ( has_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler ) ) {
    do_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler, $url ); // Custom handler.
} else {
    $was_added_to_cart = self::add_to_cart_handler_simple( $product_id );
}

问题似乎是当此代码期望“变量”时,我自己的get_type()方法返回“ book”。我需要它返回“ book”,以便产品编辑页面可以正确识别类型。

我知道我可以在自己的代码中删除并替换add_to_cart_action()函数以覆盖此行为并添加我的自定义类型,但是后来我无法调用{{1}中的所有其他私有方法}类。还是只覆盖整个类就可以了吗??

还有其他方法可以绕开所有这些,以将基于变量的自定义产品放入购物车吗?

2 个答案:

答案 0 :(得分:2)

这是我解决此问题的方法:

public function get_type()
{
    return get_current_screen()->id === 'product' ? 'book' : parent::get_type();
}

这将在编辑产品页面上返回book,但在其他任何地方都返回variable

答案 1 :(得分:1)

我相信您可以通过过滤woocommerce_add_to_cart_handler来更改处理程序,以告知WooCommerce使用可变产品处理程序:

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

OR

您可以将默认变量产品处理程序添加到自定义woocommerce_add_to_cart_handler_$type挂钩中,如下所示:

add_action( 'woocommerce_book_add_to_cart', 'woocommerce_variable_add_to_cart' );