You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce多类别加入购物车按钮文本PHP自定义及Elementor适配问题

解决Elementor自定义产品归档页中WooCommerce加入购物车按钮文本不生效问题

问题背景

我用WooCommerce搭建网站,Elementor制作自定义产品归档页,现有6个产品类别:Cakes、Cupcakes、Halloween、Sweet Treats、Petal and Post、Baking Class。需求是全站(产品归档页+单个产品页)的加入购物车按钮文本按类别区分:前5类显示“Order”,Baking Class类显示“Book Now”。但我写的PHP代码在Elementor制作的Baking Class类别归档页上不生效,原代码如下:

add_filter('woocommerce_product_add_to_cart_text', 'woocommerce_custom_product_add_to_cart_text', 10, 2);
add_filter('woocommerce_product_single_add_to_cart_text', 'woocommerce_custom_product_add_to_cart_text', 10, 2);

function woocommerce_custom_product_add_to_cart_text($text, $product) {

    if( has_term( array( 'Cakes', 'Cupcakes', 'Halloween', 'Sweet Treats', 'Petal and Post' ), 'product_cat', $product->get_id() ) ){
        $text = __('Order', 'woocommerce');
    }
    if( has_term( array( 'baking-classes' ), 'product_cat', $product->get_id() ) ){
        $text = __('Book Now', 'woocommerce');
    }
    return $text;
}

问题原因

Elementor自定义归档页的产品循环逻辑可能未正确触发默认WooCommerce钩子,或者原代码存在类别匹配方式、钩子优先级的适配问题。

修复方案

调整后的代码

// 针对归档页和单个产品页的按钮文本过滤
add_filter('woocommerce_product_add_to_cart_text', 'custom_add_to_cart_text', 20, 2);
add_filter('woocommerce_product_single_add_to_cart_text', 'custom_add_to_cart_text', 20, 2);

// 适配Elementor归档页的产品循环
add_filter('woocommerce_loop_add_to_cart_link', 'custom_loop_add_to_cart_text', 20, 2);

function custom_add_to_cart_text($text, $product) {
    // 校验产品对象有效性
    if (!$product || !is_a($product, 'WC_Product')) {
        return $text;
    }

    // 获取产品所属类别的slug集合
    $product_cat_slugs = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
    
    // 判断Baking Class类别(使用slug更稳定)
    if (in_array('baking-classes', $product_cat_slugs)) {
        return __('Book Now', 'woocommerce');
    } 
    // 判断其余5类产品
    elseif (array_intersect($product_cat_slugs, array('cakes', 'cupcakes', 'halloween', 'sweet-treats', 'petal-and-post'))) {
        return __('Order', 'woocommerce');
    }

    // 保留默认文本(针对未分类产品)
    return $text;
}

function custom_loop_add_to_cart_text($link, $product) {
    // 调用自定义文本逻辑替换链接中的按钮文本
    $custom_text = custom_add_to_cart_text('', $product);
    return str_replace(__('Add to cart', 'woocommerce'), $custom_text, $link);
}

关键调整说明

  • 使用类别Slug匹配:原代码混合使用类别名称和Slug,容易出现大小写、空格匹配错误,改用Slug(如baking-classes)更可靠。
  • 提高钩子优先级:将优先级从10改为20,确保自定义逻辑在Elementor的渲染逻辑之后执行,覆盖默认文本。
  • 新增循环链接钩子:Elementor的产品循环可能直接生成加入购物车链接,woocommerce_loop_add_to_cart_link钩子可直接替换链接内的按钮文本。
  • 增加对象校验:避免产品对象无效时触发错误,提升代码稳定性。

验证步骤

  1. 将代码添加到主题的functions.php文件,或使用Code Snippets等代码片段插件。
  2. 刷新Baking Class类别归档页,检查按钮文本是否变为“Book Now”。
  3. 验证其余5类产品的归档页、单个产品页按钮文本是否显示“Order”。

内容的提问来源于stack exchange,提问作者Alexander Holgate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:11:39