
本文介绍如何在 WooCommerce 的 woocommerce_thankyou 钩子中,安全、高效地隐藏特定 ID 的产品分类,避免其在订单感谢页上输出,通过 get_categories() 的 exclude 参数实现精准过滤。
本文介绍如何在 woocommerce 的 `woocommerce_thankyou` 钩子中,安全、高效地隐藏特定 id 的产品分类,避免其在订单感谢页上输出,通过 `get_categories()` 的 `exclude` 参数实现精准过滤。
在 WooCommerce 订单完成后的感谢页(Thank You 页面)中,常需动态展示客户所购商品所属的分类,以增强营销或引导复购。但默认使用 $product->get_categories() 会返回全部分类链接(HTML 格式),而实际业务中往往需要屏蔽某些内部分类(如“测试分类”“批发专用”或“未公开类目”),防止其暴露给终端用户。
原代码中直接调用 $product->get_categories() 无参数,因此无法控制输出范围。幸运的是,WooCommerce 的 WC_Product::get_categories() 方法底层基于 WordPress 的 wp_get_post_terms(),并支持传递与 WP_Term_Query 兼容的参数数组——其中 exclude 是关键选项,用于按分类 ID 排除指定项。
✅ 正确做法是:将 exclude 参数作为关联数组传入 get_categories(),值为待隐藏分类的整数 ID 数组(支持单个或多个 ID):
add_action( 'woocommerce_thankyou', 'show_product_category', 10, 1 );
function show_product_category( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$items = $order->get_items();
foreach ( $items as $item ) {
$product = $item->get_product();
if ( ! $product ) {
continue;
}
// 排除分类 ID 为 10 和 25 的类别(请根据后台实际 ID 修改)
$categories = $product->get_categories( array(
'exclude' => array( 10, 25 )
) );
// 安全输出:仅当有可见分类时才渲染
if ( ! empty( $categories ) ) {
echo '<div class="order-categories"><strong>购买品类:</strong>' . $categories . '</div>';
}
}
}⚠️ 注意事项:
- 分类 ID 可在 WordPress 后台「产品 → 分类」列表中,将鼠标悬停于分类名称上,观察浏览器状态栏 URL 中的 tag_ID= 后数字,或使用插件(如 WP Term List)快速查看;
- exclude 值必须为整数数组(如 array(10, 25)),不可传字符串如 '10,25' —— 尽管部分旧文档提及逗号分隔格式,但在当前 WooCommerce(≥7.0)及 WordPress(≥6.0)中已不推荐且可能失效;
- 若需排除大量分类或基于条件动态排除(如排除所有隐藏分类),建议改用 wp_get_post_terms() 手动查询 + array_filter(),以获得更高灵活性;
- 始终检查 $product 和 $order 对象是否存在,避免在订单数据异常时触发 PHP 警告。
? 小结:get_categories( array( 'exclude' => [ ... ] ) ) 是最简洁、原生、低侵入的解决方案。它不修改数据库、不影响其他页面逻辑,仅在感谢页上下文中按需过滤输出,符合 WordPress 最佳实践与 WooCommerce 扩展规范。










