使未来的帖子对公众可见-而不仅仅是在WP_QUERY中

时间:2011-10-03 作者:supertrue

我知道我可以使用\'post_status\' => \'future\' 在WP\\U查询中。但如果您不是登录用户,单击未来帖子的永久链接将导致404。

假设我在post_类型的“事件”中有一篇名为《启示录》的帖子,计划于2099年12月12日发布。permalink是mysite。com/事件/启示录。是否可以创建mysite。com/event/apocalypse以及其他可访问的未来“事件”帖子now 被公众?

理想情况下,我可以将未来的帖子可用性限制为“事件”帖子类型,但我会选择一种解决方案,使所有未来的帖子都可用,而不管post\\u类型如何。

4 个回复
最合适的回答,由SO网友:supertrue 整理而成

简而言之,您可以通过告诉Wordpress将将来的帖子标记为\'published\' 而不是\'scheduled\'. 您可以使用future_post 钩子,当post更改状态时调用它。每个帖子类型都会自动获得自己的未来挂钩;因为我使用的自定义帖子类型是event, 我可以使用future_event 钩代码如下:

function setup_future_hook() {
// Replace native future_post function with replacement
    remove_action(\'future_event\',\'_future_post_hook\');
    add_action(\'future_event\',\'publish_future_post_now\');
}

function publish_future_post_now($id) {
// Set new post\'s post_status to "publish" rather than "future."
    wp_publish_post($id);
}

add_action(\'init\', \'setup_future_hook\');
此解决方案来自此SE问题:Marking future dated post as published

这种方法的一个警告是,我要补充的警告是,这使得在未来的帖子中进行循环变得更加困难。之前,我可以简单地使用\'post_status\' => \'future\'; 但现在,既然我们已经设定了未来的职位post_statuspublished, 这行不通。

为了避免这个问题,你可以使用posts_where 在循环中过滤(例如,请参见此处的codex上的日期范围示例:http://codex.wordpress.org/Class_Reference/WP_Query#Time_Parameters), 或者,您可以将当前日期与发布日期进行比较,如下所示:

    // get the event time
    $event_time = get_the_time(\'U\', $post->ID);

    // get the current time
    $server_time = date(\'U\');

    // if the event time is older than (less than)
    // the current time, do something
    if ( $server_time > $event_time ){
       // do something
    }
然而,这两种技术都没有单独的post_status 对于未来的职位。也许是一种习惯post_status 这是一个很好的解决方案。

SO网友:Samuel Reid

我想以后一直给出我的答案。在让“事件”帖子类型的所有“未来”帖子对公众可见的情况下,我找到了以下解决方案:

add_filter(\'get_post_status\', function($post_status, $post) {
    if ($post->post_type == \'events\' && $post_status == \'future\') {
        return "publish";
    }
    return $post_status;
}, 10, 2);

SO网友:knif3r

对我来说,给定的代码片段不起作用,后期编辑中出现了一些错误。php,但我猜$postatt在4.6.1中现在是空的。

不管怎样,这是最终的解决方案,对我来说很有吸引力。

add_filter(\'the_posts\', \'show_all_future_posts\');

function show_all_future_posts($posts)
{
   global $wp_query, $wpdb;

   if(is_single() && $wp_query->post_count == 0)
   {
      $posts = $wpdb->get_results($wp_query->request);
   }

   return $posts;
}

SO网友:P.O.W.

我从函数中强制发布状态。子主题的php

global $wpdb;
$wpdb->query("update ".$wpdb->prefix."posts set post_status=\'publish\' where post_status=\'future\' and post_type in (\'post\',\'customposttype1\',\'customposttype2\')");

结束

相关推荐