Ситуация типовая: курс должен оставаться в поиске, а один или несколько уроков — нет. Например, это вводные материалы для студентов, страницы с внутренними инструкциями, дубли после импорта или уроки, которые вы показываете только после оплаты. В LearnPress это лучше решать точечно, а не ставить общий запрет на весь раздел.
Когда нужен точечный запрет, а не общий noindex
Если закрыть от индексации весь курс, вы потеряете трафик на полезные страницы. Если не закрыть ничего, в индекс могут попасть служебные или слабые страницы, которые создают дубли и размывают релевантность. Точечный запрет нужен, когда:
- урок доступен только зарегистрированным пользователям;
- в уроке есть временный или черновой контент;
- нужно убрать из индекса дубли после переноса материалов;
- часть уроков должна оставаться только внутри учебного процесса;
- страница урока не должна конкурировать с основной страницей курса.
Диагностика проблемы: что именно попало в индекс
Сначала проверьте, действительно ли проблема в индексации, а не в шаблоне или кэше. Откройте страницу урока и посмотрите исходный код: есть ли мета-тег noindex, не отдает ли страница заголовок X-Robots-Tag, не закрыта ли она случайно через robots.txt. Затем проверьте URL в Google Search Console: если страница уже проиндексирована, одного изменения на сайте недостаточно — потребуется переобход.
Полезно сравнить три сценария:
| Подход | Что делает | Когда подходит |
|---|---|---|
| Плагин SEO | Добавляет noindex через интерфейс | Если уроков мало и нужна ручная настройка |
| Код в теме или плагине | Ставит правило для конкретных уроков автоматически | Если уроков много и есть понятный критерий |
| robots.txt | Ограничивает обход, но не всегда удаляет URL из индекса | Только как вспомогательная мера |
Важно: robots.txt сам по себе не гарантирует удаление страницы из поиска. Для удаления из индекса нужен именно noindex или снятие доступности страницы с последующей переобработкой.
Пошаговое решение через код
Если нужно закрывать от индексации не все уроки, а только выбранные, удобнее добавить собственное правило. Самый практичный вариант — пометить уроки специальным полем и по нему отдавать noindex.
Шаг 1. Добавьте признак для урока
Ниже пример, который добавляет метаполе в редакторе урока. Его можно использовать как флаг для SEO-логики.
<?php
add_action( 'add_meta_boxes', function() {
add_meta_box(
'lp_noindex_lesson',
'SEO для урока',
function( $post ) {
$value = get_post_meta( $post->ID, '_lp_noindex_lesson', true );
wp_nonce_field( 'lp_noindex_lesson_save', 'lp_noindex_lesson_nonce' );
echo '<p><label>';
echo '<input type="checkbox" name="lp_noindex_lesson" value="1" ' . checked( $value, '1', false ) . '> ';
echo 'Запретить индексацию этого урока';
echo '</label></p>';
},
'lp_lesson',
'side',
'default'
);
} );
add_action( 'save_post_lp_lesson', function( $post_id ) {
if ( ! isset( $_POST['lp_noindex_lesson_nonce'] ) || ! wp_verify_nonce( $_POST['lp_noindex_lesson_nonce'], 'lp_noindex_lesson_save' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$value = isset( $_POST['lp_noindex_lesson'] ) ? '1' : '0';
update_post_meta( $post_id, '_lp_noindex_lesson', $value );
} );Шаг 2. Отдайте noindex только для отмеченных уроков
Дальше добавьте правило в wp_head. Оно сработает только на страницах уроков, где включен флаг.
<?php
add_action( 'wp_head', function() {
if ( ! is_singular( 'lp_lesson' ) ) {
return;
}
$post_id = get_queried_object_id();
$noindex = get_post_meta( $post_id, '_lp_noindex_lesson', true );
if ( '1' === $noindex ) {
echo '<meta name="robots" content="noindex, nofollow" />' . "\n";
}
}, 1 );Если тема или SEO-плагин уже выводит robots-мета, проверьте, не дублируется ли тег. Два разных robots-тега в head — частая причина некорректной интерпретации.
Шаг 3. При необходимости добавьте X-Robots-Tag
Для некоторых серверных конфигураций удобнее продублировать правило через HTTP-заголовок. Это особенно полезно, если страницы кэшируются и HTML меняется не сразу.
<?php
add_action( 'send_headers', function() {
if ( ! is_singular( 'lp_lesson' ) ) {
return;
}
$post_id = get_queried_object_id();
$noindex = get_post_meta( $post_id, '_lp_noindex_lesson', true );
if ( '1' === $noindex ) {
header( 'X-Robots-Tag: noindex, nofollow', true );
}
} );Не используйте этот вариант без проверки, если сайт уже отправляет заголовки в другом месте. Ошибка headers already sent здесь означает, что в теме или плагине есть ранний вывод.
Если нужен быстрый вариант без кода
Когда уроков немного, проще обойтись SEO-плагином и ручной настройкой на каждой странице. Это медленнее, но безопаснее для сайта без доработок. Минус очевиден: при большом количестве уроков ручное управление быстро становится неудобным.
Если используете Clearfy Pro, его удобно применять для точечной технической чистки и управления SEO-настройками на страницах, где не хочется править тему. Но даже в этом случае проверяйте, как именно плагин формирует мета-теги и не конфликтует ли он с другим SEO-решением.
Проверка результата после внедрения
После сохранения урока откройте его в браузере и проверьте исходный код страницы. Должен появиться либо мета-тег noindex, nofollow, либо заголовок X-Robots-Tag. Затем выполните три проверки:
- Откройте страницу в режиме инкогнито и убедитесь, что урок доступен только тем, кому он должен быть доступен.
- Проверьте исходный код на наличие одного корректного robots-мета.
- Отправьте URL на переобход в Google Search Console, если страница уже была в индексе.
Если страница продолжает показываться в поиске, это не всегда ошибка настройки. Поисковик может держать старую версию до следующего обхода. В таком случае помогает только время и повторная проверка в Search Console.
Частые ошибки и как их исправить
- Закрыли robots.txt вместо noindex. Страница может остаться в индексе как URL без контента. Используйте robots.txt только как дополнение.
- Поставили noindex на весь тип записей. В результате исчезают и полезные страницы курса. Ограничивайте правило только выбранными уроками.
- Забыли очистить кэш. На сайте продолжает отдаваться старая версия HTML. После изменения обязательно сбросьте кэш плагина, сервера и CDN.
- Дублируется robots-мета. Один тег выводит тема, второй — SEO-плагин. Оставьте один источник правды.
- Урок закрыт, но доступен через внутренние ссылки. Это нормально, если он должен быть доступен студентам. Но если страница не должна открываться вообще, нужен отдельный контроль доступа, а не только noindex.
Безопасность и производительность
Не храните логику индексации в шаблоне, если тема часто обновляется. Лучше вынести код в небольшой mu-plugin или в собственный плагин, чтобы правило не потерялось после смены темы. Это же упрощает откат и тестирование.
Если уроков много, не проверяйте метаполе на каждой странице через тяжелые запросы. В примере выше используется get_post_meta(), и для обычного сайта этого достаточно. Но если вы строите сложную схему с десятками условий, сначала проверьте, не замедляет ли она генерацию страниц и не конфликтует ли с кэширующим плагином.
Для сайтов с большим количеством учебных материалов практичнее заранее определить правило: например, все уроки из определенной категории закрываются от индексации, а открытые уроки помечаются вручную. Так проще поддерживать структуру и не ловить случайные ошибки при публикации.
Что проверить перед публикацией правки
- у урока есть понятный критерий, по которому он закрывается от индексации;
- в HTML или заголовках присутствует только одно корректное правило robots;
- кэш очищен на уровне плагина, сервера и CDN;
- страница курса при этом остается индексируемой, если это нужно;
- URL отправлен на переобход, если он уже был в поиске.
Если задача сводится не к отдельным урокам, а к целым разделам или типам страниц, лучше пересмотреть правило на уровне структуры сайта. Но для точечного сценария в LearnPress именно такой подход дает предсказуемый результат без лишней перестройки курса.