Скрываем отдельную запись в WordPress отовсюду или выборочно
Приветствую, дорогие посетители.
Если у вас возникла задача скрыть запись (пост, новость) из общего анонса статей, категории, локального поиска, RSS и т.д., но при этом она должна быть доступна по ссылке, то прочтя данный материал, вы сможете реализовать задуманное.
Данная возможность, к примеру, пригодится в случае, если текст будущей статьи уже написан, а картинки ещё не подоспели или не готовы. В данной ситуации самым логичным будет разместить такую статью, чтобы поисковые системы её проиндексировали, а когда картинки будут подготовлены и размещены, просто добавить их в материал и отобразить запись.
У вас может возникнуть вопрос, как же интернет поисковики узнают о новой статье, если на сайте она нигде видна не будет. Многие вебмастера создают и используют карту сайта, ссылку на которую прописывают в файле robots.txt и\или добавляют в сервисы для вебмастеров, которые предлагают сами поисковые системы. В карте сайта ссылка на «скрытую» статью будет прописана, благодаря чему поисковые системы проиндексируют материал.
Штатно WordPress не позволяет это сделать – статью можно либо скрыть полностью с сайта (она не будет доступна никому), либо разрешить её просмотр только после ввода пароля. Но в нашем случае этого явно недостаточно.
Скрываем запись в WordPress с помощью кода
При использовании кода, который вписывается в файл functions.php используемой вами темы, можно быстро скрыть запись с главной страницы, из категории и RSS ленты.
function exc_post($query) < if ($query->is_category || ($query->is_home || ($query->is_feed))) set('post__not_in', array(381, 390) );> // в скобочках id поста (записи) return $query; > add_filter('pre_get_posts','exc_post');
Впишите в файл functions.php (перед изменением не забудьте сделать резервную копию) приведённый код. В приведённом примере скрываются записи под номером 381, 390. В вашем случае, естественно, номера записей и их количество может и, скорее всего, будет другим.
Узнать номер записи, под которым идёт та или иная статья, предельно просто. Для этого необходимо в админ панель перейти в раздел Записи и либо навести курсор и подчеркнуть номер в отобразившейся ссылке-подсказке, либо открыть статью на редактирование и увидеть номер в адресной строке.

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

Можно отметить скрытие сразу отовсюду, а можно выборочно, а именно:
- SELECT ALL – сразу отовсюду
- Hide on frontpage – из списка с главной страницы
- Hide on categories – из категорий
- Hide on search – из результатов локального поиска по сайту
- Hide on tags page – со страниц тегов
- Hide on authors page – со страницы списка статей автора
- Hide on date archive – из архивов по датам
- Hide in RSS Feed – из RSS ленты
- Hide on blog page (The POSTS PAGE that is selected in Settings -> Reading) – со страницы записей (данная страница отображается только тогда, когда включена в Настройка ->Чтение)
- Hide from post navigation – скрывает ссылку на запись в html тегах rel=»next» и rel=»prev»
Плагин также может скрывать и страницы, однако по умолчанию данная возможность отключена и включается в настройках плагина.
Ну вот, собственно, и всё, что я хотел вам поведать в данном материале. Если у вас вопросы, немедля излагайте их в комментариях к материалу! 🙂
Фанатам «Секретных материалов» посвящается, или Как исключить страницу из навигации

Здравствуйте, дорогие друзья и гости моего блога! Рассказывая в прошлом посте о создании страниц на блоге, я упомянула о том, что по умолчанию все вновь созданные страницы автоматически помещаются в главное меню блога.
Недавно я для себя вывела некое правило, которое применимо не только к ведению блога, но и вообще к жизни в целом. Звучит оно примерно так: «Чем автоматизированнее процесс, тем более пристального внимания к себе он требует». А попросту говоря: если где-то что-то делается само, то все равно потом придется результат дорабатывать под себя.
К чему это я? Да к тому, что оно-то удобно, когда страницы помещаются в меню автоматом, но иногда как раз нужно этого избежать, и новые страницы не показывать ни в меню, ни в карте блога.
Например, у вас на блоге есть страница со ссылками на скачивание, которые вы раздаете за подписку. Разумеется, ее нужно спрятать со всеобщего обозрения. Или вы благодарите человека, оставившего первый комментарий у вас на блоге, перенаправив его на страницу с россыпью спасибок, воздушных шариков, зайцами в реверансе и т.д. Естественно, такую страницу в меню выводить незачем.
В общем, причин скрывать страницы из навигации и удалить их из меню и карты блога может быть много, а решение для всех случаев одно. Точнее, два. Я расскажу вам о том, как удалить страницы из меню при помощи плагина Exclude Pages и без использования оного. А затем мы посмотрим, как же удалить ссылку на страницу из карты блога.
Как удалить страницы из меню при помощи плагина Exclude Pages
Плагин — это всегда самое удобное решение (для блогера, но не для сервера, где блог «живет»), поэтому удалять страницы из навигации при помощи Exclude Pages — сплошное удовольствие:

