
🔧 Как настроить заголовки WordPress: 4 техники через functions.php
Заголовки в WordPress, не просто текст вверху страницы. Они работают на вас сразу в четырёх направлениях: SEO (title tag в SERP), навигация (вкладка браузера), дизайн (визуальная иерархия на странице) и редакционный контроль (что пишут авторы). Но стандартных настроек админки хватает только на базовый уровень, для тонкой настройки нужен код.
Проблема обостряется, когда над сайтом работает несколько авторов. Один пишет заголовки на 120 символов и ломает вёрстку. Второй использует слова, которые ваш партнёр запретил по контракту. Третий забывает, что заголовок страницы в SERP и на сайте, это два разных поля. Руками за всеми не уследить.
Ниже, четыре конкретные техники настройки заголовков WordPress через functions.php. Каждая решает свою задачу: от автоматического усечения длины до программного запрета стоп-слов. Код использует документированные фильтры WordPress и проверен на WP 6.x, в конце, блок частых вопросов по теме.
💡 Быстрый обзор:
- Автоматически ограничиваем длину заголовка через фильтр
the_title, не даём авторам сломать вёрстку - Меняем выравнивание заголовка поста через
single.php, без плагинов и правки CSS - Блокируем публикацию постов с запрещёнными словами через хук
transition_post_status - Меняем разделитель title-тега и добавляем кастомные заголовки через метаполя
Как ограничить длину заголовка WordPress
Длинный заголовок способен разрушить самую продуманную вёрстку. На главной странице, где выводятся анонсы, заголовок из 120 символов вылезает за пределы карточки, и дизайн выглядит сломаным. Особенно больно это бьёт по сайтам с сеткой из нескольких колонок.
Решение, фильтр the_title, который обрезает заголовок до заданного лимита при выводе на странице. Сама запись в базе остаётся нетронутой, усекается только отображаемый текст.
Код для functions.php:
1 function sdstudio_limit_title_length( $title ) { 2 $max = 60; 3 if ( mb_strlen( $title ) > $max ) { 4 return mb_substr( $title, 0, $max ) . ' …'; 5 } 6 return $title; 7 } 8 add_filter( 'the_title', 'sdstudio_limit_title_length' );
Что здесь происходит: mb_strlen считает символы корректно для кириллицы (в отличие от strlen, который считает байты). При превышении лимита в 60 знаков заголовок обрезается, и в конец добавляется многоточие, читатель понимает, что это не полный текст. Число 60 можно заменить на любое другое под вашу вёрстку.
Где применять выборочно? Если обрезать заголовки нужно только в определённом месте (скажем, в виджете популярных постов), оберните add_filter в условный тег:
1 if ( is_home() || is_front_page() ) { 2 add_filter( 'the_title', 'sdstudio_limit_title_length' ); 3 }
Этот же подход работает для is_archive(), is_category() и любого другого контекста.
Как изменить выравнивание заголовка поста
Темы WordPress бывают разные. Одни дают выбор выравнивания в кастомайзере, другие, нет. Если ваша тема из второй категории, заголовок по умолчанию выводится слева, и настройки для этого в админке вы не найдёте.
Выравнивание заголовка задаётся в шаблоне single.php, файле, который отвечает за отображение отдельного поста. Всего четыре шага:

- Откройте Внешний вид → Редактор темы (или файл
single.phpчерез FTP/хостинг-панель) - Найдите строку
<?php the_title(); ?>, именно она выводит заголовок - Оберните её в тег с нужным выравниванием
Выравнивание влево (по умолчанию):
1 <?php the_title(); ?>
По центру:
1 <div style="text-align: center;"><?php the_title(); ?></div>
Вправо:
1 <div style="text-align: right;"><?php the_title(); ?></div>
- Сохраните файл и откройте любой пост, заголовок встанет в заданную позицию
Способ примитивный, но рабочий для любой темы. Более чистый вариант, добавить CSS-класс через фильтр body_class и стилизовать через таблицу стилей, но для быстрой правки инлайн-стиля достаточно.
Как заблокировать нежелательные слова в заголовках
Текстовое предупреждение авторам («пожалуйста, не пишите слово X в заголовках») работает до первого забытого дедлайна. Рано или поздно кто-то опубликует заголовок с запрещённой фразой, и в лучшем случае пост увидят внутри команды, в худшем, партнёр или конкурент.
Программная блокировка решает проблему радикально: WordPress просто не даёт опубликовать пост, если заголовок содержит стоп-слово. Автор видит сообщение об ошибке и вынужден поправить текст до публикации.

