自此,自定义字段的某些查询参数(例如meta_key,meta_value)已被新的meta_query参数弃用(请参见此处)
我尝试使用新语法进行一个非常简单的查询,通过包含指定meta_key(order_in_archive)的特定post_type(服务)查询帖子-效果令人满意。
但是-我想按meta_value排序查询,但没有成功。
这是我的查询-
query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_query' => array(
array('key' => 'order_in_archive'))
)
);
我也尝试通过meta_value_numeric和meta_value进行orderby,但是无论如何,结果是按发布日期排序的(就像常规帖子一样)。
谁知道该怎么做?
感谢
#1 楼
您可以使用旧方法(我在WP 3.1.1上进行了测试)为orderby参数定义元密钥。...query_posts(
array( 'post_type' => 'services',
'order' => 'ASC',
'meta_key' => 'some_key',
'orderby' => 'meta_value', //or 'meta_value_num'
'meta_query' => array(
array('key' => 'order_in_archive',
'value' => 'some_value'
)
)
)
);
#2 楼
通常,此问题已在WordPress 4.2中通过使用命名查询得到解决。例如,$args = array(
'post_type' => 'services',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive',
'value' => 'some_value',
'type' => 'NUMERIC' // unless the field is not a number
)));
对我来说,我想按数字字段进行排序,因此必须在元查询中使用
'type' => 'NUMERIC'
。 #3 楼
解决此问题时,WP Codex实际上是令人困惑的。您实际上并不需要meta_query参数来使用orderby,而是使用meta_key参数,尽管已被WP Codex弃用,但已确定此处:如何在Wordpress 3.1中的meta_query中使用orderby?那orderyby仍然需要meta_key。
所以应该是
query_posts( array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'meta_value',
'meta_key' => 'order_in_archive'
) )
评论
好的,是的,这是执行此查询的旧方法,它似乎适用于此指定的查询。无论如何,对于更复杂的查询,它将不起作用。我发现这是一个正在解决的已知问题,详细信息可以在火车票#15031和#17065中找到
–真·巴拉赞尼
2011-4-24在0:14
#4 楼
很简单:这是我的代码:
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
主要细节是:include
meta_key
,除非我的代码没有订购,否则meta_key
包括在内,仅此而已:这是
directors
所订购director_weight
图片列表的完整代码:<?php
query_posts(array(
'post_type' => 'directors',
'posts_per_page' => -1,
'order' => 'ASC',
'orderby' => 'director_weight',
'meta_key' => 'director_weight'
) );
while (have_posts()) : the_post();
?>
<li <?php echo get_field('director_weight') ?>>
<img src="<?php echo get_field('director_imagen') ?>">
</li>
<?php
endwhile;
wp_reset_query();
?>
#5 楼
不要使用query_posts。$meta_query = new WP_Meta_Query( $meta_query_args );
$meta_query_args = array(
'post_type' => 'services',
'order' => 'ASC',
'meta_key' => 'your_key',
'orderby' => 'meta_value', //or 'meta_value_num'
'meta_query' => array(
array('key' => 'order_in_archive',
'value' => 'some_value'
)));
使用WP_Meta_Query参数
#6 楼
我发现这很好用。<?php
query_posts(
array( 'posts_per_page' => '-1',
'post_type' => 'services',
'order' => 'DESC',
'meta_key' => '_order',
'orderby' => 'meta_value_num', //or 'meta_value_num'
)
);
评论
问题是关于新的meta_query参数以及如何使用orderby,而不是关于较旧但仍有效的meta_key / meta_value参数。另外,我们不鼓励使用query_posts。
– s_ha_dum
2012-12-28 19:55
该答案包含多种不良做法:使用-1,将其作为字符串传递,使用query_posts。应该将其删除。
–伊霍尔·沃罗特诺夫(Ihor Vorotnov)
19年3月1日在9:18
#7 楼
我有一组自定义事件日期,我需要按日期降序进行排序。由于我的自定义事件日期存储在wp_postmeta表中,并且通常与post_date或修改日期不同,因此这对我有用: $args = array(
'post_type' => 'events', // my post type - yours can be 'posts'
'post_status' => 'publish', // only get posts with this status
'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
'meta_key' => 'my_custom_eventdate', // the custom meta_key name
'order'=> 'DESC' // sort descending
);
$posts = new WP_Query($args);
然后您可以循环浏览像这样的$ posts:
foreach($posts->posts as $p){
$post_id = $p->ID;
// and so on ...
// # example of how I retrieve my event date
$event = get_post_meta($post_id, 'my_custom_eventdate', true);
}
#8 楼
对我来说有用, $args = array(
'post_type' => 'services',
'order' => 'ASC',
'orderby' => 'order_clause',
'meta_query' => array(
'order_clause' => array(
'key' => 'order_in_archive'
)));
只需要提供order_clause的密钥
评论
真棒找到命名查询!
– Kaji
17年7月30日在5:15
是的,命名查询也为我回答了这个问题。
–道尔顿·鲁尼
17年7月31日在23:18
优秀的。我不确定order_clause中“ value”的重要性,因为它不是必需的,因为它将按“ order_in_archive”的最高值到最低值进行排序。
–安德鲁·舒尔茨(Andrew Schultz)
18/12/7在3:34