О том, как запретить отображение (вывод) определённой статьи (записи) на главной странице или страничках архивов — рубрик, тегов, страниц поиска… в этой статье и разберёмся.
Решая нынешнюю задачу, рассмотрим несколько вариаций кодов:
Таким образом добьёмся наилучшего результата настройки структуры сайта, чтобы посетителю было удобнее ориентироваться, а нам, как админам, покойно на душе))
Содержание
как исключить конкретную запись по id на главной страничке сайта
…вот и ловкий код для легендарного файла функций либо же плагина, который решит вопрос исключения определённых записей с главной страницы, либо любых архивов любо настроить:
/** исключим конкретные записи с главной **/
function exclude_post($query) {
if ($query->is_home)
{$query->set('post__not_in', array(4) );} // id записи (поста) - возможно указывать несколько id через запятую
return $query;
}
add_filter('pre_get_posts','exclude_post');
/** исключим конкретные записи с главной **/
Теория кода:
Создаём такой запрос (относительно отдельных записей post) к базе данных exclude_post($query); далее указываем страницу для обработки запросом: у нас это is_home.
Далее создаём (скажем так — правило обработки и фильтра на отдачу информации из БД по запросу) исключения объекта из запроса: т.е запрос возвратится без указанного объекта — id 4.
return $query; } указание на то, что основной запрос к БД $query
теперь отработает и возвратит выборку с нашими коррективами — без id 4 — посредством фильтра финальной строки.
Что и требовалось!
Это я максимально упрощённо пытался пояснить, понятности ради. А в более техническом ключе излагается в кодексе вордпресс, правда, многие темы не переведены толком.
А вообще, у меня в листе дофолоу есть ссылка на один хороший сайт wp-kama, на его страничках есть много полезного и по-русски сказанного)) хотя и несколько сложновато для новичка, но если хотите пройдите, ознакомьтесь.
Теперь по логике показанного выше кода разберёмся…
как исключить записи в каких-то иных страницах архивов
По коду выше видно, что ключевая логика работы кода заключается в условии is_home
, а значит в строке 2:
if ($query->is_home)
следует, для необходимого результата исключений, всего-то заменить условный тег на нужный. Например, чтобы исключить определённую запись со странички архивов категорий, надлежит поменять условный тег на is_category
и указать id записи — и всего делоф…
Во второй строке кода должно получиться так:
if ($query->is_category)
И так далее, манипулируя условными тегами…
is_home()
— главнаяis_search()
— страница поискаis_category()
— категории (рубрики)is_tag()
— теги (метки)is_archive()
— страницы архивовis_author()
— страницы авторовis_feed()
— фидis_year()
— дата — годis_month()
— общее время
Если кто-то использует на сайте странички архивов по датам, или странички авторов (коли на сайте автор не один) — поступаете аналогично описанному принципу выше, добавляя соответствующие условные теги.
А вот статья, изучив которую можно выучиться как исключить из индексации странички архивов, авторов: это полезно в качестве избавления от «соплей» — дублей страниц.
как исключить некоторые категории с главной страницы
…ну, например так…
/** исключим категории полностью **/
function exclude_cat($query) {
if ($query->is_home)
{$query->set('cat','-1, -22, -37');} // id требуемых категорий
return $query; }
add_filter('pre_get_posts','exclude_cat');
/** фин - исключим категории полностью **/
Однако в мире известны случаи, когда админ требователен в своих желаниях: ему требуется так, что нужно исключить вывод записей одновременно и с домашней страницы (главной) и с каких-то иных, например, категорий…
В этом случае можно поступить разно:
1 — дописать добавочный пример кода с необходимыми параметрами (условных тегов) для выборки из Базы Данных только указанных записей.
2 —…чтобы не громоздить много лишнего кода, …возможно комбинировать уже имеющийся код — добавляя соответствующие условные теги…
Посмотрите внимательно на следующий пример: в показанном выше коде, нужно заменить вторую строку на эту.
if ($query->is_category || ($query->is_home))
…или просто добавить к уже существующему у вас коду другие необходимые теги-условия (в цикле которых необходимы исключения).
Добавляется каждый параметр через две вертикальные скобки || (разделитель) который условно заменяют if.
как исключить из «поиска по сайту» постоянные страницы
В самом деле, зачем они нужны в результате поиска?? незачем! Ну, по крайней мере, некоторые из них — точно..!
…чтобы напрочь исключить в результатах поиска по сайту постоянные страницы:
достаточно прописать к себе в файл функций (или добавочный файл функций functions.php — плагин — что весьма правильнее) такой код:
/** исключим постоянные страницы из результатов поиска **/
function search_filter($query) {
if ( ! is_admin() && $query->is_main_query() ) {
if ($query->is_search) {
$query->set('post_type', 'post');
}
}
}
add_action( 'pre_get_posts', 'search_filter' );
/** исключим постоянные страницы из результатов поиска **/
И здесь, как и во всех показанных кодах, мы воспользовались таким хуком из арсенала вордпресс: pre_get_posts
— чтобы исключить из результатов поиска постоянные страницы
Готово дело!..
Однако — теперь узнаем решение ещё одного схоластического требования админа: (и это желание логично: уж коли однажды создали произвольный тип записей, то, возможно, включить эти записи в поиск по сайту весьма и весьма целесообразно)
включить в поиск по сайту произвольные типы записей
…блажь включения в поиск произвольных типов записей запросто решить так:
Вот такой код запишите на постоянное место жительства в файл функций, или плагин:
/** включаем в поиск произвольные "типы" записей **/
function get_posts_search_filter( $query ){
if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
$query->set('post_type', array('post', 'my-tv') );
}
}
add_action('pre_get_posts', 'get_posts_search_filter');
/** включаем в поиск произвольные "типы" записей **/
…где my-tv — имя произвольного типа.
Ну вот как бы и всё… если что не ясно, спрашивайте …есть же комментарии…
Источник: https://mihalica.ru/