Автоматическое создание sitemap в WordPress без плагинов

Для многих сайтов на WordPress sitemap (карта сайта) является важным инструментом для SEO и правильной индексации страниц поисковыми системами. Обычно для создания sitemap используют плагины, например, популярный Yoast SEO или Google XML Sitemaps. Но иногда хочется обойтись без плагинов — чтобы снизить нагрузку, повысить безопасность или получить более гибкий контроль над процессом.

Что такое sitemap и зачем он нужен в WordPress

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

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

Как создать sitemap в WordPress без плагинов: пошаговое руководство

1. Создаем пользовательскую функцию для генерации sitemap

Все действия будем выполнять через functions.php вашей темы или в отдельном подключаемом файле. Главная идея — при обращении к специальному URL (например, /sitemap.xml) выводить XML с картой сайта.

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

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

add_action('template_redirect', 'wordpressa_sitemap_template_redirect');
function wordpressa_sitemap_template_redirect() {
    if (get_query_var('sitemap')) {
        header('Content-Type: application/xml; charset=' . get_bloginfo('charset'), true);
        echo wordpressa_generate_sitemap();
        exit;
    }
}

Эти функции регистрируют правило, которое обрабатывает запросы к /sitemap.xml, и возвращают в ответ XML-контент.

2. Генерируем XML-карту сайта с основными страницами

Функция wordpressa_generate_sitemap() собирает URL сайта — в нашем случае это главная страница, страницы, записи и категории.

function wordpressa_generate_sitemap() {
    $site_url = get_site_url();
    $posts = get_posts(array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'numberposts' => -1
    ));
    $pages = get_pages(array(
        'sort_column' => 'post_date',
        'sort_order' => 'DESC'
    ));

    $sitemap  = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
    $sitemap .= "\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";

    // Главная страница
    $sitemap .= "  <url>\n";
    $sitemap .= "    <loc>" . esc_url($site_url) . "</loc>\n";
    $sitemap .= "    <priority>1.0</priority>\n";
    $sitemap .= "  </url>\n";

    // Записи
    foreach ($posts as $post) {
        setup_postdata($post);
        $sitemap .= "  <url>\n";
        $sitemap .= "    <loc>" . get_permalink($post) . "</loc>\n";
        $sitemap .= "    <lastmod>" . get_the_modified_date('c', $post) . "</lastmod>\n";
        $sitemap .= "    <priority>0.8</priority>\n";
        $sitemap .= "  </url>\n";
    }
    wp_reset_postdata();

    // Страницы
    foreach ($pages as $page) {
        $sitemap .= "  <url>\n";
        $sitemap .= "    <loc>" . get_permalink($page) . "</loc>\n";
        $sitemap .= "    <lastmod>" . get_the_modified_date('c', $page) . "</lastmod>\n";
        $sitemap .= "    <priority>0.7</priority>\n";
        $sitemap .= "  </url>\n";
    }

    // Категории
    $categories = get_categories();
    foreach ($categories as $category) {
        $sitemap .= "  <url>\n";
        $sitemap .= "    <loc>" . esc_url(get_category_link($category->term_id)) . "</loc>\n";
        $sitemap .= "    <priority>0.6</priority>\n";
        $sitemap .= "  </url>\n";
    }

    $sitemap .= "</urlset>";
    return $sitemap;
}

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

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

Если у вас есть кастомные типы записей, например, 'portfolio', или таксономии, например, 'product_cat', их тоже стоит включить в карту сайта.

function wordpressa_generate_sitemap() {
    $site_url = get_site_url();
    $post_types = array('post', 'page', 'portfolio'); // Добавьте свои типы
    $sitemap  = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
    $sitemap .= "\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";

    // Главная страница
    $sitemap .= "  <url>\n";
    $sitemap .= "    <loc>" . esc_url($site_url) . "</loc>\n";
    $sitemap .= "    <priority>1.0</priority>\n";
    $sitemap .= "  </url>\n";

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

        foreach ($posts as $post) {
            setup_postdata($post);
            $sitemap .= "  <url>\n";
            $sitemap .= "    <loc>" . get_permalink($post) . "</loc>\n";
            $sitemap .= "    <lastmod>" . get_the_modified_date('c', $post) . "</lastmod>\n";
            $sitemap .= "    <priority>0.8</priority>\n";
            $sitemap .= "  </url>\n";
        }
        wp_reset_postdata();
    }

    // Таксономии
    $taxonomies = array('category', 'post_tag', '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) {
                $sitemap .= "  <url>\n";
                $sitemap .= "    <loc>" . esc_url(get_term_link($term)) . "</loc>\n";
                $sitemap .= "    <priority>0.6</priority>\n";
                $sitemap .= "  </url>\n";
            }
        }
    }

    $sitemap .= "</urlset>";
    return $sitemap;
}

Таким образом, вы получите расширенную sitemap, идеально подходящую под структуру вашего сайта.

Обновление правил пермалинков и тестирование sitemap

После добавления правил для обработки /sitemap.xml необходимо обновить настройки постоянных ссылок в админке WordPress: зайдите в «Настройки» → «Постоянные ссылки» и нажмите кнопку «Сохранить изменения» без изменения настроек. Это сбросит кэш правил и позволит новому URL работать.

Проверьте работу sitemap, открыв в браузере https://ваш-сайт.ru/sitemap.xml. Если все сделано правильно, вы увидите сгенерированный XML-файл.

Рекомендации и улучшения для кастомного sitemap

Собственный sitemap без плагинов дает гибкость, но требует поддержки. Вот что можно добавить:

  • Кэширование результата в transient или в файл, чтобы снизить нагрузку на сервер.
  • Разбитие sitemap на несколько частей, если сайт большой (по 50000 URL — лимит поисковиков).
  • Добавление дополнительных тегов, например, <changefreq> и <priority> с более точной настройкой.
  • Автоматическое уведомление поисковых систем о новом sitemap через функцию wp_remote_get() с запросом к API Google или Яндекса.

Пример кэширования sitemap для повышения производительности

Чтобы не генерировать XML каждый раз при обращении, используйте transient API WordPress:

function wordpressa_generate_sitemap() {
    $cache_key = 'wordpressa_sitemap_cache';
    $sitemap = get_transient($cache_key);
    if ($sitemap !== false) {
        return $sitemap;
    }

    // Генерация sitemap как раньше
    // ... код генерации sitemap ...

    // Для примера используем сокращённый код
    $sitemap = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n  <url>\n    <loc>' . esc_url(get_site_url()) . '</loc>\n  </url>\n</urlset>';

    set_transient($cache_key, $sitemap, 12 * HOUR_IN_SECONDS); // Кэш на 12 часов
    return $sitemap;
}

Это существенно снижает нагрузку на сервер при большом количестве посещений.

Альтернативы и плагины для sitemap

Если вы всё же предпочтёте использовать плагины, обратите внимание на:

  • Clearfy Pro — в том числе оптимизация SEO и генерация sitemap.
  • JournalX — тема с расширенными SEO возможностями и поддержкой sitemap.

Но собственный код даст максимум контроля и легкости.

WooCommerce: как отключить AJAX обновления в корзине и успешно решить проблемы с корзиной
27.06.2026
WooCommerce: как корректно снять приватность данных при отключении учетной записи пользователя
15.06.2026
WooCommerce: как использовать REST API для обновления корзины без перезагрузки страницы
08.06.2026
WooCommerce: как отключить AJAX обновления в корзине и успешно решить проблемы с корзиной
22.06.2026
Как создать собственный шорткод в WordPress
27.11.2025