• Здравствуйте!
    Требуется скрыть посты из категории ID 1 с главной, при этом игнорируя прикрепленные посты. Как модифицировать следующий код, чтобы прикрепленные посты пропускались? (код вставляется в functions.php темы)

    function hidecategory( $query ) {
    	if ( $query->is_home ) {
    		$query->set('cat','-1');
    	}
    	return $query;
    }
    add_filter('pre_get_posts', 'hidecategory');

    Отдельно необходимо скрывать все посты с типом «video» с главной. Как это реализовать?

    Заранее большое спасибо!

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Отдельно необходимо скрывать все посты с типом «video» с главной.
    Как это реализовать?

    Есть два варианта.
    Использование вашего кода и плагин для исключения показа записей по определенным категориям

    function exclude_category($query) {
     if ($query->is_home){
     $query->set('cat','-2, -24');}
     return $query; }
    add_filter('pre_get_posts','exclude_category')

    Где -2, -24 — это ID категорий, которые надо исключить из показа.
    Лично я, уже давно, столкнулся с проблемой — как собственно определить эти ID.

    Я решил это установкой плагина Reveal IDs который вновь вернет на свои законные места ID ваших рубрик, меток, записей, страниц, медиафайлов и т.д. Дело в том что ID перестали показываться на страницах админки WP начиная с версии WP 3.4

    Есть другие способы определить эти ID, но плагин безусловно удобней!

    Второй способ исключения записей — плагин Simply Exclude . И в нем кажется есть настройки, связанные с прикрепленными записями.
    Оба способа мною опробованы, так как решал точно такую же задачу, и прекрасно работают. Но есть нюансы, которые лично меня заставили применить плагин.
    Подробности

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как модифицировать следующий код, чтобы прикрепленные посты пропускались?

    Например, так:

    function hidecategory( $query ) {
    	if ( is_admin() || ! $query->is_main_query() ) {
    		return;
    	}
    
    	if ( $query->is_home() ) {
    		$query->set( 'cat', '-1' );
    	}
    }
    add_action( 'pre_get_posts', 'hidecategory' );
    1. Первая строка нужна, чтобы записи исключались только на внешней части сайта и только для основного запроса.
    2. Прилепленные записи добавляются к основным результатам с помощью вторичного запроса. Благодаря условию ! $query->is_main_query() исключение рубрики на них распространяться не будет.
    3. Возвращать объект $query не нужно, поскольку pre_get_posts — действие, а не фильтр.

    Дело в том что ID перестали показываться на страницах админки WP начиная с версии WP 3.4

    На самом деле гораздо раньше, в версии 2.5.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Отдельно необходимо скрывать все посты с типом «video» с главной. Как это реализовать?

    Можно перечислить те типы, которые должны отображаться:

    $query->set( 'post_type', array( 'post' ) );

    Строку можно добавить в существующую функцию:

    function hidecategory( $query ) {
    	if ( is_admin() || ! $query->is_main_query() ) {
    		return;
    	}
    
    	if ( $query->is_home() ) {
    		$query->set( 'cat', '-1' );
    		$query->set( 'post_type', array( 'post' ) );
    	}
    }
    add_action( 'pre_get_posts', 'hidecategory' );

    Спасибо большое, Сергей! Ваш код помог.

    P.S. Я не до конца понял, чем конкретно является это «video». В моем случае это был post-type, а post-format-video. А для его сокрытия нашел следующий код:

    $tax_query = array( array(
    	'taxonomy' => 'post_format',
    	'field' => 'slug',
    	'terms' => array( 'post-format-video' ),
    	'operator' => 'NOT IN',
    ) );
    $query->set( 'tax_query', $tax_query );

    В итоге получился сдедующий код:

    function hidecategory( $query ) {
    	if ( is_admin() || ! $query->is_main_query() ) {
    		return;
    	}
    
    	if ( $query->is_home() ) {
    		$query->set( 'cat', '-1' );
    		$tax_query = array( array(
    			'taxonomy' => 'post_format',
    			'field' => 'slug',
    			'terms' => array( 'post-format-video' ),
    			'operator' => 'NOT IN',
    		) );
    		$query->set( 'tax_query', $tax_query );
    	}
    }
    add_action( 'pre_get_posts', 'hidecategory' );

    Еще раз спасибо!

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