提问者:小点点

如何查询帖子并使用“orderby”属性根据日期“meta_值”在循环中对帖子进行排序?


我正在为一家戏剧公司创建一个网站,我正在创建一个所有过去、现在和未来作品的索引。我希望索引'orderby'结束日期的每个生产(ACF'date'字段类型;'ending_date')。

以下是我的查询示例:

 <?php 
  $futureProd = array(
   'post_type' => 'productions',
   'posts_per_page' => -1,
   'meta_key' => 'ending_date',
   'orderby' => 'meta_value',
   'order' => 'ASC',
 );

 $slider_posts = new WP_Query($futureProd);

 $array_rev = array_reverse($slider_posts->posts);
 $slider_posts->posts = $array_rev;

 ?>

还尝试了以下方法,添加了“meta_value_date”和“meta_value_num”选项:

<?php // query posts
  $futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'meta_value_date',            
    'order' => 'ASC',
  );
?>

<?php // query posts
      $futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'meta_value_num',            
    'order' => 'ASC',
  );
?>

不管我怎么做,帖子都拒绝按meta_值排序,而是选择按默认的post date排序。

我肯定我错过了一些简单的东西。

有人有什么想法吗?


共1个答案

匿名用户

您可以在orderby键中指定数据类型,如meta\u value.*可能的值为“NUMERIC”、“BINARY”、“CHAR”、“DATE”、“DATETIME”、“DECIMAL”、“SIGNED”、“TIME”、“UNSIGNED”。

试试这个,

$futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'meta_value_date',
    'order' => 'ASC',
);

$slider_posts = new WP_Query($futureProd);

请注意:要使上述代码正常工作,您需要将日期设置为YYYY-MM-DD格式。如果您的日期设置为不同格式,则您必须创建自定义筛选函数,以链接到posts\u orderbyfilter,并使用STR\u to\u dateMySQL函数。

将此添加到活动主题函数中。php活动子主题(或主题)的文件。或者在任何插件php文件中。

function text_domain_posts_orderby($orderby, $query) {
    //Only for custom orderby key
    if ($query->get('orderby') != 'yyyymmdd_date_format')
        return $orderby;
    if (!( $order = $query->get('order') ))
        $order = 'ASC';
    global $wpdb;
    $fieldName = $wpdb->postmeta . '.meta_value';
    return "STR_TO_DATE(" . $fieldName . ", '%Y%m%d') " . $order;
}

add_filter('posts_orderby', 'text_domain_posts_orderby', 10, 2);

所以现在你的WP_Query论点应该是这样的:

$futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'yyyymmdd_date_format', //added custom orderby key
    'order' => 'ASC',
);

代码经过测试,功能齐全。

参考:

  • WP_查询顺序

希望这有帮助。