Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何按特定顺序对get_terms()结果进行排序_Arrays_Wordpress_Sorting - Fatal编程技术网

Arrays 如何按特定顺序对get_terms()结果进行排序

Arrays 如何按特定顺序对get_terms()结果进行排序,arrays,wordpress,sorting,Arrays,Wordpress,Sorting,我正在通过分配给变量的get_terms()的结果填充无序列表。我想做的是将结果按无序列表中的特定顺序排序。我该怎么做?我曾研究过在get_terms()函数中使用orderby参数,但没有一个参数像我需要的那样工作。我如何定义它们显示的特定顺序?基本上,我的无序列表在填充后如下所示: 亚特兰蒂斯 社区 公司的 保健 高等教育 k-12 我希望它看起来像这样: k-12 高等教育 保健 亚特兰蒂斯 公司的 社区 最好的选择是为get\u terms编写一个包装函数,然后使用usort()按

我正在通过分配给变量的get_terms()的结果填充无序列表。我想做的是将结果按无序列表中的特定顺序排序。我该怎么做?我曾研究过在get_terms()函数中使用orderby参数,但没有一个参数像我需要的那样工作。我如何定义它们显示的特定顺序?基本上,我的无序列表在填充后如下所示:
  • 亚特兰蒂斯
  • 社区
  • 公司的
  • 保健
  • 高等教育
  • k-12
我希望它看起来像这样:
  • k-12
  • 高等教育
  • 保健
  • 亚特兰蒂斯
  • 公司的
  • 社区

最好的选择是为
get\u terms
编写一个包装函数,然后使用
usort()
按您想要的顺序对术语进行排序

下面是代码,我对代码进行了注释,使其易于理解和理解(注意:此代码需要PHP5.4+)

该函数有四个参数

  • $taxonomy
    这是从中获取术语的分类法。默认值:空字符串

  • $args
    这是可以传递给
    get\u terms
    的所有有效参数。你可以退房。默认值:空数组

  • $term\u order
    术语的slug或名称或ID,按您希望的特定顺序排序。这可以是一个slug/names/id数组,也可以是一个以逗号分隔的slug/names/id字符串。默认空字符串

    例子

    string: $term_order = 'term-3, term-1, term-2';
    array:  $term_order = ['term-3', 'term-1', 'term-2'];
    
    这将按照术语3、术语1、术语2的顺序显示术语

  • $sort_by
    术语必须按哪个字段排序。默认值是slug,这意味着您应该将字符串或术语slug数组传递给
    $term\u order
    参数。如果需要将术语名称传递给
    $term\u order
    参数,则需要将
    $sort\u by
    的值设置为
    name
    。如果愿意,您还可以将术语id传递给
    $term\u order
    ,在这种情况下,您需要将
    $sort\u by
    值设置为
    术语id

用法 在您的模板中,您将使用以下函数和以下示例

分类名称为
category
,我们不想设置任何特定参数,我们需要按名称按以下顺序对术语进行排序
术语C、术语A、术语B

然后您将执行以下操作:(
$term\u order
作为数组)

$term\u order
作为字符串)


我在设置客户想要的顺序时发现的一个问题是,客户稍后会想要重新排序列表,因此允许所需顺序的另一种方法以及稍后在不调整代码的情况下更改该顺序的能力如下:

  • 为分类术语创建自定义字段。一个很好的方法是使用高级自定义字段插件,使该字段在仪表板中可编辑
  • 为该自定义字段指定默认值“0”
  • 使用
    get_terms()
    函数并在数组中包含以下设置。在本例中,
    jht\u order
    是自定义字段的名称
  • 现在,术语将按此字段的值排序。注意:如果术语没有填充此字段,则
    get\u terms()

    更新:如果自定义字段是一个数字,您需要将“orderby”更改为“meta_value_num”,以便它将其排序为数字而不是ascii

               'orderby'  =>  'meta_value_num'
    

    您想要订购的基础是什么?@MikeBrant client Request我的意思是他们订购的逻辑是什么?它们不是按字母顺序排列的,也不是我能分辨出来的任何其他逻辑排序方式。如果您正在寻找硬编码的订单,而不是程序化的订单方式,那么您必须对其进行硬编码。@MikeBrant yes。顺序没有逻辑,这正是他们想要的。这就是为什么我很难找到解决办法。问题是,我的无序列表是由get_terms()的结果动态填充的,因此我不确定如何硬编码顺序?您必须构建一个自定义排序函数,以根据已知的术语对列表进行排序(如果检索到任何您没有硬编码规则的术语,可能它们会排序到最后)。或者,您可以手动将id更改为首选的排序顺序和按id排序。这应该是可接受的答案,并且有大量的投票,令人惊讶的答案。
    $terms = get_terms_ordered( 'category', [], ['Term C', 'Term A', 'Term B'], 'name');
    var_dump( $terms);
    
    $terms = get_terms_ordered( 'category', [], 'Term C, Term A, Term B', 'name');
    var_dump( $terms);
    
                'orderby'  => 'meta_value',
                'meta_key' => 'jht_order',
    
               'orderby'  =>  'meta_value_num'