如何在WooCommerce订单复核表格中显示商品标签
问题分析与解决方案
你的代码之所以总是返回“not exists animal”,核心问题是你获取的是全站所有商品标签,而不是当前购物车商品的标签,而且判断逻辑也存在漏洞。下面一步步帮你解决:
一、先修复当前模板文件的问题
你原来的代码里用get_terms( 'product_tag' )拿到的是网站所有商品标签的集合,不是当前商品的标签,所以判断in_array('bird', $term_array)自然不会匹配到当前商品的标签。应该改成获取当前商品的标签:
替换你标签列的代码为:
<td> <?php // 获取当前商品的所有标签,直接返回标签名称数组 $product_tags = wp_get_post_terms( $_product->get_id(), 'product_tag', array( 'fields' => 'names' ) ); if ( ! empty( $product_tags ) ) { // 用逗号分隔输出所有标签 echo esc_html( implode( ', ', $product_tags ) ); } else { echo esc_html( 'not exists animal' ); } ?> </td>
如果只想针对bird/dog标签做特定显示,可以调整逻辑:
<td> <?php $product_tags = wp_get_post_terms( $_product->get_id(), 'product_tag', array( 'fields' => 'names' ) ); $display_tag = 'not exists animal'; // 优先判断bird,再判断dog if ( in_array( 'bird', $product_tags ) ) { $display_tag = 'Bird'; } elseif ( in_array( 'dog', $product_tags ) ) { $display_tag = 'Dog'; } // 若需要同时显示多个匹配标签,可改用数组收集后输出 echo esc_html( $display_tag ); ?> </td>
二、更优方案:用钩子在functions.php实现(无需修改模板)
直接修改模板文件不是最佳实践,WooCommerce提供了丰富的钩子,你可以在主题的functions.php(或者自定义插件)里添加代码,通过钩子注入标签,这样主题更新时不会丢失自定义内容:
方法1:在商品名称后追加标签
add_filter( 'woocommerce_checkout_cart_item_name', 'add_product_tags_to_review_order', 10, 3 ); function add_product_tags_to_review_order( $item_name, $cart_item, $cart_item_key ) { $_product = $cart_item['data']; $product_tags = wp_get_post_terms( $_product->get_id(), 'product_tag', array( 'fields' => 'names' ) ); if ( ! empty( $product_tags ) ) { // 把标签放在商品名称下方,用小字号区分显示 $item_name .= '<br><span style="font-size:0.8em;color:#666;">' . esc_html( implode( ', ', $product_tags ) ) . '</span>'; } else { $item_name .= '<br><span style="font-size:0.8em;color:#666;">not exists animal</span>'; } return $item_name; }
方法2:单独添加一列显示标签(保留独立列)
如果希望保留独立的标签列,你可以通过钩子添加表头和内容:
// 添加标签列表头 add_action( 'woocommerce_review_order_before_cart_contents', 'add_product_tag_column_header' ); function add_product_tag_column_header() { ?> <th><?php esc_html_e( 'Product Tags', 'your-text-domain' ); ?></th> <?php } // 添加标签列内容 add_action( 'woocommerce_review_order_after_cart_item_name', 'add_product_tag_column_content', 10, 2 ); function add_product_tag_column_content( $cart_item, $cart_item_key ) { $_product = $cart_item['data']; $product_tags = wp_get_post_terms( $_product->get_id(), 'product_tag', array( 'fields' => 'names' ) ); echo '<td>'; if ( ! empty( $product_tags ) ) { echo esc_html( implode( ', ', $product_tags ) ); } else { esc_html_e( 'not exists animal', 'your-text-domain' ); } echo '</td>'; }
注意:使用这种方法时,可能需要调整CSS样式来保证表格布局正常,避免列错位。
关键知识点总结
get_terms('product_tag'):获取全站所有商品标签,不是当前商品的标签集合wp_get_post_terms($product_id, 'product_tag'):获取指定商品的标签集合,建议用fields参数指定返回格式(比如names直接拿标签名)- 优先使用WooCommerce钩子代替修改模板,这是WordPress生态的最佳实践,能避免主题更新丢失自定义代码
内容的提问来源于stack exchange,提问作者Captain Krik
相关产品推荐
相关产品推荐

