在我的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
答案 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子句中。