Ядро wordpress, hooks
Filter document_title_parts
document_title_parts — это низкоуровневый фильтр WordPress, который управляет частями заголовка <title>, до того как они будут склеены в одну строку.
Разберём подробно.
🧠 Как WordPress формирует <title>
Современный WordPress (4.4+) делает так:
-
Собирает массив частей заголовка
-
Пропускает его через фильтр
document_title_parts -
Склеивает части через разделитель
-
Пропускает итог через
pre_get_document_title -
Выводит
<title>
Схема:
document_title_parts → pre_get_document_title → <title>
🔎 Что такое document_title_parts
Это фильтр, который возвращает массив:
array(
'title' => 'Заголовок страницы',
'page' => 'Page 2',
'tagline' => 'Описание сайта',
'site' => 'Название сайта',
);
WordPress сам решает, какие части включать.
📌 Пример стандартного массива
Для поста:
array(
'title' => 'Название поста',
'site' => 'Название сайта',
);
Для главной:
array(
'site' => 'Название сайта',
'tagline' => 'Описание сайта',
);
✅ Как использовать document_title_parts
Пример: заменить только title
add_filter('document_title_parts', function ($parts) {
if (is_singular()) {
$seo_title = get_field('seo_title');
if ($seo_title) {
$parts['title'] = $seo_title;
}
}
return $parts;
});
✔ меняется только заголовок
✔ имя сайта остаётся
✔ слоган остаётся (если включён)
🔥 Пример: убрать название сайта
add_filter('document_title_parts', function ($parts) {
unset($parts['site']);
return $parts;
});
Результат:
<title>Заголовок страницы</title>
🔥 Пример: кастомный порядок
add_filter('document_title_parts', function ($parts) {
return array(
'title' => $parts['title'],
'site' => $parts['site'],
);
});
🆚 document_title_parts vs pre_get_document_title
| Фильтр | Что меняет | Когда использовать |
|---|---|---|
document_title_parts |
части title | тонкая настройка |
pre_get_document_title |
весь title строкой | полный контроль |
👉 SEO-плагины используют оба.
⚠ Важно помнить
-
document_title_partsне выводит<title> -
он НЕ строка, а массив
-
pre_get_document_titleсрабатывает позже
✅ Рекомендация для SEO
Для кастомного SEO:
-
использовать
document_title_parts→ управлять логикой -
использовать
pre_get_document_title→ крайний приоритет
🎯 Итог
✔ document_title_parts — управляет частями <title>
✔ Работает до склейки
✔ Позволяет убрать site/tagline/page
✔ Идеален для SEO без дублирования
Action wp_head
🔹 Добавление SEO Description
✅ Правильный способ в WordPress (через фильтр)
❌ НЕ делаем echo <meta> в шаблоне
✔ используем wp_head
🧩 Универсальный код (посты, страницы, таксономии)
add_action('wp_head', function () {
$description = '';
// Посты и страницы
if (is_singular()) {
$description = get_field('seo_desc');
}
// Категории и метки
elseif (is_category() || is_tag()) {
$term = get_queried_object();
$description = get_field('seo_desc', $term);
}
// Фолбэк — excerpt или описание термина
if (!$description) {
if (is_singular()) {
$description = get_the_excerpt();
}
elseif (is_category() || is_tag()) {
$term = get_queried_object();
$description = term_description($term);
}
}
if (!$description) {
return;
}
// Чистим HTML и лишние пробелы
$description = wp_strip_all_tags($description);
$description = trim(preg_replace('/\s+/', ' ', $description));
echo '<meta name="description" content="' . esc_attr($description) . '">' . "\n";
});
🔎 Почему именно так
✔ Работает для:
-
постов
-
страниц
-
категорий
-
меток
✔ Без дублей
✔ Без XSS
✔ Совместимо с темами и плагинами
🎯 Лучшие практики SEO Description
-
120–160 символов (RU)
-
70–155 (моб)
-
уникальный
-
без кавычек
-
не повторять title
-
коммерческий посыл (если уместно)
🧠 Частые ошибки
❌ несколько <meta description>
❌ HTML внутри
❌ слишком длинный текст
❌ одинаковый на всех страницах
🚀 Если нужно улучшить
Можно добавить:
-
seo_desc_enдля EN версии -
авто-обрезку до 160 символов
-
приоритет для главной
-
проверку
noindex -
фильтр
wpseo_metadesc(если используешь Yoast)
✅ Итог
✔ Meta description добавляется через wp_head
✔ Используется ACF
✔ Есть fallback
✔ Без конфликтов