Поддержка Проблемы и решения Будущие посты, проблема с single

  • Всем привет )

    Делаю на сайте анонсы, по сути это ни что иное как запланированные посты.

    На главной вывожу пачку запланированных постов, но проблема возникает под гостем (у админа авторизованного работает) при просмотре single.

    Вот что делаю

    function future_single($q) {
    
        if (is_null($q->query_vars['post_type']) && !$q->query_vars['no_found_rows']) {
            if (is_single()) {
                $q->set('post_status', "future"); // разрешить показывать будущие посты (не работает)
                //$q->set('p', "1"); // работает
    
            }
        }
        return $q;
    }
    add_filter('pre_get_posts', 'future_single');

    Применение этого же фильтра на главной отображает запланированные посты, а на single не выходит, куда можно покапать?

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Предполагаю, что не срабатывает 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' );

    вариант второй не подойдет, т.к. они пропадать будут по мере как станут опубликованнами.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    +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 в предыдущих фрагментах не нужен.

    Про возврат, что-то в ВП не вникал. Код сократится теперь )

    Спасибо, Сергей! В очередной раз помог 🙂

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Будущие посты, проблема с single» закрыта для новых ответов.