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

问题描述:

我正在为一家剧院公司创建一个网站,并且我正在创建所有过去,现在和未来作品的索引。我希望索引'orderby'每个生产的结束日期(ACF'日期'字段类型;'ending_date')。如何根据日期'meta_value'查询帖子并使用'orderby'属性在循环中排序帖子?

这里是我的查询的示例:

<?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排序themselevs,而是选择按默认,发布日期排序。

我确定我缺少一些简单的东西。

任何人有任何想法?

可以spicify数据类型在orderby键像meta_value_* 可能的值是 'NUMERIC', 'BINARY', 'CHAR', '日期', 'DATETIME', '十进制', '签名',“ 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_DATE 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', 
); 

的代码进行测试,功能齐全。

参考:

希望这有助于。

+0

试试吧。问题依然存在。 :( 任何其他想法? –

+0

你使用的是什么日期格式?它是'YYYY-MM-DD'吗? –

+0

我得到它返回YYYYMMDD,以便它出来作为一个8位数字。即2017年1月1日返回:20170101. –