1

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

这是我的查询示例:

 <?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 对它们进行排序,而是选择按默认的发布日期对它们自己进行排序。

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

有人有想法么?

4

1 回答 1

2

您可以在orderby键中指定数据类型,例如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使用STR_TO_DATEMySQL 函数进行过滤。


对于日期格式 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',
);

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

参考:

希望这可以帮助。

于 2017-01-09T06:56:43.090 回答