更改WordPress标签云的顺序

时间:2016-11-29 作者:Richard Tinkler

我发现以下函数可以更改Wordpress标记云的行为:

function widget_custom_tag_cloud($args) {

    $args[\'orderby\'] = \'count\';
    return $args;
}
add_filter( \'widget_tag_cloud_args\', \'widget_custom_tag_cloud\' );
但是,我需要将顺序从“count”更改为“menu\\u order”。更改此行:

$args[\'orderby\'] = \'count\';

$args[\'orderby\'] = \'menu_order\';
不起作用。

是否有可能做到这一点,或者我是否需要从头开始编写一个自定义小部件?

提前感谢您的帮助!

2 个回复
最合适的回答,由SO网友:Dan. 整理而成

标记(术语)没有menu_order (见DB中表格的设计)。

如果你想给术语一个“menu\\u顺序”,你需要自己创建这个。

只要WP>=4.4.0,就可以使用该功能term_meta.

这就好比post meta对post一样。

您可以为术语创建“菜单顺序”“自定义字段”,然后可以在创建/编辑术语时设置菜单顺序。

相关功能包括:

add_term_meta();

update_term_meta();

get_term_meta();

delete_term_meta();
请参见此处-https://codex.wordpress.org/Function_Reference/add_term_meta

当查询时,您的代码不会对术语meta起作用。您需要编写自己的小部件,其中包含get_terms(). E、 g。

$args = array(
    \'taxonomy\'   => \'taxonomy_name\', //can be array with multiple tax
    \'meta_key\' => \'menu_order\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'DESC\',
);

$terms = get_terms($args);
要在“管理”面板中构建UI;保存用于添加/编辑术语元的函数,我认为对于SO/SE答案来说,这个过程有点长。

如果你在谷歌上搜索“wp-term-meta”,你就会知道怎么做。

您总共需要4或5个函数。

您将使用的挂钩有:

{$taxonomy}_add_form_fields // add the custom field to the \'new term\' form

{$taxonomy}_edit_form_fields // add the custom field to the \'edit term\' form

create_{$taxonomy} // for saving the term meta from the \'new term\' form

edit_{$taxonomy} // for saving the term meta from the \'edit term\' form

manage_edit-{$taxonomy}_columns // OPTIONAL adds a column, for the custom field, in the terms table for the taxonomy
或者,使用如下插件this one (或复制其中的代码)。

SO网友:birgire

如果你是说term_order, 然后你可以使用tag_cloud_sort 过滤器通过PHP处理排序。

下面是一个示例,使用usort:

add_filter( \'tag_cloud_sort\', function( $tags, $args )
{
    // Nothing to do if no tags
    if( empty( $tags ) || ! is_array( $tags ) )
        return $tags;

    // Custom tag sort
    uasort( $tags, function( $a, $b )
    {
        if( $a->term_order === $b->term_order )
            return 0;

        return $a->term_order < $b->term_order ? - 1 : 1; // ASC
    } );

    return $tags;
}, 10, 2 );
在PHP 7中,可以使用spaceship 比较运算符:

add_filter( \'tag_cloud_sort\', function( $tags, $args )
{
    // Nothing to do if no tags
    if( empty( $tags ) || ! is_array( $tags ) )
        return $tags;

    // Custom tag sort
    usort( $tags, function( $a, $b )
    {
        return $a->term_order <=> $b->term_order; // ASC (swap $a and $b for DESC)
    } );

    return $tags;
}, 10, 2 );
Thewp_generate_tag_cloud() 函数使用uasort(), 但我认为我们不需要在这里保留索引关联。

PS:

这个wp_cloud_tag() 函数使用get_terms(), 因此,另一种选择可能是支持term_order 在中订购get_terms() 通过get_terms_orderby 滤器参见例如最近的answer 在这里我刚刚测试了term_order 使用OP在回答的问题中提到的插件进行排序。