- Скачиваем плагин
- Разархивируем его в папку с плагинами вашего блога: \wp-content\plugins
- Активируем в админке
- Исключаем и включаем страницы в меню блога, снимая и ставя галочку в поле, которое добавляет Exclude Pages на страницу редактирования страницы (упс, тавтология вышла ):
На этом с этим плагином все. Никаких настроек у него нет, а для удаления страницы из меню просто отжимаете галочку и сохраняетесь/обновляетесь. Но мы же бережем свой блог, заботимся о скорости его загрузки, не так ли?
Если логически подумать, то зачем нужен плагин, если мы с вами создаем статические страницы крайне редко, и на каждом блоге их можно по пальцам пересчитать (я сейчас говорю о классических блогах. С сайтами, созданными на основе WordPress в основном из статических страниц, ситуация другая — им такой плагин может быть нужен как воздух)? Поэтому самое время озадачиться вопросом,
Как удалить страницы меню без плагина
Здесь у нас последовательность манипуляций будет немного сложнее, но если вы все повторите за мной в точности, то проблем не возникнет. Web-Кошка гарантирует, как говорится …
Главное меню блога формирует и выводит функция wp_list_pages (). Ей можно указать, какие страницы пропустить при создании меню, или наоборот, назвать список страниц, строго из которых мы хотим меню сформировать. За исключение отвечает параметр exclude=ID , за включение — include=ID .
Что такое ID? Это номер вашей страницы, который присваивает ей база данных для удобной обработки информации. У каждой страницы, записи, рубрики есть свой уникальный ID. Значит, чтобы исключить какие-то страницы из меню, мы должны знать их ID, чтобы указать их в функции.
Итак, чтобы удалить страницу из меню блога без плагина, нужно:

- Узнать ID нужных страниц. Как это сделать?
В режиме редактирования интересующей вас страницы посмотрите на адресную строку браузера. Там вы увидите что-то вроде http://drupalomania/wp-admin/post.php? post=39 &action=edit# . Так вот post=ID. То есть ID моей страницы — 39. Так пройдитесь по всем ненужным в меню страницам и запомните (а лучше запишите) все ID. - Теперь нужно найти функцию wp_list_pages () в файлах вашей темы оформления. Обычно она кроется в functions.php, но может находиться и в header.php, и в footer.php. Чтобы не гадать, воспользуемся поиском по тексту файлов, встроенному в Total Commander. Перейдем в папку установленной темы оформления (1). Откроем окно поиска (2). Отметим галочкой «С текстом» (3). Скопируем название функции без скобок на конце (4) и запустим поиск (5). В нижней части окна мы получим список всех файлов, где прописана эта функция (6).
- Если файлов несколько (как у меня), то обычно нам нужен файл functions.php. Хотя если его нет в списке, то можно позкспериментировать, изменяя функцию в разных файлах и смотря на результат. Главное, использовать Notepad++ и не забывать откатывать ошибочные действия, используя сочетание клавиш CTRL+Z при ошибке или поломке блога.
- Узнать, какой именно файл нужен, можно по комментариям, которыми нормальные разработчики тем всегда обильно снабжают все файлы. Так, у меня в functions.php такой код:
// Generates the menu function greenpark_globalnav() < if ( $menu = str_replace( array( "\r", "\n", "\t" ), '', wp_list_pages('title_li=&echo=0&depth=1' ) ) ) echo apply_filters( 'globalnav_menu', $menu );
wp_list_pages('title_li=&echo=0&depth=1' )
то вставлять параметр для исключения страниц нужно так:
wp_list_pages('exclude=36&title_li=&echo=0&depth=1' )
Вот таким незамысловатым способом можно вручную удалить ненужные страницы из меню блога.
Кстати, если ваша тема поддерживает настраиваемые меню, то решение нашей проблемы вообще лежит на поверхности: достаточно создать нужное меню, просто указав страницы, записи, ссылки и рубрики, которые будут в него включены.
Проверить поддержку темой настраиваемых меню можно на вкладке «Меню» пункта «Внешний вид» в админке.

