WP_Query是否按多个自定义字段排序?

时间:2012-10-31 作者:jonas

我正在学习WP\\U查询,最近遇到了一个问题。

我需要做一个查询,首先通过一个或多个自定义字段进行过滤,这得益于meta\\u查询。

但是,我还需要它按多个自定义字段排序。

(就像在sql中一样,您可以编写“按字段ASC排序,按字段2描述排序”)

这就是我目前的情况:

$args=array(
    \'post_type\' => \'personer\',
    \'meta_query\' => array(
        array(
            \'key\' => \'p_seller\',
            \'value\' => \'Y\',
            \'compare\' => \'=\'
        )
    ),
    \'meta_key\' => \'p_region\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'ASC\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => 999,
    \'caller_get_posts\'=> 1
);
它返回p\\u seller设置为Y并按p\\u区域排序的行。我还想添加第二个orderby,在region之后按p\\u lastname排序。甚至更好-p\\u region,p\\u lastname,p\\u firstname。所有这些都是提升,但我想知道如何将ASC和DESC结合起来:)

我在google上搜索了一些内容,但大多数人似乎都在写关于过滤的多个字段,这是我得到的。或者,它们在自定义SQL查询中会留出空间,我希望我可以不使用这些查询:)

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

我相信还有更优雅的解决方案,但这就是我想到的,而且目前还有效。。。

global $wpdb;

$querystr = "
    SELECT wposts.*
    FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->postmeta wpostmeta2, $wpdb->postmeta wpostmeta3
    WHERE wposts.ID = wpostmeta.post_id
    AND wposts.ID = wpostmeta2.post_id
    AND wposts.ID = wpostmeta3.post_id
    AND wpostmeta.meta_key = \'p_seller\'
    AND wpostmeta2.meta_key = \'p_role\'
    AND wpostmeta3.meta_key = \'p_firstname\'
    AND wpostmeta.meta_value = \'N\'
    AND wposts.post_type = \'personer\'
    AND wposts.post_status = \'publish\'
    ORDER BY wpostmeta2.meta_value ASC, wpostmeta3.meta_value ASC
";

$pageposts = $wpdb->get_results($querystr);

if ($pageposts){
    foreach ($pageposts as $post){
        setup_postdata($post);

        // the_title() or whatever works here..              

    }
}

SO网友:George

$qry_args = array(
    \'post_status\' => \'publish\', 
    \'post_type\' => \'event\', // Post type
    \'posts_per_page\' => -1, // ALL posts

    \'orderby\' => \'meta_value\',
    \'meta_key\' => \'year\',
    \'order\' => \'DESC\'

);

add_filter( \'posts_orderby\', \'filter_query\' );
$all_posts = new WP_Query( $qry_args );
remove_filter( \'posts_orderby\', \'filter_query\' );

function filter_query( $query ) {
    $query .= \', post_modified DESC\';
    return $query;
}
下面是一个有效的示例。上面的代码对所有事件类型的帖子进行排序:第一个是按年份排序的,第二个是按修改日期排序的,适用于同一年的帖子。

如果没有第二次排序,如果他们有相同的年份,他们将保持上升顺序。

p、 s.year是我添加到“Event”类型帖子的自定义字段

SO网友:Mridul Aggarwal

您应该通过自定义查询posts_orderby 滤器

在模板中

add_filter(\'posts_orderby\', \'custom_orderby\');
$query= new WP_Query($args);
remove_filter(\'posts_orderby\', \'custom_orderby\');
在您的功能中。php

function custom_orderby($orderby) {
    return "ORDER BY field ASC, field2 DESC";
}

SO网友:Ramon Fincken

使用命名查询,例如https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

$q = new WP_Query( array(
\'meta_query\' => array(
    \'relation\' => \'AND\',
    \'state_clause\' => array(
        \'key\' => \'state\',
        \'value\' => \'Wisconsin\',
    ),
    \'city_clause\' => array(
        \'key\' => \'city\',
        \'compare\' => \'EXISTS\',
    ), 
),
\'orderby\' => array( 
    \'city_clause\' => \'ASC\',
    \'state_clause\' => \'DESC\',
),
));

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post