Как сделать автоматический XML Sitemap в WordPress без плагинов

Зачем нужен XML Sitemap в WordPress

XML Sitemap — это файл, который помогает поисковым системам, таким как Google и Яндекс, лучше индексировать ваш сайт. Он содержит список всех доступных страниц, постов и других типов контента, что значительно ускоряет и облегчает процесс сканирования сайта. Многие используют готовые плагины для создания sitemap, например, Yoast SEO или Rank Math, но иногда полезно знать, как реализовать это самостоятельно, чтобы минимизировать количество плагинов и повысить производительность сайта.

В этой статье мы подробно разберём, как создать динамический XML Sitemap на WordPress с помощью собственного кода, который автоматически обновляется при добавлении нового контента.

Как создать XML Sitemap без плагинов — базовая логика

Основная идея — создать отдельный endpoint (URL) на сайте, который будет выдавать XML-файл с актуальным списком ссылок. Для этого мы добавим правило в rewrite API WordPress, обработаем запрос и сформируем корректный XML.

Преимущества такого подхода:

  • Отсутствие лишних плагинов — меньше нагрузки на сайт.
  • Гибкость и контроль над структурой sitemap.
  • Возможность оптимизации под свои нужды.

Создание rewrite правила и обработчика sitemap

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

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

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

function wpdigest_template_redirect() {
    if (get_query_var('wpdigest_sitemap')) {
        wpdigest_generate_sitemap_xml();
        exit;
    }
}
add_action('template_redirect', 'wpdigest_template_redirect');

Объяснение кода:

  • add_rewrite_rule добавляет правило, чтобы запрос к /sitemap.xml обрабатывался нашим параметром wpdigest_sitemap.
  • add_filter('query_vars') регистрирует этот параметр в WordPress.
  • template_redirect перехватывает запрос и вызывает функцию генерации sitemap, если параметр установлен.

После добавления этого кода необходимо обновить правила перезаписи, перейдя в админке WordPress в Настройки > Постоянные ссылки и просто нажав кнопку «Сохранить изменения».

Генерация XML Sitemap с постами и страницами

Создадим функцию wpdigest_generate_sitemap_xml(), которая выведет sitemap в формате XML. В этом примере мы включим в sitemap страницы, записи и произвольные типы постов (если нужно, их можно расширить).

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

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

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

    // Получаем все опубликованные записи и страницы
    $args = array(
        'post_type' => array('post', 'page'),
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby' => 'modified',
        'order' => 'DESC',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $loc = get_permalink();
            $lastmod = get_post_modified_time('c');
            echo "<url><loc>" . esc_url($loc) . "</loc><lastmod>" . $lastmod . "</lastmod><priority>0.8</priority></url>";
        }
        wp_reset_postdata();
    }

    echo '</urlset>';
}

Объяснение:

  • Заголовок Content-Type сообщает браузеру и поисковикам, что это XML файл.
  • Добавляем главную страницу с приоритетом 1.0 — это важно для SEO.
  • Запрашиваем все опубликованные посты и страницы, сортируя по дате изменения.
  • Для каждого элемента выводим URL, дату последнего изменения и приоритет.

Добавление пользовательских типов записей и таксономий в sitemap

Если у вас есть сайты с кастомными типами постов (например, портфолио, товары, отзывы), их тоже можно включить в sitemap. Для этого достаточно добавить нужные типы в массив аргументов:

$args = array(
    'post_type' => array('post', 'page', 'portfolio', 'product'), // добавляем свои типы
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'orderby' => 'modified',
    'order' => 'DESC',
);

Кроме того, полезно добавить sitemap для таксономий — категорий и тегов. Это делается отдельным циклом:

$taxonomies = array('category', 'post_tag');
foreach ($taxonomies as $taxonomy) {
    $terms = get_terms(array(
        'taxonomy' => $taxonomy,
        'hide_empty' => true,
    ));

    if (!empty($terms) && !is_wp_error($terms)) {
        foreach ($terms as $term) {
            $term_link = get_term_link($term);
            if (!is_wp_error($term_link)) {
                echo "<url><loc>" . esc_url($term_link) . "</loc><priority>0.6</priority></url>";
            }
        }
    }
}
<

Это позволит поисковикам быстрее индексировать все важные разделы сайта.

Как проверить и отладить созданный sitemap

После реализации sitemap откройте в браузере https://ваш-сайт.ru/sitemap.xml. Вы должны увидеть валидный XML с тегами <urlset>. Если выдаёт ошибку 404, проверьте, обновлены ли правила перезаписи (перейдите в Настройки постоянных ссылок и нажмите «Сохранить»).

Для проверки валидности XML можно использовать сервисы Google Search Console или https://www.xml-sitemaps.com/validate-xml-sitemap.html.

Также можно добавить sitemap в файл robots.txt, чтобы поисковики быстрее его нашли:

function wpdigest_add_sitemap_to_robots($output, $public) {
    if ($public) {
        $output .= "\nSitemap: " . home_url('/sitemap.xml') . "\n";
    }
    return $output;
}
add_filter('robots_txt', 'wpdigest_add_sitemap_to_robots', 10, 2);

Заключение и рекомендации по производительности

Самодельный sitemap — это отличный способ лучше контролировать индексацию сайта. Однако при большом количестве записей стоит подумать о кэшировании результата, чтобы не нагружать базу данных на каждом запросе.

Пример простого кэширования с использованием Transients API:

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

    $cached_sitemap = get_transient('wpdigest_sitemap_cache');
    if ($cached_sitemap !== false) {
        echo $cached_sitemap;
        return;
    }

    ob_start();
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    echo '<url><loc>' . esc_url(home_url('/')) . '</loc><priority>1.0</priority></url>';

    // Получение постов и страниц как ранее
    $args = array(
        'post_type' => array('post', 'page'),
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby' => 'modified',
        'order' => 'DESC',
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $loc = get_permalink();
            $lastmod = get_post_modified_time('c');
            echo "<url><loc>" . esc_url($loc) . "</loc><lastmod>" . $lastmod . "</lastmod><priority>0.8</priority></url>";
        }
        wp_reset_postdata();
    }

    echo '</urlset>';

    $sitemap_output = ob_get_clean();
    set_transient('wpdigest_sitemap_cache', $sitemap_output, HOUR_IN_SECONDS);

    echo $sitemap_output;
}

Таким образом, sitemap будет генерироваться не чаще раза в час, снижая нагрузку.

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

Как удалить пустые категории в WordPress с помощью кода
18.12.2025
WooCommerce: как автоматически изменять цены товаров при сменах валюты
06.05.2026
Как автоматизировать удаление старых медиафайлов в WordPress
03.03.2026
Как использовать Redis для кэширования в WordPress
20.01.2026
WooCommerce: как автоматически менять цены товаров при смене валюты
07.06.2026