我创建了一个基于内置变量产品类型的自定义 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”。我需要它返回“书”,以便产品编辑页面能够正确识别类型。
我知道我可以删除并替换我自己的代码中的 add_to_cart_action()
函数来覆盖此行为并添加我的自定义类型,但是我无法调用所有其他私有(private)方法WC_Form_Handler
类。还是可以覆盖整个类..?
还有其他方法可以绕过这一切,让我的基于变量的定制产品进入购物车吗?
最佳答案
我相信您可以通过过滤 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 );
或
您可以将默认变量产品处理程序添加到自定义 woocommerce_add_to_cart_handler_$type
Hook 中,如下所示:
add_action( 'woocommerce_book_add_to_cart', 'woocommerce_variable_add_to_cart' );
关于php - 如何添加将 WC_Product_Variable 扩展到购物车的自定义 WooCommerce 产品类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51316906/