Как создать автоматический sitemap в WordPress с помощью кода

Зачем создавать sitemap вручную в WordPress?

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

Использование плагинов для sitemap, например Clearfy Pro, упрощает задачу, но если хочется полностью контролировать процесс и избежать лишних плагинов, можно написать свой генератор sitemap на PHP.

Основные требования к sitemap.xml

Sitemap должен быть валидным XML документом, соответствовать стандарту Google Sitemap Protocol. Основные теги:

  • <urlset> — корневой элемент;
  • <url> — элемент для каждой ссылки;
  • <loc> — URL страницы;
  • <lastmod> — дата последнего изменения;
  • <changefreq> — частота изменения (optional);
  • <priority> — приоритет URL (optional).

Правильное форматирование и кодировка UTF-8 обязательны.

Создаем простейший sitemap с помощью кода

Для начала создадим функцию, которая будет выводить sitemap с URL всех опубликованных постов. Добавим её в файл functions.php вашей темы или в отдельный плагин.

function wpinrp_generate_sitemap() {
    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">';

    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1
    );
    $posts = get_posts($args);

    foreach ($posts as $post) {
        setup_postdata($post);
        $loc = get_permalink($post);
        $lastmod = get_the_modified_date('c', $post);

        echo "<url>";
        echo "<loc>" . esc_url($loc) . "</loc>";
        echo "<lastmod>" . $lastmod . "</lastmod>";
        echo "<changefreq>weekly</changefreq>";
        echo "<priority>0.8</priority>";
        echo "</url>";
    }

    wp_reset_postdata();
    echo "</urlset>";
    exit;
}

Данная функция выводит sitemap со всеми опубликованными постами, указывая дату последнего изменения, частоту обновления и приоритет.

Регистрируем endpoint для sitemap

Чтобы сделать sitemap доступным по адресу https://example.com/sitemap.xml, добавим rewrite rule и перехватим запрос.

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

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

function wpinrp_template_redirect() {
    if (get_query_var('sitemap') == 1) {
        wpinrp_generate_sitemap();
    }
}
add_action('template_redirect', 'wpinrp_template_redirect');

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

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

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

function wpinrp_generate_sitemap() {
    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">';

    $post_types = array('post', 'page', 'product'); // добавьте свои CPT

    foreach ($post_types as $post_type) {
        $args = array(
            'post_type' => $post_type,
            'post_status' => 'publish',
            'posts_per_page' => -1
        );
        $posts = get_posts($args);

        foreach ($posts as $post) {
            setup_postdata($post);
            $loc = get_permalink($post);
            $lastmod = get_the_modified_date('c', $post);

            echo "<url>";
            echo "<loc>" . esc_url($loc) . "</loc>";
            echo "<lastmod>" . $lastmod . "</lastmod>";
            echo "<changefreq>weekly</changefreq>";
            echo "<priority>0.8</priority>";
            echo "</url>";
        }
        wp_reset_postdata();
    }

    // Добавляем таксономии, например категории
    $taxonomies = array('category', 'product_cat');
    foreach ($taxonomies as $taxonomy) {
        $terms = get_terms(array('taxonomy' => $taxonomy, 'hide_empty' => true));
        if (!empty($terms) && !is_wp_error($terms)) {
            foreach ($terms as $term) {
                $loc = get_term_link($term);
                if (!is_wp_error($loc)) {
                    echo "<url>";
                    echo "<loc>" . esc_url($loc) . "</loc>";
                    echo "<changefreq>weekly</changefreq>";
                    echo "<priority>0.6</priority>";
                    echo "</url>";
                }
            }
        }
    }

    echo "</urlset>";
    exit;
}

Таким образом, в sitemap попадут все записи указанных типов и термины таксономий.

Оптимизация и кеширование sitemap

При большом количестве записей динамическая генерация sitemap может замедлять сайт. Для решения используйте кеширование.

Например, можно сохранить сгенерированный sitemap в transient и обновлять кеш раз в сутки:

function wpinrp_generate_sitemap() {
    $cached = get_transient('wpinrp_sitemap_cache');
    if ($cached !== false) {
        header('Content-Type: application/xml; charset=utf-8');
        echo $cached;
        exit;
    }

    ob_start();
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    // ... код генерации sitemap как выше ...
    echo "</urlset>";

    $sitemap_xml = ob_get_clean();
    set_transient('wpinrp_sitemap_cache', $sitemap_xml, DAY_IN_SECONDS);

    header('Content-Type: application/xml; charset=utf-8');
    echo $sitemap_xml;
    exit;
}

Это значительно снизит нагрузку на сервер.

Проверка sitemap и отправка в поисковые системы

После создания sitemap обязательно проверьте его валидность с помощью инструментов, например Google Search Console Sitemap Test или онлайн-валидаторов XML.

Затем добавьте ссылку на sitemap.xml в файл robots.txt:

Sitemap: https://example.com/sitemap.xml

И зарегистрируйте sitemap в Google Search Console и Яндекс.Вебмастере для быстрой индексации.

Заключение

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

WooCommerce: установка атрибутов товара через импорт CSV без ошибок
18.07.2026
Как отключить Emoji в WordPress: удаление и оптимизация
29.01.2026
WooCommerce: как отключить автоматическое обновление корзины при изменении товаров
22.06.2026
WooCommerce: Автоматическое удаление товаров из заказа после его отмены
21.05.2026
Как удалить старые темы в WordPress без риска для сайта
13.04.2026