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

标签 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() 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/

相关文章:

php - 新值未从更新/插入表单插入到表中

php - Symfony 4 注册表第二次提交 "There is already an active transaction"

wordpress - Amazon Web Services EC2 实例有时会变得非常慢

php - 获取产品变体属性值术语 ID 和名称

php - WooCommerce 按 ID 限制产品

PHP 我应该在 ob_start 之后使用 ob_clean

javascript - Ajax数据嵌入页面而不是返回正确的结果

jquery - wordpress slider 上的响应高度

mysql - 1000 多个帖子的 Wordpress 慢元查询

php - 迷你卡中的自定​​义价格值仅在单个产品站点上是错误的