当前位置: 首页 > 知识库问答 >
问题:

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

唐啸
2023-03-14

我已经创建了一个基于内置变量product type的自定义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\u to\u cart-

这是给我带来麻烦的内置商业区:

$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\u type()方法在代码需要“变量”时返回“book”。我需要它返回“book”,以便产品编辑页面能够正确识别该类型。

我知道我可以在自己的代码中删除并替换add\u to\u cart\u action()函数,以覆盖此行为并添加自定义类型,但是我无法调用WC\u Form\u处理程序类中的所有其他私有方法。还是可以重写整个类。。?

有没有其他方法可以绕过这一切,让我的基于变量的自定义产品进入购物车?


共有2个答案

东方琪
2023-03-14

我就是这样解决这个问题的:

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

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

宿楚青
2023-03-14

我相信您可以更改处理程序,告诉WooCommerce使用变量产品处理程序,方法是过滤woocommerce_add_to_cart_handler,如下所示:

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钩子中,如下所示:

add_action( 'woocommerce_book_add_to_cart', 'woocommerce_variable_add_to_cart' );
 类似资料:
  • 我正在尝试将我的WooCommerce档案页面上特定产品类别的add to cart按钮更改为“Read More”按钮,该按钮将链接到产品页面(但不链接到单个产品页面本身)。 使用“将添加到购物车按钮替换为WooCommerce 3中的shop pages中的read more链接到product页面”的答案代码,如何将其限制为仅有一个产品类别(本例中术语名称为“Classs”)? 感谢任何帮助

  • 我正在尝试为variations父产品创建一个单独的add to cart按钮。我正在使用以下方法访问产品数据: 谢谢你。

  • 我经营一家Woocommerce商店,该商店也提供免费产品(_常规价格=0)。客户必须选择数量并将其添加到购物车中,然后下订单才能收到产品。但这并不是Woocommerce的工作原理,它隐藏了所有价格为0的产品的“添加到购物车”链接。并且不会在购物车页面中显示它们。有没有解决这个问题的办法?非常感谢。

  • 在Woocommerce中,我需要在添加产品时跳过购物车页面,并直接重定向到仅限订阅产品类型的签出。 我在其他地方找到了下面的代码,它适用于跳过基于产品ID的购物车页面,但是我不能正确地使用产品类型(请参阅下面我尝试的内容)。 我尝试的:(它破坏了整个网站:变成了一个blanc页面) 有没有办法做到这一点?

  • 我使用WooCommerce Wordpress中的以下代码,通过一个模板,使用add_to_cart($product_id)功能添加了许多产品。 现在,我希望通过此模板为每个产品添加自定义价格。现在购物车中的价格和数据库中的价格一样,但我想通过这一点添加我的自定义价格。有人能帮我做同样的事吗。谢谢

  • 我见过很多例子,都是用客户价格将商品添加到WC购物车中,但没有一个是动态添加的。我正在尝试在一个接收POST变量的短代码函数中执行。。。。 这当然会将项目添加到购物车,但价格为零,我意识到我需要以某种方式将此数组保存回WC购物车数据。这种方法是可能的还是只能通过过滤器或操作钩子来完成?如果是这样,我如何保存改变的数组回到购物车的内容,或使其工作添加一个项目与公布的价格?非常感谢任何指导。 感谢do