我通过分配给变量的get_terms()的结果填充无序列表。我想要做的是在无序列表中按特定顺序排序结果。我该怎么做?我研究了使用orderby参数来获取get_terms()函数,但是没有任何参数可以像我需要的那样工作。如何定义要显示的特定订单?所以基本上我的无序列表看起来像这样一次填充:
答案 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
在您的模板中,您将使用以下示例
的功能分类标准名称为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)
我发现在设置客户端所需的顺序时遇到的一个问题是,客户端稍后将要对列表进行重新排序,因此另一种允许所需顺序的能力以及以后无需更改代码即可进行更改的能力如下:
get_terms()
函数并在数组中包括以下设置。在此示例中,jht_order
是自定义字段的名称。 'orderby' => 'meta_value',
'meta_key' => 'jht_order',
现在,这些术语将按此字段的值排序。注意:如果未填充此字词,则get_terms()
更新:如果自定义字段是数字,则需要将“ orderby”更改为“ meta_value_num”,以便它将其按数字而不是ascii排序。
'orderby' => 'meta_value_num'