如何在 WooCommerce 中正确按商品分类查询产品

5次阅读

如何在 WooCommerce 中正确按商品分类查询产品

本文详解为何 `wp_query` 的 `category_name` 参数无法用于 woocommerce 商品分类,以及如何通过 `tax_query` 正确筛选指定 `product_cat` 分类下的商品,并提供可直接复用的短代码实现与关键注意事项。

WooCommerce 的商品(product)并不使用 WordPress 默认的 category 分类法(taxonomy),而是自定义了独立的分类体系 product_cat。因此,直接使用 ‘category_name’ => ‘gry’ 这类面向文章分类(category)的参数,在查询商品时完全无效——这正是你遇到“无结果返回”且 get_the_category() 返回空数组的根本原因:get_the_category() 仅适用于 post 类型,对 product 不适用。

要精准按商品分类查询,必须使用 tax_query 显式指定 taxonomy => ‘product_cat’。以下是修正后的短代码完整实现(已优化性能、安全性与可维护性):

function test_short($attr) {     $atts = shortcode_atts(array(         'cat' => 'gry', // 支持传入单个分类名,如 [test_short cat="gry"]     ), $attr);      $args = array(         'post_type'      => 'product',         'post_status'    => 'publish',         'posts_per_page' => -1,         'tax_query'      => array(             array(                 'taxonomy' => 'product_cat',                 'field'    => 'slug', // 推荐用 slug 而非 name,更稳定(避免多语言/特殊字符问题)                 'terms'    => $atts['cat'],             ),         ),         'suppress_filters' => true,     );      $wc_query = new WP_Query($args);     $content  = '';      // 引入 Swiper js(建议移至 enqueue_scripts,此处为兼容演示)     $content .= '';      $content .= '
'; if ($wc_query->have_posts()) { while ($wc_query->have_posts()) { $wc_query->the_post(); $id = get_the_ID(); $title = get_the_title(); $price = wc_get_price_html(); // 更安全:自动处理价格格式与促销价 $url = wp_get_attachment_image_url(get_post_thumbnail_id($id), 'woocommerce_thumbnail') ?: wc_placeholder_img_src(); $content .= '
'; $content .= '@@##@@'; $content .= '
' . esc_html($title) . '
'; $content .= '
' . $price . '
'; $content .= ' ' . esc_html__('Add to cart', 'woocommerce') . ' '; $content .= '
'; } } else { $content .= '

' . esc_html__('No products found in this category.', 'woocommerce') . '

'; } $content .= '
'; // 初始化 Swiper(注意:需确保 DOM 已就绪,建议用 document.addEventListener('DOMContentLoaded', ...) 包裹) $content .= ''; wp_reset_postdata(); // ✅ 关键!替代已废弃的 wp_reset_query() return $content; } add_shortcode('test_short', 'test_short');

关键注意事项:

  • 始终用 wp_reset_postdata():WP_Query 后必须调用此函数恢复主循环全局变量,wp_reset_query() 仅适用于 query_posts()(已不推荐)。
  • 优先使用 slug 而非 name:分类别名(slug)唯一且稳定;中文或带空格的分类名在 name 模式下易出错。可通过后台 URL 或数据库确认 slug(如 gry 对应 gry,而非 Gry)。
  • 验证分类是否存在:调试时可临时添加 var_dump(get_terms([‘taxonomy’ => ‘product_cat’, ‘slug’ => $atts[‘cat’]])); 确认分类有效。
  • ⚠️ 避免内联脚本风险:file_get_contents(get_site_url().’/javascript.js‘) 存在路径错误与安全风险,应改用 wp_enqueue_script() 注册并加载 JS。
  • ? 输出内容务必转义:所有动态插入的 HTML 属性(如 src, href, alt)均使用 esc_url() / esc_html() 防止 xss

通过以上修正,你的短代码即可稳定按 WooCommerce 商品分类拉取数据,并与 Swiper 无缝集成。

如何在 WooCommerce 中正确按商品分类查询产品

text=ZqhQzanResources