Ядро wordpress, hooks

Filter document_title_parts

document_title_parts — это низкоуровневый фильтр WordPress, который управляет частями заголовка <title>, до того как они будут склеены в одну строку.

Разберём подробно.


🧠 Как WordPress формирует <title>

Современный WordPress (4.4+) делает так:

  1. Собирает массив частей заголовка

  2. Пропускает его через фильтр document_title_parts

  3. Склеивает части через разделитель

  4. Пропускает итог через pre_get_document_title

  5. Выводит <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-плагины используют оба.


⚠ Важно помнить


✅ Рекомендация для SEO

Для кастомного SEO:


🎯 Итог

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


🧠 Частые ошибки

❌ несколько <meta description>
❌ HTML внутри
❌ слишком длинный текст
❌ одинаковый на всех страницах


🚀 Если нужно улучшить

Можно добавить:


✅ Итог

✔ Meta description добавляется через wp_head
✔ Используется ACF
✔ Есть fallback
✔ Без конфликтов