相同的查询,不同的结果.Wordpress排序方式


Same query, different results. Wordpress orderby

在我的wordpress网站上,我的wp_postmeta表中有一个自定义字段(_rerecommended)对帖子进行排序:

|| *meta_id* || *post_id* || *meta_key* || *meta_value* ||
|| 24948 || 496 || _recommended || 15 ||
|| 25460 || 1323 || _recommended || 45 ||
|| 25972 || 1632 || _recommended || 200 ||

我通过将参数传递给WP_Query:来实现这一点

$args = array(
'meta_key' => '_recommended',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'posts_per_page' => $wp_query->get('posts_per_page'),
'paged' => $paged
);
$query = new WP_Query( $args );

过了一段时间,我注意到,我的邮政订单不断切换。因此,我对生成的原始SQL WP Query进行了几次响应,并通过我的SQL程序执行了它,结果发现,即使它是完全相同的查询,ID的提取顺序也确实在不断切换。这里的原始SQL查询产生不同的后订单:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN
wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND 
wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND ( 
wp_postmeta.meta_key = '_recommended' ) GROUP BY wp_posts.ID ORDER BY   
wp_postmeta.meta_value+0 DESC LIMIT 77, 11

最有可能的情况是,您有多个具有相同_recommitted值的帖子。由于您只是在_recommitted上进行排序,因此无法保证多个帖子将如何显示。

WordPress不允许您直接对meta_value和key进行排序,但如果您想要一致的顺序,可以使用过滤器进行排序,例如通过ID。

add_filter( 'posts_orderby', 'do_posts_orderby' );
$query = new WP_Query( array(
    'meta_key' => '_recommend',
    'orderby' => 'ID',
    'order' => 'ASC',
) );
remove_filter( 'posts_orderby', 'do_posts_orderby' );
function do_posts_orderby( $orderby )
{
    global $wpdb;
    $orderby = $wpdb->postmeta . '.meta_value_num DESC, ' . $orderby;
    return $orderby;
}

这会将要排序的附加值添加到OrderBy子句中。