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钩子可直接替换链接内的按钮文本。 - 增加对象校验:避免产品对象无效时触发错误,提升代码稳定性。
验证步骤
- 将代码添加到主题的
functions.php文件,或使用Code Snippets等代码片段插件。 - 刷新Baking Class类别归档页,检查按钮文本是否变为“Book Now”。
- 验证其余5类产品的归档页、单个产品页按钮文本是否显示“Order”。
内容的提问来源于stack exchange,提问作者Alexander Holgate
相关产品推荐
相关产品推荐