Код для functions.php:
1 function sdstudio_block_forbidden_title_words( $new_status, $old_status, $post ) { 2 if ( 'publish' !== $new_status || 'publish' === $old_status ) { 3 return; 4 } 5 6 $restricted = array( 'word1', 'word2', 'word3' ); 7 $title = $post->post_title; 8 9 foreach ( $restricted as $word ) { 10 if ( mb_stripos( $title, $word ) !== false ) { 11 wp_die( 'Ошибка: заголовок содержит запрещённое слово — «' . esc_html( $word ) . '». Измените заголовок и попробуйте снова.' ); 12 } 13 } 14 } 15 add_action( 'transition_post_status', 'sdstudio_block_forbidden_title_words', 10, 3 );
Как это работает: хук transition_post_status срабатывает при любом изменении статуса поста. Мы проверяем, что новый статус: publish, а старый: не publish (иначе каждое обновление уже опубликованного поста тоже блокировалось бы). Затем mb_stripos ищет каждое стоп-слово без учёта регистра в заголовке. Находит, wp_die останавливает публикацию с понятным сообщением.
Чтобы добавить своё слово, замените word1, word2, word3 в массиве $restricted. Слов может быть сколько угодно, функция пройдётся по всем.
Бонус: покажите авторам список запрещённых слов прямо под полем заголовка. Добавьте этот код в тот же functions.php:
1 function sdstudio_show_restricted_words_notice() { 2 $restricted = array( 'word1', 'word2', 'word3' ); 3 echo '<div style="color:#856404;background:#fff3cd;padding:6px 12px;margin:8px 0;border-radius:4px;font-size:13px;">'; 4 echo 'Запрещённые слова в заголовке: <strong>' . implode( ', ', $restricted ) . '</strong>'; 5 echo '</div>'; 6 } 7 add_action( 'edit_form_after_title', 'sdstudio_show_restricted_words_notice' );
Теперь список стоп-слов виден над редактором, авторам не придётся гадать, что именно запрещено.
Разделитель заголовков и кастомные title-теги
Разделитель заголовка, символ между названием сайта и заголовком поста в <title>. В результатах поиска он выглядит как «Название сайта | Заголовок поста» или «Название сайта, Заголовок поста». На кликабельность это напрямую не влияет, но визуально выделяет ваш сниппет среди других.
С WordPress 4.4 разделитель меняется фильтром document_title_separator. Код на три строки:
1 function sdstudio_change_title_separator( $separator ) { 2 return '|'; 3 } 4 add_filter( 'document_title_separator', 'sdstudio_change_title_separator' );
Символ в третьей строке можно заменить на любой: вертикальная черта, дефис, знак «больше», средняя точка. Не используйте спецсимволы вроде ★ или →, Google их не отображает, и ваш сниппет в выдаче будет выглядеть неряшливо.
Для версий ниже WordPress 4.4: функция wp_title устарела, но если ваш сайт до сих пор на старой версии, сначала обновитесь (вопрос безопасности), а уже потом правьте разделитель. Старый код через wp_title оставлен в документации WordPress как исторический, но не рекомендуется.
Как задать кастомный title-тег для отдельного поста
Бывают ситуации, когда title-тег для SERP должен отличаться от H1 на странице. SEO-плагины (Yoast, Rank Math) дают для этого отдельное поле. Но если вы не используете SEO-плагин, задача решается кастомным полем и фильтром pre_get_document_title.
Код для functions.php:
1 function sdstudio_custom_title_from_meta( $title ) { 2 if ( is_singular() ) { 3 $custom = get_post_meta( get_the_ID(), 'custom_post_title', true ); 4 if ( $custom ) { 5 return esc_html( $custom ); 6 } 7 } 8 return $title; 9 } 10 add_filter( 'pre_get_document_title', 'sdstudio_custom_title_from_meta', 20 );
Как использовать:
- Откройте запись, для которой нужен кастомный
<title> - В блоке «Произвольные поля» (если не видите, включите в «Настройках экрана») создайте поле с именем
custom_post_title - В значение впишите нужный title-тег, например, «Обзор плагина кеширования 2026, сравнение и тесты»
- Сохраните запись
Если кастомное поле не заполнено, WordPress использует стандартный title-тег (заголовок поста + разделитель + название сайта). Механизм срабатывает только для сингулярных страниц (is_singular), на архивах и в админке заголовки не трогаются.
Важный нюанс: pre_get_document_title имеет приоритет 20, это гарантирует, что фильтр сработает ПОСЛЕ стандартного формирования заголовка и переопределит его.
Посмотрите 6-минутное видео по теме, в нём показан визуальный процесс настройки title-тегов через админку WordPress и SEO-плагины.
⁉️🤔 Частые вопросы
Работает ли код из статьи на WordPress 6.x (актуальная версия на wordpress.org)?
Да, весь код проверен на актуальной версии WordPress. Фильтры
the_title,document_title_separatorиpre_get_document_title, часть ядра WordPress с версий 4.4-5.0 и полностью поддерживаются в WP 6.x. Единственное изменение относительно старых руководств: замена устаревшего хукаpublish_postнаtransition_post_status.
Нужно ли править functions.php дочерней темы или можно в основную?
Всегда правьте дочернюю тему. Если вы редактируете
functions.phpосновной темы, все изменения слетят при следующем обновлении. Если дочерней темы нет, создайте: это пять минут через плагин Child Theme Configurator или руками (стильstyle.css+ файлfunctions.phpс директивойTemplate:).
Можно ли добиться того же результата плагинами без кода?
Частично. Для SEO-заголовков есть Yoast SEO и Rank Math. Для ограничения длины, плагины типа Title Length Limiter, но их поддержка нестабильна. Для запрета слов и смены разделителя стандартных плагинов нет, только код. Плюс каждый лишний плагин замедляет сайт, а четыре строчки в
functions.phpне добавляют заметной нагрузки.
Что делать, если после правки functions.php сайт упал в белую страницу?
Подключитесь к серверу по FTP или через файловый менеджер хостинга, откройте
functions.phpи удалите добавленный код. Если нет доступа к FTP, зайдите в phpMyAdmin, найдите таблицуwp_options, строкуactive_pluginsи временно деактивируйте все плагины (это сбросит кеш). На будущее: перед любой правкойfunctions.phpвключайтеWP_DEBUGвwp-config.php, тогда вместо белого экрана вы увидите текст ошибки.
Влияет ли разделитель заголовка на SEO?
> Прямого влияния на ранжирование нет, Google не оценивает, стоит ли у вас | или -. Косвенное влияние есть: нестандартный разделитель (★, →) Google может не отобразить, и сниппет в выдаче станет визуально хуже. Плюс узнаваемый разделитель работает на бренд: пользователь привыкает к формату «Бренд | Заголовок» и быстрее замечает ваши результаты в SERP.
Что ставить и в какой последовательности
Четыре техники выше закрывают все основные сценарии работы с заголовками WordPress. Порядок внедрения, от простого к сложному:
Сначала поменяйте разделитель title-тега, это три строки кода и мгновенный результат в поисковой выдаче. Затем настройте кастомные <title> через метаполя, если на сайте есть ключевые страницы, которым нужен отдельный SERP-заголовок. После этого внедрите фильтр длины, он защитит вёрстку от слишком длинных заголовков без каких-либо действий со стороны авторов. И последним добавьте блокировщик стоп-слов, когда список запрещённых фраз уже согласован и утверждён.
Перед любой правкой functions.php сделайте бэкап файла, скопируйте его содержимое в текстовый редактор и сохраните локально. Это займёт десять секунд и сэкономит часы восстановления в случае ошибки.



