我创建了一个基于内置可变产品类型的自定义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}中的所有其他私有方法}类。还是只覆盖整个类就可以了吗??
还有其他方法可以绕开所有这些,以将基于变量的自定义产品放入购物车吗?
答案 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' );