WooCommerce中将缺货文本替换为联系按钮的问题求助
解决WooCommerce缺货文本替换为「联系我们」按钮的问题
咱们一步步排查你代码失效的原因,再给出可行的修正方案:
问题1:商店页面移除「添加到购物车」按钮失败
你给第一个函数设置的优先级是1,但WooCommerce默认的woocommerce_template_loop_add_to_cart动作优先级是10。这意味着你的函数会在原按钮动作被注册之前就执行remove_action,自然移除不掉目标按钮。而且直接在同一个钩子下输出新按钮的逻辑也不够精准。
问题2:单产品页面的HTML被转义
第二个函数里你直接把<a>标签塞进$availability['availability'],但WooCommerce渲染缺货文本时,会用esc_html()对这个值进行转义——也就是说HTML标签会被当成纯文本显示,根本不会变成可点击的链接。
修正后的完整代码
1. 商店页面替换缺货按钮
用woocommerce_loop_add_to_cart_link过滤器直接拦截按钮输出,根据库存状态替换,比移除动作更可靠:
// 替换商店页面的缺货按钮为「联系我们」 add_filter('woocommerce_loop_add_to_cart_link', 'replace_shop_out_of_stock_button', 10, 2); function replace_shop_out_of_stock_button($button_html, $product) { if (!$product->is_in_stock()) { // 替换为自定义联系按钮,可根据需求调整class样式 $button_html = '<a href="/contact" class="button product_type_simple add_to_cart_button">联系我们</a>'; } return $button_html; }
2. 单产品页面替换缺货按钮
通过调整动作优先级,先移除原「添加到购物车」按钮,再输出自定义按钮:
// 替换单产品页面的缺货按钮为「联系我们」 add_action('woocommerce_single_product_summary', 'replace_single_product_out_of_stock_button', 9); function replace_single_product_out_of_stock_button() { global $product; if (!$product->is_in_stock()) { // 移除原添加购物车按钮(原动作优先级为30) remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30); // 输出自定义联系按钮,匹配原按钮样式 echo '<a href="/contact" class="single_add_to_cart_button button alt">联系我们</a>'; } }
额外说明
如果你坚持想用woocommerce_get_availability修改缺货文本并保留HTML,可以添加以下代码跳过转义(但这种方法更适合修改文本,而非替换为按钮):
// 允许缺货文本中包含HTML(可选方案) add_filter('woocommerce_stock_html', 'allow_html_in_stock_notice', 10, 2); function allow_html_in_stock_notice($stock_html, $availability) { return '<p class="stock ' . esc_attr($availability['class']) . '">' . $availability['availability'] . '</p>'; }
内容的提问来源于stack exchange,提问作者Adrian P.
相关产品推荐
相关产品推荐

