Главная
Wordpress
Как исключить записи и рубрики из вывода WordPress
  • 14 Апр 2016г
  • 371
  • 4
  • Рубрика: Wordpress

Как исключить записи и рубрики из вывода WordPress

Убрать записи из главной

Доброго времени суток 🙂

Сегодня хочу затронуть одну из популярных тем, которая касается WordPress. Если Вы владеете своим блогом использующим WordPress, то возможно столкнулись с надобностью исключить вывод определенных записей или даже рубрик из цикла на главной странице, например. Схожим может быть исключение записей и рубрик из поиска, rss ленты и архивов статей.

Когда возникает такая необходимость? Например, вы распределили материалы своего сайта по рубрикам, а в некоторых Вам нужно добавить материал, который не совсем соответствует тематике сайта, но все же необходим и Вы не хотите. чтобы он светился на главной или вообще появлялся в ненужных местах. Он должен быть доступен только по определенной ссылке.

В моей практике, очень часто встречаются ситуации когда нужно отфильтровать содержимое главной страницы и других разделов. Для того чтобы это сделать понадобится сделать совсем не много. Исключить записи и рубрики из цикла можно с помощью функций, добавленных в файл functions.php Вашей темы WordPress

Начнем по порядку, первая функция будет исключать записи из определенных категорий. Например Вам нужно исключить записи из рубрик с айди 1 и 2. То есть будут исключены полностью все записи из данных рубрик.

Чтобы определить айди рубрик, нужно в админке перейти в список рубрик и навести курсором на нужную. Внизу окна браузера с правой стороны появится ссылка внутри которой будет что-то типа ID=1, то есть айди этой рубрики 1.
ID рубрики

Открываем functions.php для редактирования и в самый его конец, перед закрывающим тегом PHP - ?>, если его нет, то просто в конце добавляем такую функцию:

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

В третей строке указываем айди рубрик с отрицательным значением, записи из которых нужно исключить, как и говорил в примере это рубрики с айди 1 и 2.

Теперь рассмотрим случай как исключить записи из архивов WordPress. Делаем все по принципу первого метода.

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

Третий вариант, это как исключить записи из результатов поиска WordPress. Так же добавляем функцию в functions.php

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

ну и последний, исключение из RSS ленты.

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

Вы могли заметить что условие где исключать записи задается во второй строке всех функций.

  • $query->is_home - исключение из главной страницы.
  • $query->is_archive - из архивов
  • $query->is_search - из поиска
  • $query->is_feed - из RSS.

Далее идет уже более масштабное исключение, которое позволит убрать записи одновременно с главной страницы, rss ленты, архивов и поиска. То есть предыдущие три варианта объединены в одну функцию, что довольно удобно. Так что если Вам нужно исключить сразу в нескольких местах, то такой вариант Вам лучше всего подойдет.

function exclude_category($query) {
if ($query->is_feed || ($query->is_home || ($query->is_search || ($query->is_archive)))){
$query->set('cat','-1, -2');} 
return $query; }
add_filter('pre_get_posts','exclude_category');

Теперь давайте рассмотрим тот случай когда нужно исключить не целую рубрику, а только определенные записи. То есть рубрика будет выводится как есть за исключением лишь нескольких записей. В этом нам поможет схожие функции, которые и сделают всю работу.

Первая функция исключит определенные записи с главной страницы.

function exclude_post($query) {
if ($query->is_home)
{$query->set('post__not_in', array(55, 56) );}
return $query; }
add_filter('pre_get_posts','exclude_post');

Как видите мы исключаем записи с айди 55 и 56. Айди записей можно узнать аналогичным способом как и айди рубрик. То есть заходите в список записей, находите нужную, наводите курсор на ее название и внизу смотрите в ссылке ее айди.

Как исключить определенные записи из RSS.

function exclude_post($query) {
if ($query->is_feed)
{$query->set('post__not_in', array(55, 56) );}
return $query; }
add_filter('pre_get_posts','exclude_post');

Как исключить определенные записи из поиска.

function exclude_post($query) {
if ($query->is_search)
{$query->set('post__not_in', array(55, 56) );}
return $query; }
add_filter('pre_get_posts','exclude_post');

Как исключить определенные записи из архивов.

function exclude_post($query) {
if ($query->is_archive)
{$query->set('post__not_in', array(55, 56) );}
return $query; }
add_filter('pre_get_posts','exclude_post');

Как исключить определенные записи из всего вышеприведенного сразу.

function exclude_post($query) {
if ($query->is_feed || ($query->is_home || ($query->is_search || ($query->is_archive)))){
$query->set('post__not_in', array(55, 56) );}
return $query; }
add_filter('pre_get_posts','exclude_post');

Статья получилась не маленькой, но если разобраться то сложного ничего нет.

На этом все, спасибо за внимание. 🙂




Если Вам был полезным мой труд, можете поддержать сайт, обменяться со мной текстовыми ссылками или посмотреть рекламку, что займет 2 минуты :)


Оцените статью
  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(9 голосов, в среднем: 5 из 5)

Опубликовано 4 комментария

  • Игорь
    Комментариев: 3

    Здравствуйте!
    А можно ли исключить дочерние рубрики не с главной страницы, а с родительской? Я имею ввиду, что бы они не появлялись в архиве родительской рубрики.

    • Виталий
      Комментариев: 267

      В файл functions.php вашей темы, добавить вот такую функцию
      function wph_only_parent_category($query) {
      if ($query->is_category())
      $query->set('category__in', array(get_queried_object_id()));
      }
      add_action('pre_get_posts', 'wph_only_parent_category');

      • Игорь
        Комментариев: 3

        Спасибо, Виталий! Задав здесь вопрос, поискал еще в сети. Нашел вот такой вариант еще:

        function no_children( $query ) {
        if ( ! is_admin() && $query->is_main_query() && $query->is_category() )
        $query->set( 'category__in', array( get_queried_object_id() ) );
        }
        add_action( 'pre_get_posts', 'no_children' );

        Принципиально чем то отличаются?

        • Виталий
          Комментариев: 267

          Разница в названии функции. У меня она называется wph_only_parent_category , а у Вас no_children. Это даже по коду не вооруженным глазом видно, если по буквам разобрать 🙂 . Так же, в вашей еще задано условие ! is_admin() && делать отсев только на сайте, но не в админке

Добавить комментарий

Заполните поля ниже. Ваш e-mail не будет опубликован. Обязательные поля помечены *

Уважаемые пользователи! При добавлении комментариев на сайт Вам следует соблюдать правила указанные под формой отправки комментариев.

Соблюдайте добавления комментариев

Это не спам *

Нажмите, чтобы добавить код в комментарий