如何对get_terms()进行排序导致特定的顺序

时间:2015-07-02 16:38:21

标签: arrays wordpress sorting

我通过分配给变量的get_terms()的结果填充无序列表。我想要做的是在无序列表中按特定顺序排序结果。我该怎么做?我研究了使用orderby参数来获取get_terms()函数,但是没有任何参数可以像我需要的那样工作。如何定义要显示的特定订单?所以基本上我的无序列表看起来像这样一次填充:     

        
  • Atletics
  •     
  • 社区
  •     
  • 公司
  • 医疗保健
  • 高等教育
  • K-12
我希望它看起来像这样:    
        
  • K-12
  •     
  • 高等教育
  •     
  • 医疗
  • atletics
  • 公司
  • 社区

2 个答案:

答案 0 :(得分:3)

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

以下是代码,我已对代码进行了评论,以便于理解( 注意: 此代码需要PHP 5.4 +

function get_terms_ordered( $taxonomy = '', $args = [], $term_order = '', $sort_by = 'slug' )
{
    // Check if we have a taxonomy set and if the taxonomy is valid. Return false on failure
    if ( !$taxonomy )
        return false;

    if ( !taxonomy_exists( $taxonomy ) )
        return false;

    // Get our terms    
    $terms = get_terms( $taxonomy, $args ); 

    // Check if we have terms to display. If not, return false
    if ( empty( $terms ) || is_wp_error( $terms ) )
        return false;

    /** 
     * We have made it to here, lets continue to output our terms
     * Lets first check if we have a custom sort order. If not, return our
     * object of terms as is
     */
    if ( !$term_order )
        return $terms;

    // Check if $term_order is an array, if not, convert the string to an array
    if ( !is_array( $term_order ) ) {
        // Remove white spaces before and after the comma and convert string to an array
        $no_whitespaces = preg_replace( '/\s*,\s*/', ',', filter_var( $term_order, FILTER_SANITIZE_STRING ) );
        $term_order = explode( ',', $no_whitespaces );
    }

    // Remove the set of terms from the $terms array so we can move them to the front in our custom order
 $array_a = [];
 $array_b = [];
    foreach ( $terms as $term ) {
        if ( in_array( $term->$sort_by, $term_order ) ) {
            $array_a[] = $term;
        } else {
            $array_b[] = $term;
        }
    }

    /**
     * If we have a custom term order, lets sort our array of terms
     * $term_order can be a comma separated string of slugs or names or an array
     */
    usort( $array_a, function ( $a, $b ) use( $term_order, $sort_by )
    {
        // Flip the array
        $term_order = array_flip( $term_order );

        return $term_order[$a->$sort_by] - $term_order[$b->$sort_by];
    });

    return array_merge( $array_a, $array_b );
}   

该功能有四个参数

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

  • $args这是可以传递给get_terms的所有有效参数。你可以看看get_terms for valid arguments。默认值:空数组

  • $term_order您希望它们排序的特定顺序中的条款或名称或ID。这可以是一系列slu / / names / id或逗号分隔的slu / / names / id字符串。默认空字符串

    实施例

    string: $term_order = 'term-3, term-1, term-2';
    array:  $term_order = ['term-3', 'term-1', 'term-2'];
    

    这将按term-3, term-1, term-2

  • 的顺序显示这些字词
  • $sort_by必须对哪个字段进行排序。默认值为slugs,因此这意味着您应该将一个字符串或一组术语slug传递给$term_order参数。如果您需要将术语名称传递给$term_order参数,则需要将$sort_by的值设置为name。如果您愿意,您也可以将术语ID传递给$term_order,在这种情况下,您需要将$sort_by值设置为term_id

USAGE

在您的模板中,您将使用以下示例

的功能

分类标准名称为category,我们不想设置任何特定参数,我们需要按照以下顺序按名称对字词进行排序Term C, Term A, Term B

然后,您将执行以下操作:( $term_order作为数组

$terms = get_terms_ordered( 'category', [], ['Term C', 'Term A', 'Term B'], 'name');
var_dump( $terms);

$term_order为字符串

$terms = get_terms_ordered( 'category', [], 'Term C, Term A, Term B', 'name');
var_dump( $terms);

答案 1 :(得分:0)

我发现在设置客户端所需的顺序时遇到的一个问题是,客户端稍后将要对列表进行重新排序,因此另一种允许所需顺序的能力以及以后无需更改代码即可进行更改的能力如下:

  1. 为分类术语创建一个自定义字段。一种很好的方法是使用“高级自定义字段”插件,该插件可在仪表板中对该字段进行编辑。
  2. 为该自定义字段提供默认值“ 0”。
  3. 使用get_terms()函数并在数组中包括以下设置。在此示例中,jht_order是自定义字段的名称。
            'orderby'  => 'meta_value',
            'meta_key' => 'jht_order',

现在,这些术语将按此字段的值排序。注意:如果未填充此字词,则get_terms()

不会返回该字词

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

           'orderby'  =>  'meta_value_num'