Pre_Get_Posts()操作中的多个orderby参数

时间:2012-10-23 作者:Zach

引用@Otto\'s response 对于我提出的一个关于按多个字段排序的问题,他说:

无法使用朴素的WP\\U查询。使用posts\\u orderby过滤器添加您自己的订购字符串。

function my_order($orderby) { 
    global $wpdb; 
    return "{$wpdb->posts.post_author} ASC, {$wpdb->posts.post_date} DESC"; 
} 
add_filter( \'posts_orderby\', \'my_order\' ); 

$blah = new WP_Query(...); 

remove_filter( \'posts_orderby\', \'my_order\' ); 
-奥托

这似乎是在新调用WP\\U查询-->时所采用的方式,我将如何在pre_get_posts() 具有两个元字段的操作,默认排序为?:

function mouldings_sort($query) {
    if ($query->is_main_query() && is_tax(array(\'wood_types\',\'profile_categories\',\'combination_categories\'))) {

        $query->set(\'meta_key\', \'_mouldings_dimensions_height\');
        $query->set(\'order\', \'DESC\');
        $query->set(\'orderby\',\'meta_value_num\');
    }

}
add_action(\'pre_get_posts\',\'mouldings_sort\');
我之前尝试过简单地添加另一个元字段,如下所示:

$query->set(\'meta_key\', array(\'_mouldings_dimensions_height\', \'_mouldings_dimension_width\'));
$query->set(\'orderby\',\'meta_value_num\');
默认排序返回为title 因此:

 $query->set(\'orderby\',\'meta_value_num title\');
但看起来不像meta_key 可以接受阵列和我的title 回退回到奥托对此事的最初回应。任何帮助都将不胜感激。谢谢

2 个回复
SO网友:kaiser

永远不要忘记two filters

// Add additional query args that are allowed by the API by default
pre_get_posts
// Modify the query herself
posts_clauses
// Inspect the resulting string - test this one in for e.g. phpMyAdmin
posts_request
因此,您可以使用pre_get_posts 应该在那里进行过滤。其余部分应使用posts_clauses (或之前更具体的过滤器之一)。

// Modify the original query parts
function wpse70214_pre_get_posts( $query )
{
    var_dump( $query );
    return $query;
}
add_filter( \'pre_get_posts\', \'wpse70214_pre_get_posts\' );

// Modify the resulting query string parts
function wpse70214_posts_clauses( $pieces )
{
    var_dump( $pieces );
    return $pieces;
}
add_filter( \'posts_clauses\', \'wpse70214_posts_clauses\' );

// Then check the result
function wpse70214_posts_request( $query_string )
{
    var_dump( $query_string );
    return $query_string;
}
add_action( \'posts_request\', \'wpse70214_posts_request\' );

SO网友:Chris_O

是的就像奥托说的你不能有第二个ORDER BY 无习惯的子句posts_orderby 滤器如果需要知道在la“pre\\u get\\u posts”上的查询,可以创建一个函数,将orderby过滤器添加到posts\\u orderby,并从pre\\u get\\u posts调用它。

/**
 * Posts orderby filter.  The filter will be added using pre_get_posts outside the class
 *  using the pre_get_posts action allows us to do checks for what page etc...
 * @return string, new MySQL ORDER BY clause
 */
function wpse_order_by() {
    global $wpdb;
    return $wpdb->prepare( "$wpdb->postmeta.meta_value+0 DESC, post_title DESC" );
}

/**
 * Pre get posts filter for adding secondary fall back ORDER BY clause to MySql query
 * @uses remove_filter(), This filter removes itself after it runs to prevent it from affecting  other queries on the same page.
 * @uses add_filter()
 * @param object|array $query the current $query object
 */
function wpse_post_order_pre( $query ) {
    if ($query->is_main_query() && is_tax(array(\'wood_types\',\'profile_categories\',\'combination_categories\'))) {

    /** remove_filter() is used to prevent this affecting additional queries on the page */
    remove_filter( current_filter(), __FUNCTION__ );

    add_filter( \'posts_orderby\', \'wpse_order_by\' );
    }
}

add_action( \'pre_get_posts\', \'wpse_post_order_pre\' );

结束

相关推荐

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

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