相同的查询,不同的结果。 Wordpress orderby

时间:2015-02-15 19:12:48

标签: php mysql wordpress

在我的wordpress网站上,我的wp_postmeta表格中有自定义字段(_recommended)订购的帖子:

|| *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查询生成并通过我的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

1 个答案:

答案 0 :(得分:0)

最有可能发生的事情是,您有多个帖子具有相同的_recommended值。由于您只对_recommended进行了排序,因此无法保证多个帖子的显示方式。

WordPress不允许您直接对meta_value和键进行排序,但如果您想要一致的订单,则可以使用过滤器进行排序,例如:按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子句中。