如何根据WooCommerce产品标签数组中的特定标签显示对应内容?
问题:WooCommerce可下载产品多标签下无法匹配对应内容显示
我写了个函数用来替换加入购物车按钮,给可下载产品添加特定内容。可下载产品分为两类:Free Samples(免费样品)和Activity Recipes(活动食谱),用这两个关键词作为产品标签来区分类型。但现在产品添加多个标签时,代码识别不出目标标签,无法显示对应内容。
打印$product_tag的值为null,说明$product_tag = get_term($tag)->name;存在问题,但我不确定具体原因,也无法确认是否是此处导致的问题。
我需要解决的问题是:如何根据可下载产品标签数组中的特定标签,显示对应的内容?
原代码
global $product; if ( $product->is_downloadable('yes') ) { if ( $product->get_price() > 0 ) { do_action( 'woocommerce_' . $product->get_type() . '_add_to_cart' ); } else { $downloads = $product->get_downloads(); $tags = $product->tag_ids; foreach($tags as $tag) { $product_tag = get_term($tag)->name; } foreach( $downloads as $key => $download ) { if ($product_tag == 'Activity Recipes') { echo ' <h4>Step 1</h4> <a href="' . esc_url( $download['file'] ) . '" target="blank" class="btn btn-secondary ">Download FREE template</a> <hr /> <h4>Step 2 (Optional)</h4> <p>Choose your products below as needed to help bring the activity to life:</p> <a class="btn btn-secondary" href="#details">Choose products</a> '; } else if ($product_tag == 'Free Samples') { echo '<p class="download-link"><a href="' . esc_url( $download['file'] ) . '" target="blank" class="btn btn-secondary ">Download FREE ' . $download['name'] . '</a></p>'; } } } } else { do_action( 'woocommerce_' . $product->get_type() . '_add_to_cart' ); }
问题根源
- 标签ID获取方式错误:WooCommerce产品标签不能直接通过
$product->tag_ids访问,正确方法是调用$product->get_tag_ids(),直接访问属性可能返回空数组或无效值。 - 循环变量被覆盖:原代码遍历标签时,每次循环都会将
$product_tag替换为最后一个标签的名称,只要最后一个标签不是目标标签,就无法匹配。 - 未处理
get_term错误:如果标签ID无效,get_term()会返回WP_Error对象,直接取->name会导致返回null或报错。
修复后的代码
global $product; if ( $product->is_downloadable() ) { // is_downloadable默认返回布尔值,无需传参 if ( $product->get_price() > 0 ) { do_action( 'woocommerce_' . $product->get_type() . '_add_to_cart' ); } else { $downloads = $product->get_downloads(); $tag_ids = $product->get_tag_ids(); // 正确获取产品标签ID数组 $has_activity_recipes = false; $has_free_samples = false; // 遍历标签,标记是否包含目标标签 foreach($tag_ids as $tag_id) { $term = get_term($tag_id, 'product_tag'); // 指定分类法为product_tag if ( !is_wp_error($term) ) { if ( $term->name === 'Activity Recipes' ) { $has_activity_recipes = true; } elseif ( $term->name === 'Free Samples' ) { $has_free_samples = true; } } } foreach( $downloads as $key => $download ) { // 优先匹配Activity Recipes,避免多标签冲突 if ( $has_activity_recipes ) { echo ' <h4>Step 1</h4> <a href="' . esc_url( $download['file'] ) . '" target="_blank" class="btn btn-secondary ">Download FREE template</a> <hr /> <h4>Step 2 (Optional)</h4> <p>Choose your products below as needed to help bring the activity to life:</p> <a class="btn btn-secondary" href="#details">Choose products</a> '; } elseif ( $has_free_samples ) { echo '<p class="download-link"><a href="' . esc_url( $download['file'] ) . '" target="_blank" class="btn btn-secondary ">Download FREE ' . $download['name'] . '</a></p>'; } } } } else { do_action( 'woocommerce_' . $product->get_type() . '_add_to_cart' ); }
关键修改说明
- 替换
$product->tag_ids为$product->get_tag_ids(),确保获取有效标签ID数组。 - 新增布尔变量标记产品是否包含目标标签,避免循环覆盖问题。
- 调用
get_term()时指定分类法product_tag,并用is_wp_error()处理错误情况。 - 修正HTML转义字符,将
</"改为正常HTML标签,同时修复target="blank"为标准的target="_blank"。 - 修正
is_downloadable('yes')的错误用法,该方法默认返回布尔值,无需传参。
内容的提问来源于stack exchange,提问作者Amesey
相关产品推荐
相关产品推荐

