求助:WooCommerce带变体产品自定义Backorder Message重复显示问题
解决WooCommerce变体产品自定义缺货消息重复显示的问题
问题根源
the_field使用错误:the_field()会直接输出内容而非返回值,导致alt_message函数无法正确返回消息,反而提前输出引发重复。- 变体钩子触发逻辑:
woocommerce_get_availability钩子会为每个变体单独触发,若未区分父产品与变体,会导致每个变体都输出一次消息。 - 未关联父产品字段:自定义缺货消息通常绑定在父产品上,变体需继承父产品的消息,而非单独处理。
修正后的代码
// 获取父产品的自定义缺货消息 function get_custom_backorder_message( $product ) { // 若为变体产品,获取对应的父产品对象 $target_product = $product->is_type('variation') ? wc_get_product( $product->get_parent_id() ) : $product; // 使用get_field返回字段值,替代直接输出的the_field return get_field('backorder_message', $target_product->get_id()); } // 修改产品页面的缺货提示文本 function custom_backorder_text( $availability, $product ) { $alt_message = get_custom_backorder_message( $product ); // 仅当自定义消息存在时,替换默认缺货文本 if ( !empty($alt_message) && strpos($availability['availability'], 'Available on backorder') !== false ) { $availability['availability'] = str_replace('Available on backorder', $alt_message, $availability['availability']); } return $availability; } add_filter('woocommerce_get_availability', 'custom_backorder_text', 10, 2); // 修改购物车项名称后的缺货提示 function woocommerce_custom_cart_item_name( $_product_title, $cart_item, $cart_item_key ) { $product = $cart_item['data']; $alt_message = get_custom_backorder_message( $product ); if ( !empty($alt_message) && $product->backorders_require_notification() && $product->is_on_backorder( $cart_item['quantity'] ) ) { $_product_title .= ' - ' . esc_html( $alt_message ); } return $_product_title; } add_filter( 'woocommerce_cart_item_name', 'woocommerce_custom_cart_item_name', 10, 3);
关键修正点
- 替换
the_field为get_field:保证函数返回字段值而非直接输出,修复逻辑错误。 - 关联父产品字段:自动识别变体产品,读取其对应父产品的ACF字段,确保所有变体共用同一条自定义消息。
- 优化钩子参数利用:
woocommerce_get_availability钩子原本支持传入$product对象,直接用它获取产品信息,避免重复查询。 - 增加空值判断:仅当自定义消息存在时才执行替换,避免出现空内容或无效替换。
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

