使用Pre Get帖子添加多个Orderby

时间:2013-03-22 作者:Naveen Narale

我已经在使用一个小代码来设置默认的排序方式,一个名为“Year”的自定义字段。我需要添加另一个排序方式,以便在相同的排序中也按“Post Title”排序。

Sort = 年份自定义字段(DESC)和职位名称(ASC)

下面是我当前用于按年份DESC排序的代码。

add_filter(\'pre_get_posts\', \'sort_arc\');
function sort_arc($q) {
 if ($q->is_category) {
   $q->set(\'orderby\', \'meta_value_num\');
   $q->set(\'meta_key\', \'the-year\');
   $q->set(\'order\', \'DESC\');
 }
 return $q;
}
Thanx公司

------------------编辑---------------------------------

停止工作的代码,如下所述

add_action(\'pre_get_posts\', \'check_meta_sort\');
function check_meta_sort($query) {
if( $query->is_admin == 1 ) {
return;
    }
if( !$query->is_main_query() ) {
return;
}
if( !$query->is_archive == 1 ) {
return;
}
$custom_field = ( $_GET[\'sort\'] ) ? stripslashes( $_GET[\'sort\'] ) : \'\';
$custom_value = ( $_GET[\'sortorder\'] ) ? stripslashes( $_GET[\'sortorder\'] ) : \'\';
if( $custom_field ) {
$query->set( \'meta_key\', $custom_field );
$query->set( \'orderby\', $custom_field );
if( $custom_value ) {
$query->set( \'order\', $custom_value );
}
}
}

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

您可以尝试使用posts_orderby 过滤器:

add_filter(\'pre_get_posts\', \'sort_arc\');
function sort_arc($q) {
 if ($q->is_category() && $q->is_main_query()) {
    $q->set(\'meta_key\', \'the-year\');
    add_filter(\'posts_orderby\', \'custom_posts_orderby\');
 }
 return $q;
}
在哪里

function custom_posts_orderby($orderby) {
    global $wpdb;
    return $wpdb->postmeta.".meta_value+0 DESC, ".$wpdb->posts .".post_title ASC";
}
负责定制订单。我们使用meta_value+0meta_value_num 中的定义/wp-includes/query.php.

Update:

以下是一个如何尝试将两个挂钩组合在一起的想法:

add_filter(\'pre_get_posts\', \'custom_pre_get_posts\');
function custom_pre_get_posts($q) {
    if( $q->is_admin ) {
        return $q;
    }
    if( !$q->is_main_query() ) {
        //echo "DEBUG: !is_main_query() <pre>".print_r($q,true)."</pre>";
        return $q;
    }
    if( !$q->is_archive() ) {
        //echo "DEBUG: !is_archive() <pre>".print_r($q,true)."</pre>";
        return $q;
    }
    if ($q->is_category() && !isset($_GET[\'sort\']) ) {
        $q->set(\'meta_key\', \'the-year\');
        add_filter(\'posts_orderby\', \'custom_posts_orderby\');
        //echo "DEBUG: is_category() <pre>".print_r($q,true)."</pre>";
        return $q;
    }
    $custom_field = ( $_GET[\'sort\'] ) ? stripslashes( $_GET[\'sort\'] ) : \'\';
    $custom_value = ( $_GET[\'sortorder\'] ) ? stripslashes( $_GET[\'sortorder\'] ) : \'\';
    if( $custom_field ) {
        $q->set( \'meta_key\', $custom_field );
        $q->set( \'orderby\', $custom_field );
        if( $custom_value ) {
            $q->set( \'order\', $custom_value );
            //echo "DEBUG: custom_value <pre>".print_r($q,true)."</pre>";
            return $q;
        }
        //echo "DEBUG: custom_field <pre>".print_r($q,true)."</pre>";
        return $q;
    }
    //echo "DEBUG: else <pre>".print_r($q,true)."</pre>";
    return $q;
}

SO网友:revo

根据@birgire answer和您的评论:

更改第二个代码段add_actionadd_filter 然后为其执行设定优先级。

在您的情况下,这应该有效:

add_filter(\'pre_get_posts\', \'check_meta_sort\', 9); // earlier execution
add_filter(\'pre_get_posts\', \'sort_arc\', 10);

结束

相关推荐

自然排序/排序wp_Dropdown_Categories

我使用以下代码显示存档下拉列表: wp_dropdown_categories( \'taxonomy=week&hierarchical=1&orderby=name\' ); 然而,分类法的格式是第1周、第2周。。。。第10周、第11周我需要按照http://www.php.net/manual/en/function.natsort.php e、 g。第1周第2周<第10周第11周目前正在订购true alpha,例如。第1周第10周第11周第2周不知道最好的方