Отдельно необходимо скрывать все посты с типом «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 . И в нем кажется есть настройки, связанные с прикрепленными записями.
Оба способа мною опробованы, так как решал точно такую же задачу, и прекрасно работают. Но есть нюансы, которые лично меня заставили применить плагин.
Подробности
Как модифицировать следующий код, чтобы прикрепленные посты пропускались?
Например, так:
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' );
- Первая строка нужна, чтобы записи исключались только на внешней части сайта и только для основного запроса.
- Прилепленные записи добавляются к основным результатам с помощью вторичного запроса. Благодаря условию
! $query->is_main_query()
исключение рубрики на них распространяться не будет.
- Возвращать объект
$query
не нужно, поскольку pre_get_posts
— действие, а не фильтр.
Дело в том что ID перестали показываться на страницах админки WP начиная с версии WP 3.4
На самом деле гораздо раньше, в версии 2.5.
Отдельно необходимо скрывать все посты с типом «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' );
Еще раз спасибо!