这似乎是一个相当常见的问题,但我在这里发布这篇文章,因为我还没有在WP答案上找到我的问题的解决方案-非常感谢您的帮助!
好的,我有一个自定义的“事件”post类型,其中我使用自定义字段捕获事件的日期,并将其存储为unix时间戳。使用以下代码仅显示将来的事件,筛选前端的帖子不是问题:
$events = new WP_Query( \'post_type=events&posts_per_page=-1&meta_key=date_value&orderby=meta_value&meta_compare=>=&meta_value=\'.time().\'&order=ASC\' );
我已经尝试在管理中使用
pre_get_posts
过滤器:
function events_pre_get_posts($query) {
if (is_admin()) {
if (isset($query->query_vars[\'post_type\'])) {
if ($query->query_vars[\'post_type\'] == \'events\') {
$query->set(\'meta_key\', \'date_value\');
$query->set(\'orderby\', \'meta_value\');
$query->set(\'meta_compare\', \'>=\');
$query->set(\'meta_value\', time());
$query->set(\'order\', \'ASC\');
}
}
}
}
add_filter(\'pre_get_posts\' , \'events_pre_get_posts\');
但是在管理中,这个代码只会让我所有的帖子消失!
我也在试图找到一种在后端显示过去事件的方法,我真的被困在那里了!我不确定这样做的最佳方式——也许可以在“事件”帖子页面上切换以查看过去/未来的事件。
帮助
SO网友:wyrfel
第二次尝试:;-)
pre_get_posts
追求parse_query()
. parse_query()
将“meta\\u key”等转换为“meta\\u query”。get_posts()
似乎不会直接对“meta\\u key”等做出反应。因此,请尝试添加$query->parse_query()
在您的$query->set()
调用或使用之前运行的筛选器parse_query
(编辑后parse_query()
过滤器也不工作-运行得太晚)。
编辑:要进行切换:
function my_timeswitch() {
$operators = array(
\'>=\' => \'future\',
\'<=\' => \'past\'
);
?>
<select name=\'meta_compare\'>
<?php
foreach ($operators as $k => $v) {
printf( "<option %s value=\'%s\'>%s</option>\\n", selected($_GET[\'meta_compare\'], $k, false), esc_attr($k), __($v));
}
?>
</select>
<?php
}
add_action(\'restrict_manage_posts\', \'my_timeswitch\');
这可能只会自己起作用。如果没有,则必须将名称更改为其他名称,然后通过
query_vars
过滤,然后通过
parse_query
滤器