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

Same query, different results. Wordpress orderby

在我的 wordpress 网站上,我在 wp_postmeta table:

中按自定义字段(_推荐)排序了 post
|| *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 );

一段时间后我注意到,我的 post 订单一直在变化。所以我回显了原始的 SQL WP Query 生成并通过我的 SQL 程序执行了几次,只是看到被拉出的 ID 的顺序确实不断切换,即使它是准确的相同的查询。这里的原始 SQL 查询产生不同的 post 顺序:

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

很可能发生的情况是您有多个帖子具有相同的 _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 子句中。