使用存储为自定义字段的日期过滤管理中显示的帖子

时间:2011-02-26 作者:Richard Sweeney

这似乎是一个相当常见的问题,但我在这里发布这篇文章,因为我还没有在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\');
但是在管理中,这个代码只会让我所有的帖子消失!

我也在试图找到一种在后端显示过去事件的方法,我真的被困在那里了!我不确定这样做的最佳方式——也许可以在“事件”帖子页面上切换以查看过去/未来的事件。

帮助

2 个回复
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 滤器

SO网友:wyrfel

使用current_time(\'mysql\') 而不是time().

time() 返回unix时间戳(即整数),current_time(\'mysql\') 返回mysql时间戳。

结束

相关推荐