Скрываем статью с главной страницы и не только

Не знал, что актуально скрыть статью с главной страницы. А нет, оказывается актуально для блогеров статейщиков. Скрывая записи с лены на главной страницы они, вроде как, не дают простым пользователям просматривать проходные статьи. Спорный момент…

Так вот. Как сие реализовать? Очень просто. можно конечно воспользоваться плагином, но это не наш метод. Мы ведь не ищем легких путей?! Итак, самый простой вариант использовать произвольные поля (метабоксы).

к содержанию

Создаем нужное поле

Для создания поля будем использовать плагин Advanced Custom Fields. Функционала бесплатной версии более чем достаточно. Прежде чем создать поле, требуется создать группу полей

Создаем группу полей в ACF

Затем уже в группе создать поле

Добавляем поле

И заполнить нужные поля

Заполняем нужные поля

Тип поля выбираем Истина/Ложь. По окончании заполнения полей не забываем нажать кнопку Обновить

к содержанию

Магия хука pre_get_posts

Поле у нас есть, теперь надо заставить его работать. Для исключения записи из цикла главной страницы будем использовать хук pre_get_posts, который и позволяет производить манипуляции с циклом. Более подробно можно прочитать у Камы здесь.

Скрываем запись с главной

Чтобы скрыть только с главной используем условный тег is_home и нужная функция будет выглядеть так

// скрываем помеченные посты с главной
function art_exclude_posts($query) {
	if (is_admin())
	 return $query;

	$exclude = array();
	if ( $query->is_main_query() && (is_home()) ) { // здесь добавляем нужные уcловные теги
			$posts = get_posts(array(
				'post_type' => 'post',
				'meta_query' => array(
					array(
						'key' => 'art_exclude_home', // название поля
						'value' => '1',
						'compare' => '=',
					),
				),
			));
			foreach($posts as $hide) {
				$exclude[] = $hide->ID;
			}
			$query->set('post__not_in', $exclude);
		}
	return $query;
}
add_filter( 'pre_get_posts', 'art_exclude_posts' );

Добавьте сей код в файл function.php

к содержанию

Скрываем запись с главной и страницы архивов

Чтобы убрать еще из ленты рубрик воспользуемся тегом is_archive и получим

// скрываем помеченные посты с главной
function art_exclude_posts($query) {
	if (is_admin())
	 return $query;

	$exclude = array();
	if ( $query->is_main_query() && (is_home() || is_archive() ) ) { // здесь добавляем нужные уcловные теги
			$posts = get_posts(array(
				'post_type' => 'post',
				'meta_query' => array(
					array(
						'key' => 'art_exclude_home', // название поля
						'value' => '1',
						'compare' => '=',
					),
				),
			));
			foreach($posts as $hide) {
				$exclude[] = $hide->ID;
			}
			$query->set('post__not_in', $exclude);
		}
	return $query;
}
add_filter( 'pre_get_posts', 'art_exclude_posts' );
к содержанию

Скрываем запись с главной страницы, страницы архивов и RSS

Так как при публикации запись отправляется в RSS-ленту, то чтобы полноценно скрыть воспользуемся тегом is_feed. Получим такой код

// скрываем помеченные посты с главной
function art_exclude_posts($query) {
	if (is_admin())
	 return $query;

	$exclude = array();
	if ( $query->is_main_query() && (is_home() || is_archive() || is_feed()) ) { // здесь добавляем нужные уcловные теги
			$posts = get_posts(array(
				'post_type' => 'post',
				'meta_query' => array(
					array(
						'key' => 'art_exclude_home', // название поля
						'value' => '1',
						'compare' => '=',
					),
				),
			));
			foreach($posts as $hide) {
				$exclude[] = $hide->ID;
			}
			$query->set('post__not_in', $exclude);
		}
	return $query;
}
add_filter( 'pre_get_posts', 'art_exclude_posts' );

Вот и все:) Более подробно в видео

П.С. Задавайте вопросы в комментариях и не забывайте подписываться на канал WPRUSe

    Об авторе
    Артем Абрамович

    Автор и ведущий проекта «Финты WordPress». WordPress & WooCommerce разработчик. Четыре года создаю плагины и темы. В свободное время пишу статьи, видеообзоры, гайды.