Aa,您知道,从WP3.0开始,有一些用于自定义高级查询的选项,这非常好。
自此,自定义字段的某些查询参数(例如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'

评论


真棒找到命名查询!

– Kaji
17年7月30日在5:15

是的,命名查询也为我回答了这个问题。

–道尔顿·鲁尼
17年7月31日在23:18

优秀的。我不确定order_clause中“ value”的重要性,因为它不是必需的,因为它将按“ order_in_archive”的最高值到最低值进行排序。

–安德鲁·舒尔茨(Andrew Schultz)
18/12/7在3:34

#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的密钥