我正在为剧院公司创建一个网站,我正在创建所有过去,现在和未来制作的索引。我希望索引'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订购它们,而是选择按默认的发布日期订购自己。
我确定我错过了一些简单的事情。
有人有什么想法吗?
答案 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功能。
在活动子主题(或主题)的活动主题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',
);
代码经过测试且功能齐全。
参考:
希望这有帮助。