我创建了一个基于内置变量产品类型的自定义 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()
in 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()
我自己的代码中的函数来覆盖此行为并添加我的自定义类型,但随后我无法调用WC_Form_Handler
班级。或者可以覆盖整个类吗?
还有其他方法可以绕过这一切,将我的基于变量的定制产品放入购物车吗?