Предполагаю, что не срабатывает is_null( $q->query_vars['post_type'] )
.
Не совсем понятно, для чего нужны проверки (при включённой константе WP_DEBUG
выдаются уведомления о неопределённых индексах post_type
и no_found_rows
).
У меня работает так:
function future_single( $q ) {
if ( is_single() )
$q->set( 'post_status', array( 'publish', 'future' ) );
}
add_action( 'pre_get_posts', 'future_single' );
Если проверка post_type
нужна — можно заменить is_null()
на empty()
.
function future_single( $q ) {
if ( empty( $q->query_vars['post_type'] ) && is_single() )
$q->set( 'post_status', array( 'publish', 'future' ) );
}
add_action( 'pre_get_posts', 'future_single' );
Другой вариант — публиковать запланированные записи сразу: http://n-wp.ru/5549
+return $q;
$q->query_vars['post_type']
вставлял из-за менюшки.
А ты под гостем свой вариант смотришь? Что-то не работает у меня все равно под гостем.
function future_single( $q ) {
if ( empty( $q->query_vars['post_type'] ) && is_single() )
$q->set( 'post_status', array( 'publish', 'future' ) );
return $q;
}
add_action( 'pre_get_posts', 'future_single' );
вариант второй не подойдет, т.к. они пропадать будут по мере как станут опубликованнами.
+return $q;
pre_get_posts
— это действие, а не фильтр. Объект $q
передаётся по ссылке, поэтому можно обойтись без return
.
Что-то не работает у меня все равно под гостем.
Да, под гостем не работает, поскольку статус future
не считается публичным. Можно добавить такой фрагмент:
function make_future_status_public() {
global $wp_post_statuses;
$wp_post_statuses['future']->public = 1;
}
add_action( 'init', 'make_future_status_public' );
они пропадать будут по мере как станут опубликованнами.
Понятно, тогда статус publish
в предыдущих фрагментах не нужен.
Про возврат, что-то в ВП не вникал. Код сократится теперь )
Спасибо, Сергей! В очередной раз помог 🙂