在我开火之前,只要一个音符,NEVER (我的重点)利用query_posts
创建自定义查询的步骤
Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。
而是利用WP_Query
或get_posts
创建自定义查询,但ONLY 如果无法使用修改主查询pre_get_posts
. 有关更多信息,请查看this post
假设您的meta_key
(请注意:出于测试目的,我使用了自己的元密钥,您应该用自己的元密钥替换它),即pro
和free
, 您可以检索具有此特定meta_key
. 您的查询将如下所示:
$args = [
\'meta_key\' => \'packages\',
\'orderby\' => \'rand\',
\'posts_per_page\' => 5,
];
$the_query = new WP_Query( $args );
但是,如果您的值多于这两个值,则需要调整查询以包括
meta_value
然后利用
meta_compare
参数调整后的查询将变成:
$args = [
\'meta_key\' => \'packages\',
\'meta_value\' => \'free, pro\',
\'orderby\' => \'rand\',
\'meta_compare\' => \'IN\',
\'posts_per_page\' => 5,
];
(
PS!在我继续之前,你应该注意orderby
参数在版本4.0中已更改,但这在该实例中不起作用很好,您现在将有5篇随机检索的帖子meta_value
属于pro
或free
现在我们需要对它们进行分类。最好的解决方案是利用usort
在中对返回的帖子数组进行排序$the_query->posts
根据岗位价值meta_value
. 然后需要取消设置$the_query->posts
然后用重新排序的post数组重置它。
以下是完整的代码:
<?php
$args = [
\'meta_key\' => \'packages\',
\'meta_value\' => \'free, pro\',
\'orderby\' => \'rand\',
\'meta_compare\' => \'IN\',
\'posts_per_page\' => 5,
];
$the_query = new WP_Query( $args );
$post_metas = $the_query->posts;
usort( $post_metas, function( $a, $b ){
$a = get_post_meta( $a->ID , \'packages\', true ) ;
$b = get_post_meta( $b->ID, \'packages\', true ) ;
if ( $a == $b ) {
return 0;
}
return ( $a > $b ) ? -1 : 1;
}
);
unset($the_query->posts);
$the_query->posts = $post_metas;
if ( $the_query->have_posts() ) {
echo \'<ul>\';
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo \'<li>\' . get_post_meta( get_the_ID(), \'packages\', true ). \'</br>\' . get_the_title() . \'</li>\';
}
echo \'</ul>\';
}
wp_reset_postdata();
?>
您只需要调整查询变量以满足您的需要,还需要调整循环以显示所需内容
但这不是实现它的唯一方法,您还可以将排序函数移动到函数中。php并专门针对此自定义查询