Сценарий типичный: на страницах и части записей отзывы не нужны, но в теме они всё равно выводятся, а в админке продолжают висеть поля комментариев, уведомления и лишние блоки в редакторе. Если просто снять галочку в настройках обсуждения, это не решает задачу точечно — настройки применяются не ко всем типам записей и не всегда убирают уже существующие формы в шаблоне.
Ниже — рабочие способы отключить отзывы именно там, где это нужно: для страниц, отдельных CPT или выбранных шаблонов. Разберём, как понять, что мешает, что лучше сделать через код, а что — через плагин, и как проверить результат без догадок.
Когда проблема видна не сразу
Чаще всего отзывы «не отключаются» по одной из трёх причин: тема выводит форму вручную, у типа записи включена поддержка comments, либо старые записи уже имеют открытые обсуждения, хотя новые создаются без них. Внешне это выглядит по-разному: где-то исчезает только форма, где-то остаётся блок «Комментарии закрыты», а где-то в редакторе продолжает отображаться панель обсуждений.
Что проверить в первую очередь
- Откройте нужный тип записи в админке и посмотрите, есть ли блок «Обсуждение» в редакторе.
- Проверьте, не выводит ли тема форму комментариев напрямую через
comments_template()илиcomment_form(). - Убедитесь, что отзывы не включены глобально в Настройки → Обсуждение для новых записей.
- Посмотрите, не активен ли плагин, который добавляет комментарии поверх стандартного поведения WordPress.
Если проблема только на части контента, не стоит отключать комментарии глобально. В WordPress это почти всегда приводит к побочным эффектам: пропадают обсуждения там, где они нужны, а в теме могут остаться пустые контейнеры.
Самый надёжный способ: отключить поддержку comments у нужного типа записи
Если тип записи создаётся вашим кодом или вы можете повлиять на регистрацию CPT, лучше убрать поддержку комментариев на уровне supports. Тогда WordPress перестанет показывать блок обсуждения в редакторе и не будет считать этот тип записи комментируемым.
add_action('init', function () {
unregister_post_type('portfolio');
register_post_type('portfolio', [
'label' => 'Портфолио',
'public' => true,
'supports' => ['title', 'editor', 'thumbnail'],
'has_archive' => true,
'rewrite' => ['slug' => 'portfolio'],
]);
});Этот пример показан только как принцип: если тип записи регистрируется не вами, не переписывайте его вслепую. В реальном проекте лучше менять регистрацию в исходном плагине или теме, а не дублировать её целиком. Если CPT уже существует, а вы не хотите трогать регистрацию, можно отключить поддержку через remove_post_type_support().
add_action('init', function () {
remove_post_type_support('portfolio', 'comments');
remove_post_type_support('portfolio', 'trackbacks');
});Такой вариант проще и безопаснее, если нужно убрать только обсуждения и не ломать остальную конфигурацию типа записи.
Если нужно отключить отзывы точечно для страниц или записей
Когда задача касается уже существующего контента, удобнее фильтровать открытость комментариев по ID, шаблону или типу записи. Это полезно, если на сайте есть, например, страницы услуг без отзывов, но в блоге обсуждения должны остаться.
add_filter('comments_open', function ($open, $post_id) {
$post = get_post($post_id);
if (! $post) {
return $open;
}
if ($post->post_type === 'page') {
return false;
}
if ($post->post_type === 'post' && has_category('news', $post)) {
return false;
}
return $open;
}, 10, 2);
add_filter('pings_open', function ($open, $post_id) {
$post = get_post($post_id);
if ($post && $post->post_type === 'page') {
return false;
}
return $open;
}, 10, 2);Этот способ не удаляет старые комментарии из базы, а только закрывает возможность добавления новых. Для большинства сайтов это именно то, что нужно: история остаётся, форма исчезает, а админка не превращается в свалку пустых обсуждений.
Что делать, если тема всё равно показывает форму
Иногда WordPress считает комментарии закрытыми, но тема продолжает рендерить блок формы. Это уже не проблема ядра, а особенность шаблона. В таком случае нужно править шаблон comments.php или место, где он подключается.
Минимальная проверка: найдите в теме вызов comments_template(). Если он стоит без условий, форма и список комментариев будут выводиться всегда, когда шаблон подключён.
if (comments_open() || get_comments_number()) {
comments_template();
}Такой условный вызов обычно достаточно надёжен. Если комментарии закрыты и их нет, блок не появится. Если же тема выводит собственную форму через comment_form(), нужно оборачивать и её в проверку comments_open().
Сравнение подходов
| Способ | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
Изменить supports у CPT | Есть доступ к регистрации типа записи | Чистое решение, убирает блоки в редакторе | Нужно править код регистрации |
remove_post_type_support() | Нужно быстро отключить comments для CPT | Просто внедрить, не переписывает CPT | Не влияет на шаблон темы |
Фильтр comments_open | Нужно закрыть обсуждения точечно | Гибко по типу записи, категории, ID | Старые формы в теме могут остаться |
Пошаговое решение без лишнего риска
- Определите, где именно должны быть отключены отзывы: весь тип записи, отдельные страницы или конкретные рубрики.
- Проверьте, не выводит ли тема форму комментариев вручную.
- Если тип записи ваш — уберите поддержку
commentsиtrackbacks. - Если тип записи чужой — используйте
remove_post_type_support()или фильтрcomments_open. - Очистите кэш страницы и кэш объекта, если он есть.
- Проверьте фронтенд и админку на реальном контенте, а не только на новой записи.
Как проверить, что всё сработало
Проверка должна быть не только визуальной. Откройте запись в браузере и убедитесь, что:
- форма комментариев исчезла;
- нет блока «Комментарии закрыты», если он не нужен;
- в редакторе пропал блок «Обсуждение» для нужного типа записи;
- новые комментарии не добавляются через прямую отправку формы;
- в исходном коде страницы нет лишнего HTML-контейнера комментариев, если тема его не должна выводить.
Если используете кэш-плагин или серверный кэш, сбросьте его отдельно. Иначе можно решить, что код не работает, хотя на самом деле браузер показывает старую версию страницы.
Частые ошибки и как их исправить
Отключили комментарии в настройках, но форма осталась
Это почти всегда значит, что тема рисует форму сама. Проверьте шаблон и условие вокруг comments_template() или comment_form().
Убрали comments у CPT, но старые записи всё ещё с обсуждением
Поддержка типа записи влияет на новые и текущие экраны редактора, но не всегда автоматически закрывает уже существующие записи. Для них нужен фильтр comments_open или массовое обновление статуса обсуждений.
После правки в админке пропал блок обсуждения, но на фронтенде форма видна
Значит, логика админки и логика темы разошлись. WordPress считает комментарии закрытыми, а шаблон темы не проверяет это условие перед выводом формы.
Сломали комментарии на всём сайте
Обычно это происходит, когда фильтр написан слишком широко и не ограничен типом записи или конкретным условием. Всегда проверяйте $post->post_type и, если нужно, ID или шаблон страницы.
Безопасность и производительность
Если на сайте много спама в комментариях, отключение обсуждений на части страниц уменьшает нагрузку на модерацию и снижает риск мусора в базе. Но не удаляйте комментарии массово без бэкапа: сначала закройте их для новых отправок, потом отдельно решайте, нужно ли чистить старые записи.
Если комментарии больше не нужны вообще, лучше не просто скрыть форму, а отключить поддержку на уровне типа записи и проверить, не остались ли в теме лишние запросы к комментариям. Это особенно важно на сайтах с тяжёлыми шаблонами, где каждый блок тянет дополнительные запросы к базе.
Для более глубокой чистки WordPress и удаления лишних дублей в интерфейсе иногда используют Clearfy Pro: он помогает убрать часть технического шума, но сам по себе не заменяет корректную настройку темы и типов записей. Если нужен именно кодовый контроль, лучше оставить логику в теме или небольшом mu-plugin, а не размазывать её по нескольким плагинам.
Если хотите, чтобы правка переживала обновления темы, вынесите код в mu-plugins или в небольшой собственный плагин. Это надёжнее, чем править шаблон напрямую, особенно если проект поддерживается несколькими разработчиками.