工作日作为术语-如何在管理面板中按ID对分类术语进行排序?

时间:2015-09-09 作者:Foolish Coder

我使用以下代码创建了一个自定义分类法。

add_action( \'init\', \'schedule_day_tax_func\' );
function schedule_day_tax_func() {
    register_taxonomy(
        \'schedule_day_taxonomy\',
        \'schedule\',
        array(
            \'hierarchical\' => true,
            \'label\' => \'Day\',
            \'query_var\' => true,
            \'orderby\'  => \'ID\', 
        )
    );
}
在我从管理面板添加了一些术语后,术语显示在alphabetical管理面板中的订单。

img

我想把它们整理一下ID 或通过entered 顺序我该怎么做?

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

方法#1-如果要修改schedule_day_taxonomy 术语清单,单列schedule cpt编辑屏幕,然后我们可以使用以下设置:

add_action( \'load-post.php\', function()
{
    add_filter( \'wp_terms_checklist_args\', \'wpse_terms_checklist_args\' );
} );

function wpse_terms_checklist_args( $args )
{         
    // Target the \'schedule\' custom post type edit screen
    if( \'schedule\' === get_current_screen()->id )
        add_filter( \'get_terms_args\', \'wpse_terms_args\', 10, 2 );
    return $args;
}

function wpse_terms_args( $args, $taxonomies )
{
    // Target the \'all\' tab in the \'schedule_day_taxonomy\' terms check list 
    if(
           isset( $args[\'get\'] )
        && \'all\' === $args[\'get\']
        &&  isset( $taxonomies[0] )
        && \'schedule_day_taxonomy\' === $taxonomies[0]
    ) {
        // Modify the term order
        $args[\'orderby\'] = \'ID\';  // <-- Adjust this to your needs!
        $args[\'order\']   = \'ASC\'; // <-- Adjust this to your needs!

        // House cleaning - Remove the filter callbacks
        remove_filter( current_filter(), __FUNCTION__ );        
        remove_filter( \'wp_terms_checklist_args\', \'wpse_terms_checklist_args\' );
    }
    return $args;
}
另一种可能性是将其合并为一个get_terms_args 筛选器回调。

获取次日订单:

Sun, Mon, Tue, Wed, Thu, Fri, Sat
我们可以修改相应的术语slug并使用:

// Modify the term order
$args[\'orderby\'] = \'slug\';  
$args[\'order\']   = \'ASC\'; 
方法2-对查询结果重新排序如果我们不想修改slug,那么这里有另一种方法。

我们可以按照与本地化的工作日相同的顺序重新排序生成的术语数组。

add_filter( \'wp_terms_checklist_args\', function( $args )
{         
    add_filter( \'get_terms\', \'wpse_get_terms\', 10, 3 );
    return $args;
} );

function wpse_get_terms( $terms, $taxonomies, $args )
{
    if(     isset( $taxonomies[0] )
        && \'schedule_day_taxonomy\' === $taxonomies[0]
        && \'schedule\' === get_current_screen()->id
    ) {
        $newterms = [];
        foreach( (array) $GLOBALS[\'wp_locale\']->weekday as $day )
        {
            foreach( (array) $terms as $term )
            {
                if( $term->name === $day )
                    $newterms[] = $term;
            }
        }
        remove_filter( current_filter(), __FUNCTION__ );
        if( 7 === count( $newterms ) )
            $terms = $newterms;
    }
    return $terms;
}
我们还可以替换

$GLOBALS[\'wp_locale\']->weekday
使用自定义工作日数组,按自定义方式排序。

以下是英文版:

English

这是冰岛语版本:

Icelandic

方法#3-自定义SQL排序

我们可以使用get_terms_orderby 过滤器,带有CASE/WHEN/THEN 设置。

希望您可以根据自己的需要进行调整。

SO网友:Lucas Gabriel

我在以下链接找到了解决方案:https://core.trac.wordpress.org/ticket/34996

public function pre_get_terms( $query ) {
  $meta_query_args = array(
    \'relation\' => \'AND\', // Optional, defaults to "AND"
    array(
        \'key\'     => \'order_index\',
        \'value\'   => 0,
        \'compare\' => \'>=\'
    )
  );
  $meta_query = new WP_Meta_Query( $meta_query_args );
  $query->meta_query = $meta_query;
  $query->orderby = \'position_clause\';
}
答案是@eherman24的评论。你所需要做的就是添加一个动作pre_get_terms 然后使用上述功能。

相关推荐

WooCommerce:如何在Order元数据对象中获得具有自定义ID的订单?

因为一个项目,我需要你的帮助。我找了很多,但找不到解决办法。我正在尝试编辑一个名为woocommerce\\u account\\u订单我已经添加了该字段mycustom\\u id到订单元数据对象,因为我需要在字段mycustom\\u id中获取当前登录用户的所有订单:(mycustom\\u id=current\\u user\\u id())检查customer 应该留下来。我只需要再加上这个current_user_id 检查这应该保持原样:\'客户\'=>获取当前用户id()。这是我的