UPD: Оказывается, от моего внимания ускользнул самый очевидный и лежащий на поверхности способ скрытия страниц из меню: достаточно просто изменить ее видимость с «Публичное» на «Личное». Делается это на странице редактирования страницы (и вновь прошу прощения за повтор). Находите справа от поля редактора строчку «Видимость» и кликаете по «Редактировать»:

Поле «Видимость» развернется, и вы сможете изменить статус статьи с публичной, то есть видимой всем, на личную, то есть видимую только вам: Соответственно, из меню такая страница исчезнет. За этот способ отдельное спасибо Александру, который предложил и протестировал его!
Предположим, тем или иным способом мы страницы из меню удалили.
Но это не полностью решает нашу задачу: спрятать страницу от любопытных глаз. Ведь эта страница по-прежнему будет видна в карте блога. Поэтому я приглашаю вас плавно переместиться в следующий урок, в котором мы и поговорим о том, что такое карта блога, как ее создать и как исключить из нее определенные страницы.
Пригласить-то пригласила, а статья на эту тему еще не опубликована, так что заклинаю вас: подписывайтесь на обновления блога, дабы не пропустить момент, когда она (а также другие не менее интересные статьи) наконец-то появится на блоге Web-Кошки! А на сегодня все, и я с сожалением прощаюсь с вами, дорогие друзья!
Похожие статьи
«Легкий» лайтбокс без плагина: jQuery-плагин Highslide
Сен 20th, 2015 1 комментарий
Как скрыть wp-admin и wp-login.php от атак
Скрытие wp-admin — это простой, но эффективный способ уменьшить количество атак со стороны тупых ботов и хакеров. Это отличный инструмент для уменьшения поверхности атаки.
С WP Cerber Security вы можете сделать это несколькими щелчками мыши.

Settings to hide wp-admin and wp-login.php
Как защитить WordPress с помощью Fail2Ban
Коротко о дорожном инспекторе
Пользовательская страница входа для WordPress
Превратите свой WordPress в Форт-Нокс
Previous Post
Security Blog
Ограничить попытки входа без плагина?
WP Cerber Security 2.7.2
Gregory
I'm a team lead in Cerber Tech. I'm a software & database architect, WordPress - PHP - SQL - JavaScript developer. I started coding in 1993 on IBM System/370 (yeah, that was amazing days) and today software engineering at Cerber Tech is how I make my living. I've taught to have high standards for myself as well as using them in developing software solutions.

WordPress Security Blog
- WP Cerber Security 9.5.7 September 5, 2023
- WP Cerber Security 9.5.6 August 31, 2023
- WP Cerber Security 9.5.5 August 21, 2023
WP Cerber Security 9.5.7
Posted by Gregory on 5th September '23
English version: WP Cerber Security 9.5.7 Новая функция: запоминание устройств пользователей при использовании 2FA. Когда.
WP Cerber Security 9.5.6
Posted by Gregory on 31st August '23
English version: WP Cerber Security 9.5.6 Основные улучшения Мы представили возможность отправлять коды проверки 2FA через SMTP.
WP Cerber Security 9.5.5
Posted by Gregory on 21st August '23
English version: WP Cerber Security 9.5.5 Пока мы работаем над следующим крупным выпуском WP Cerber, это обновление содержит.
WP Cerber Security 9.5.3
Posted by Gregory on 23rd March '23
English version: WP Cerber Security 9.5.3 С такими инструментами кодирования ИИ, как ChatGPT, которые произвели революцию в.
Программа WP Cerber Bug Bounty
Posted by Gregory on 4th March '23
English version: WP Cerber Bug Bounty Program Наши клиенты доверяют нам защиту своих веб-сайтов, и мы глубоко привержены.
WP Cerber Security 9.5
Posted by Gregory on 11th February '23
English version: WP Cerber Security 9.5 Когда дело доходит до безопасности WordPress, нет ничего важнее, чем иметь поставщика.
Скрываем статью с главной страницы и не только
Не знал, что актуально скрыть статью с главной страницы. А нет, оказывается актуально для блогеров статейщиков. Скрывая записи с лены на главной страницы они, вроде как, не дают простым пользователям просматривать проходные статьи. Спорный момент…
- Так вот. Как сие реализовать? Очень просто. можно конечно воспользоваться плагином, но это не наш метод. Мы ведь не ищем легких путей?! Итак, самый простой вариант использовать произвольные поля (метабоксы). к содержанию
Создаем нужное поле
Для создания поля будем использовать плагин Advanced Custom Fields. Функционала бесплатной версии более чем достаточно. Прежде чем создать поле, требуется создать группу полей

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

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

Тип поля выбираем Истина/Ложь. По окончании заполнения полей не забываем нажать кнопку Обновить к содержанию
Магия хука 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
