Сделайте будущие публикации видимыми для общественности - не только в рамках WP-запроса
Я знаю, что могу публично показывать будущие сообщения в цикле, используя 'post_status' => 'future'
в WP_Query. Но нажатие на постоянную ссылку в будущем сообщении приведет к 404, если вы не являетесь зарегистрированным пользователем.
Предположим, у меня есть сообщение под названием "Апокалипсис" в "событии" типа post_type, запланированном на 12-12-2099. Постоянная ссылка mysite.com/event/apocalypse . Можно ли сделать mysite.com/event/apocalypse и другие будущие сообщения о "событиях", доступные для посещения сейчас публичный?
В идеале я мог бы ограничить доступность будущих сообщений типом сообщения "событие", но я бы согласился на решение, которое сделает доступными все будущие сообщения независимо от типа post_type.
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
был бы здесь хорошим решением.
Я хотел бы дать свой ответ все это время позже. В случае, если все "будущие" сообщения для типа "события" будут доступны для публики, я нашел следующее решение:
add_filter('get_post_status', function($post_status, $post) {
if ($post->post_type == 'events' && $post_status == 'future') {
return "publish";
}
return $post_status;
}, 10, 2);
Для меня данный фрагмент не работал, были некоторые ошибки в 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;
}
Я принудительно изменил статус публикации с 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')");