如何查询帖子并使用'orderby'属性根据日期'meta_value'在循环中订阅帖子?

时间:2017-01-08 19:34:11

标签: php arrays wordpress meta-key

我正在为剧院公司创建一个网站,我正在创建所有过去,现在和未来制作的索引。我希望索引'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订购它们,而是选择按默认的发布日期订购自己。

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

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

您可以在orderby密钥中对数据类型进行spicification,例如meta_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_orderby过滤器{ {3}} 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_Query参数应该是这样的:

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

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

参考:

希望这有帮助。