get_terms 忽略 WooCommerce 产品类别的 orderby 参数

get_terms ignores orderby argument on WooCommerce product categories

我使用了以下功能来列出产品类别并按名称排序。自从我上次将 WooCommerce 从 3.5.7 更新到 3.6.1 以来,这不再有效。

没关系,我写成orderby。我猜这些术语是按 id 排序的,与后端的顺序相同。

我以前遇到过这个问题,但后来我添加了 'menu_order' => false 并且成功了。但是自从更新后就什么都没有了。

$terms = get_terms( 'product_cat', array(
       'orderby'           => 'name', 
       'order'             => 'ASC',
       'parent' => 2063,
       'menu_order' => false,
       'suppress_filter' => false
   ) );

我也试过换主题没成功。 欢迎任何帮助。

我使用 WordPress 版本 5.1.1 和 Storefront 主题版本 2.4.5。

Update 2 - Solved

After I reported this issue on Github WooCommerce, it was clearly a bug affecting orderby argument when calling get_terms() function. It's now approved and patched.

The issue is solved on Woocommerce update 3.6.2


首先,自 WordPress 4.5 以来,分类法应通过 get_terms() 函数参数数组中的“分类法”参数传递。

您不能使用'menu_order''suppress_filter'参数,因为它们未定义用于WP_Term_Query Class。您将使用 'orderby' => 'order',.

而不是 'menu_order'

现在 WordPress get_terms() 函数的 允许参数 列在 WP_Term_Query __construct() .

所以你可以使用 "orderby" 参数:

  • 默认值设置为name
  • 接受术语字段(nameslugterm_groupterm_ididdescriptionparent ), count 用于术语分类计数,include 匹配 $include 参数的 orderslug__in 匹配 $slug 参数的 ordermeta_valuemeta_value_num、$meta_key 的值、$meta_query 的数组键,或 none 省略 ORDER BY 子句。

所以你的代码应该是这样的:

$terms = get_terms( array(
    'taxonomy' => 'product_cat',
    // 'orderby'  => 'name', // <=== Default orderby is already 'name'
    'order'    => 'ASC',
    'parent'   => 2063,
) );

测试和