Php 如何查询帖子并使用';订购人';属性,用于根据日期';元值';?

Php 如何查询帖子并使用';订购人';属性,用于根据日期';元值';?,php,arrays,wordpress,meta-key,Php,Arrays,Wordpress,Meta Key,我正在为一家戏剧公司创建一个网站,我正在创建一个所有过去、现在和未来作品的索引。我希望索引“orderby”是每个生产的结束日期(ACF“date”字段类型;“ending_date”) 以下是我的查询示例: <?php $futureProd = array( 'post_type' => 'productions', 'posts_per_page' => -1, 'meta_key' => 'ending_date', 'orderb

我正在为一家戏剧公司创建一个网站,我正在创建一个所有过去、现在和未来作品的索引。我希望索引“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',
  );
?>


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

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

有人有什么想法吗

您可以像
meta\u value.*
可能的值为“数值”、“二进制”、“字符”、“日期”、“日期时间”, “十进制”、“有符号”、“时间”、“无符号”

试试这个

$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
格式。如果日期设置为不同格式,则必须创建自定义筛选函数挂钩,以便使用MySQL函数进行筛选。
对于日期格式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_查询参数应该如下所示:

$futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'yyyymmdd_date_format', //added custom orderby key
    'order' => 'ASC',
);
代码经过测试,功能齐全。

参考:


希望这有帮助。

尝试一下。问题依然存在:(还有其他想法吗?您使用的日期格式是什么?是否为
YYYY-MM-DD
?我已将其返回YYYYMMDD,以便显示为8位数字。即2017年1月1日返回:20170101。@JamieCavanagh:我已更新了我的答案。请阅读注释部分,您必须使用
下的代码作为日期格式yyyyymmdd
部分。Thank you@RaunakGupta you真是太棒了。有数千篇文章的元字段格式错误。看到此评论的每个人都必须知道,这是我在互联网上找到的唯一完整答案,所以请放弃投票:)
$futureProd = array(
    'post_type' => 'productions',
    'posts_per_page' => -1,
    'meta_key' => 'ending_date',
    'orderby' => 'yyyymmdd_date_format', //added custom orderby key
    'order' => 'ASC',
);