微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何根据日期’meta_value’查询帖子并使用’orderby’属性来循环排序帖子?

我正在为剧院公司创建一个网站,我正在创建所有过去,现在和未来制作的索引.我希望索引’orderby’每个生产的结束日期(ACF’日期’字段类型;’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_value来订购它们,而是选择通过认的发布日期来订购自己.

我确定我错过了一些简单的事情.

有人有想法么?

解决方法:

You can spicify the datatype in orderby key like Meta_value_*
possible values are ‘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格式的日期,如果你有不同格式的日期,那么你必须使用STR_TO_DATE MysqL函数创建自定义过滤器函数钩到posts_orderby过滤器.

对于日期格式YYYYMMDD

将其添加到活动子主题(或主题)的活动主题function.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_Query Order & Orderby Parameters
> MySQL ORDER BY Date field which is not in date format

希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