Как создать динамический файл sitemap.xml в WordPress с помощью хуков

Sitemap.xml — важный элемент SEO-оптимизации сайта на WordPress, который помогает поисковым системам быстрее и эффективнее индексировать страницы. Большинство плагинов генерируют sitemap автоматически, но иногда нужна кастомизация или создание sitemap с особой логикой. В этом материале мы подробно разберём, как создать динамический sitemap.xml в WordPress с помощью хуков и фильтров, без использования сторонних плагинов.

Что такое sitemap.xml и зачем он нужен WordPress-сайтам

Sitemap.xml — это файл в формате XML, который содержит карту сайта, список URL, которые вы хотите проиндексировать, с дополнительной информацией: дата последнего обновления, приоритет и частота изменений. Поисковые системы, такие как Google и Яндекс, используют sitemap для более точного и быстрого обхода сайта.

В WordPress по умолчанию с версии 5.5 есть встроенный базовый sitemap, но он не всегда покрывает все ваши потребности по кастомизации, например, исключение определённых типов записей, добавление пользовательских таксономий или страниц.

Создание своего динамического sitemap даёт полный контроль и позволяет реализовать сложные правила индексации.

Использование хуков WordPress для генерации sitemap.xml

Для создания динамического sitemap мы будем использовать собственный endpoint (правило перезаписи) и PHP-функции, которые сгенерируют XML на лету. Такой подход гибче, чем создание статического файла, и не требует дополнительного обновления sitemap после изменения контента.

Основные шаги:

  • Добавить rewrite правило для sitemap.xml
  • Зарегистрировать обработчик запроса к sitemap
  • Сформировать XML с нужными URL
  • Отдать XML с правильными заголовками

Добавление rewrite правила для sitemap.xml

В functions.php вашей темы или в плагине добавим следующий код, который регистрирует правило для URL /sitemap.xml:

function wpsnippets_add_sitemap_rewrite_rule() {
    add_rewrite_rule('^sitemap\.xml$', 'index.php?wpsnippets_sitemap=1', 'top');
}
add_action('init', 'wpsnippets_add_sitemap_rewrite_rule');

Это правило говорит WordPress обрабатывать запрос к sitemap.xml через параметр wpsnippets_sitemap=1.

Регистрация query_var и обработчика

Далее нужно зарегистрировать query_var и отловить его для рендеринга XML:

function wpsnippets_register_query_var($vars) {
    $vars[] = 'wpsnippets_sitemap';
    return $vars;
}
add_filter('query_vars', 'wpsnippets_register_query_var');

function wpsnippets_template_redirect() {
    if (get_query_var('wpsnippets_sitemap')) {
        wpsnippets_generate_sitemap();
        exit;
    }
}
add_action('template_redirect', 'wpsnippets_template_redirect');

Генерация XML sitemap

Теперь создадим функцию wpsnippets_generate_sitemap, которая сформирует XML со всеми нужными URL. В примере ниже мы выводим главную страницу, страницы, записи блога и пользовательскую таксономию:

function wpsnippets_generate_sitemap() {
    header('Content-Type: application/xml; charset=utf-8');

    echo '<?xml version="1.0" encoding="UTF-8"?>\n';
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';

    // Главная страница
    echo '<url>\n';
    echo '<loc>' . esc_url(home_url('/')) . '</loc>\n';
    echo '<priority>1.0</priority>\n';
    echo '</url>\n';

    // Страницы
    $pages = get_pages(['post_status' => 'publish']);
    foreach ($pages as $page) {
        echo '<url>\n';
        echo '<loc>' . get_permalink($page->ID) . '</loc>\n';
        echo '<lastmod>' . get_post_modified_time('c', true, $page) . '</lastmod>\n';
        echo '<priority>0.8</priority>\n';
        echo '</url>\n';
    }

    // Посты блога
    $posts = get_posts(['post_type' => 'post', 'post_status' => 'publish', 'numberposts' => -1]);
    foreach ($posts as $post) {
        echo '<url>\n';
        echo '<loc>' . get_permalink($post->ID) . '</loc>\n';
        echo '<lastmod>' . get_post_modified_time('c', true, $post) . '</lastmod>\n';
        echo '<priority>0.6</priority>\n';
        echo '</url>\n';
    }

    echo '</urlset>\n';
}

Данный код прост и легко расширяем. Например, вы можете добавить пользовательские посты или таксономии, изменить приоритеты и логику включения URL.

Как оптимизировать и расширить sitemap.xml

Основное преимущество создания sitemap через хуки — возможность гибко управлять содержимым:

  • Исключать определённые страницы или категории. Например, фильтровать посты по меткам, дате или статусу.
  • Добавлять пользовательские типы записей. Если у вас есть кастомные типы записей, просто расширьте функцию генерации.
  • Кэшировать результат. Для ускорения отдачи sitemap стоит кэшировать сформированный XML в transient или на уровне сервера, особенно на больших сайтах.
  • Интеграция с плагинами. Например, если вы используете плагин Clearfy Pro, который оптимизирует работу сайта, убедитесь, что ваш sitemap не конфликтует с его настройками.

Пример исключения категорий из sitemap

Чтобы исключить из sitemap записи определённых категорий, добавим фильтрацию в выборку постов:

$excluded_categories = [12, 34]; // ID категорий для исключения
$posts = get_posts([
    'post_type' => 'post',
    'post_status' => 'publish',
    'numberposts' => -1,
    'category__not_in' => $excluded_categories,
]);

Пример кэширования sitemap

Для кэширования используем transient API WordPress:

function wpsnippets_generate_sitemap() {
    $cache_key = 'wpsnippets_sitemap_xml';
    $xml = get_transient($cache_key);
    if ($xml === false) {
        ob_start();
        // Генерация XML, как показано выше
        echo '<?xml version="1.0" encoding="UTF-8"?>\n';
        echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';
        // Ваш код генерации ссылок
        echo '</urlset>\n';
        $xml = ob_get_clean();
        set_transient($cache_key, $xml, HOUR_IN_SECONDS);
    }
    header('Content-Type: application/xml; charset=utf-8');
    echo $xml;
}

Проверка и регистрация sitemap для поисковых систем

После создания sitemap.xml по адресу https://ваш-сайт/sitemap.xml нужно убедиться, что файл доступен и правильно сформирован. Для этого можно использовать инструменты Google Search Console и Яндекс.Вебмастер.

Для уведомления поисковых систем о новом sitemap можно добавить запись в robots.txt:

User-agent: *
Sitemap: https://ваш-сайт/sitemap.xml

Или зарегистрировать sitemap в кабинете вебмастера.

Выводы и рекомендации

Создание динамического sitemap.xml на WordPress через хуки — мощный инструмент для тонкой настройки SEO. Такой подход позволяет контролировать, какие страницы и записи индексируются, и оптимизировать скорость генерации за счёт кэширования.

Проверьте совместимость с используемыми плагинами, особенно с теми, что влияют на SEO и кэширование.

Если нужна более продвинутая генерация sitemap с поддержкой видео, новостей или изображений, можно рассмотреть расширение данного кода или использование специализированных плагинов с поддержкой кастомных хуков.

WooCommerce: как изменить цену товара без повышения суммы платежа при изменении заказа
29.04.2026
Как добавить приватные поля в REST API WordPress: практические примеры
22.02.2026
Как добавить поддержку формата WebP в WordPress без плагинов
17.04.2026
Как отключить XML-RPC в WordPress без плагинов
09.02.2026
Как изменить AJAX обработку формы в WordPress на REST API
13.02.2026