Сделайте будущие публикации видимыми для общественности - не только в рамках WP-запроса


Я знаю, что могу публично показывать будущие сообщения в цикле, используя 'post_status' => 'future' в WP_Query. Но нажатие на постоянную ссылку в будущем сообщении приведет к 404, если вы не являетесь зарегистрированным пользователем.

Предположим, у меня есть сообщение под названием "Апокалипсис" в "событии" типа post_type, запланированном на 12-12-2099. Постоянная ссылка mysite.com/event/apocalypse . Можно ли сделать mysite.com/event/apocalypse и другие будущие сообщения о "событиях", доступные для посещения сейчас публичный?

В идеале я мог бы ограничить доступность будущих сообщений типом сообщения "событие", но я бы согласился на решение, которое сделает доступными все будущие сообщения независимо от типа post_type.

Author: supertrue, 2011-10-03

4 answers

Короче говоря, вы можете сделать будущие публикации видимыми, попросив Wordpress пометить их как 'published' вместо 'scheduled'. Вы делаете это с помощью крючка future_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: Помечая будущую датированную публикацию как опубликованную

Предостережение с этот подход

Предостережение, которое я добавлю, заключается в том, что это затрудняет получение цикла только будущих сообщений. Раньше я мог просто использовать 'post_status' => 'future'; но теперь, поскольку мы установили для будущих сообщений post_status значение published, это не работает.

Чтобы обойти это, вы можете использовать фильтр posts_where в своем цикле (например, смотрите Примеры диапазона дат в кодексе здесь: 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 был бы здесь хорошим решением.

 5
Author: supertrue, 2017-04-13 12:37:46

Я хотел бы дать свой ответ все это время позже. В случае, если все "будущие" сообщения для типа "события" будут доступны для публики, я нашел следующее решение:

add_filter('get_post_status', function($post_status, $post) {
    if ($post->post_type == 'events' && $post_status == 'future') {
        return "publish";
    }
    return $post_status;
}, 10, 2);
 2
Author: Samuel Reid, 2019-02-21 22:48:28

Для меня данный фрагмент не работал, были некоторые ошибки в post-edit.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;
}
 1
Author: knif3r, 2016-11-09 15:57:55

Я принудительно изменил статус публикации с functions.php дочерней темы

global $wpdb;
$wpdb->query("update ".$wpdb->prefix."posts set post_status='publish' where post_status='future' and post_type in ('post','customposttype1','customposttype2')");
 0
Author: P.O.W., 2020-09-07 12:54:51