ORDER BY表字段COMMENT_STATUS在WordPress>4.0中

时间:2016-11-02 作者:Janiis

有人能帮我在WP admin中按WP\\u Posts表字段(如comment\\u status)对帖子列表进行排序吗。

我知道,我们可以很容易地按元字段键排序,但找不到任何方法来按wp\\u posts表实际字段排序。

如果我们深入研究WP查询的源代码,就会发现只允许使用以下类型的键-

    $allowed_keys = array( \'name\', \'author\', \'date\', \'title\', \'modified\', \'menu_order\', \'parent\', \'ID\', \'rand\', \'comment_count\', \'type\' );

https://github.com/WordPress/WordPress/blob/9d123aa326a908ff8ed6170e0fea5d85a4b1619f/wp-includes/query.php#L2719

有没有办法覆盖它们?

这是我可以按meta\\u键排序的方式,但我需要按实际表字段排序。

add_filter(\'manage_edit-post_sortable_columns\', \'jepc_add_comments_column_table_sorting\');
add_filter(\'request\', \'jepc_column_sort\');

function jepc_add_comments_column_table_sorting($columns) {
  $columns[\'comment_status\'] = \'comment_status\';
  return $columns;
}

function jepc_column_sort($vars) {
  if (isset( $vars[\'orderby\']) && \'comment_status\' == $vars[\'orderby\']) {
    $vars = array_merge( $vars, array(
        \'meta_key\' => \'comment_status\',
        \'orderby\' => \'meta_value\'
    ));
}

return $vars;
}
谢谢。

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

有一种方法可以将额外的评论状态字段添加到帖子列表中:

add_filter(\'manage_post_posts_columns\', function ( $columns ) 
{
    $_columns = [];

    foreach( (array) $columns as $key => $label )
    {
        $_columns[$key] = $label; 
        if( \'title\' === $key )
            $_columns[\'wpse_comment_status\'] = esc_html__( \'Comment Status\', \'mydomain\' );
    }
    return $_columns;
} );

add_action( \'manage_post_posts_custom_column\', function ( $column_name, $post_id ) 
{
    if ( $column_name == \'wpse_comment_status\')
       echo get_post_field( \'comment_status\', $post_id );    

}, 10, 2 );
下面是我们如何通过posts_orderby 过滤器:

add_filter( \'manage_edit-post_sortable_columns\', function ( $columns ) 
{
  $columns[\'wpse_comment_status\'] = \'comment_status\';
  return $columns;
} );

add_filter( \'posts_orderby\', function( $orderby, \\WP_Query $q ) use ( &$wpdb )
{   
    $_orderby = $q->get( \'orderby\' );
    $_order   = $q->get( \'order\' );

    if( 
           is_admin() 
        && $q->is_main_query() 
        && did_action( \'load-edit.php\' )
        && \'comment_status\' === $_orderby 
    )
        $orderby = " {$wpdb->posts}.comment_status " 
            . ( \'ASC\' === strtoupper( $_order ) ? \'ASC\' : \'DESC\' )
            . ", {$wpdb->posts}.ID DESC ";

    return $orderby;
}, 10, 2 );
在这里,我们通过post ID进行分订单。

以下是一个示例输出:

status

PS:自WordPress 4.5以来(#35601) 可以过滤WP_Query 通过comment_statusping_status, 因此,您也应该能够为posts列表表实现这样的过滤

SO网友:Janiis

令人惊叹的我修改了代码以满足我的要求。

// Sort columns by WP_posts table fields - comment_status and ping_status
add_filter( \'posts_orderby\', function( $orderby, \\WP_Query $q ) use ( &$wpdb ) {

    $_orderby = $q->get( \'orderby\' );
    $_order   = $q->get( \'order\' );

    if ($_orderby != \'comment_status\' && $_orderby != \'ping_status\') {
        return $orderby;
    }

    if( $q->is_main_query() && did_action(\'load-edit.php\')) {
        $orderby = " {$wpdb->posts}.{$_orderby} "
            . ( \'ASC\' === strtoupper( $_order ) ? \'ASC\' : \'DESC\' )
            . ", {$wpdb->posts}.ID DESC ";
    }

    return $orderby;

}, 10, 2);
对于那些希望在旧版本的PHP中使用代码的人。

add_filter( \'posts_orderby\', \'jepc_comment_status_column_sort\', 10, 2);

function jepc_comment_status_column_sort($orderby, \\WP_Query $q) {

    global $wpdb;

    $_orderby = $q->get( \'orderby\' );
    $_order   = $q->get( \'order\' );

    if ($_orderby != \'comment_status\' && $_orderby != \'ping_status\') {
        return $orderby;
    }

    if( $q->is_main_query() && did_action(\'load-edit.php\')) {
        $orderby = " {$wpdb->posts}.{$_orderby} "
            . ( \'ASC\' === strtoupper( $_order ) ? \'ASC\' : \'DESC\' )
            . ", {$wpdb->posts}.ID DESC ";
    }

    return $orderby;

}
谢谢,你真棒!

相关推荐

Orderby定制字段不起作用

此代码是按管理页面中的ACF字段排序的。它实际上按自定义字段过滤,但不按顺序排序。字段中的数据是字符串而不是数字,因此我认为orderby meta\\u值是正确的。我确保这个键不是空的,我尝试了所有这些术语(desc、desc、asc、asc)$query->query_vars[\'order\'] function my_author_filter_results($query){ global $pagenow; if ( $pagenow === \