我正在为一家戏剧公司创建一个网站,我正在创建一个所有过去、现在和未来作品的索引。我希望索引'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',
);
?>
和
<?php // query posts
$futureProd = array(
'post_type' => 'productions',
'posts_per_page' => -1,
'meta_key' => 'ending_date',
'orderby' => 'meta_value_num',
'order' => 'ASC',
);
?>
不管我怎么做,帖子都拒绝按meta_值排序,而是选择按默认的post date排序。
我肯定我错过了一些简单的东西。
有人有什么想法吗?
您可以在orderby
键中指定数据类型,如meta\u 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\u orderby
filter,并使用STR\u to\u date
MySQL函数。
将此添加到活动主题函数中。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',
);
代码经过测试,功能齐全。
参考:
希望这有帮助。