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

如何根据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' );
}

问题根源

  1. 标签ID获取方式错误:WooCommerce产品标签不能直接通过$product->tag_ids访问,正确方法是调用$product->get_tag_ids(),直接访问属性可能返回空数组或无效值。
  2. 循环变量被覆盖:原代码遍历标签时,每次循环都会将$product_tag替换为最后一个标签的名称,只要最后一个标签不是目标标签,就无法匹配。
  3. 未处理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转义字符,将&lt;/&quot;改为正常HTML标签,同时修复target="blank"为标准的target="_blank"。
  • 修正is_downloadable('yes')的错误用法,该方法默认返回布尔值,无需传参。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:39:46