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

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

Зачем нужен sitemap и почему стоит создавать его вручную

Sitemap – это файл в формате XML, который содержит ссылки на все важные страницы сайта с дополнительной информацией для поисковиков: дату последнего обновления, частоту изменений, приоритет. Это помогает поисковым системам быстрее и точнее индексировать контент.

Создание sitemap вручную без плагинов позволяет:

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

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

Создание простого sitemap XML в WordPress с PHP

Основная идея — создать отдельный endpoint, например, /sitemap.xml, который будет отдавать сформированный в реальном времени XML файл с нужными URL.

Добавим функцию для генерации sitemap и зарегистрируем rewrite rule:

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

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

function wpbest_template_redirect_sitemap() {
    if (get_query_var('sitemap') == 1) {
        header('Content-Type: application/xml; charset=utf-8');
        echo wpbest_generate_sitemap_xml();
        exit;
    }
}
add_action('template_redirect', 'wpbest_template_redirect_sitemap');

function wpbest_generate_sitemap_xml() {
    $posts = get_posts(array(
        'numberposts' => -1,
        'post_type'   => array('post', 'page'),
        'post_status' => 'publish'
    ));

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

    foreach ($posts as $post) {
        $url = get_permalink($post->ID);
        $lastmod = get_post_modified_time('c', true, $post);

        $xml .= '<url>';
        $xml .= '<loc>' . esc_url($url) . '</loc>';
        $xml .= '<lastmod>' . $lastmod . '</lastmod>';
        $xml .= '<changefreq>weekly</changefreq>';
        $xml .= '<priority>0.8</priority>';
        $xml .= '</url>';
    }

    $xml .= '</urlset>';
    return $xml;
}

После добавления кода в functions.php нужно обновить правила перезаписи — зайдите в админку WordPress в «Настройки» - «Постоянные ссылки» и просто нажмите «Сохранить изменения».

Что делает этот код

  • Регистрирует правило для обработки URL /sitemap.xml.
  • Добавляет новый query var sitemap для распознавания запроса.
  • Перехватывает запрос на sitemap и выводит XML с ссылками на все опубликованные записи и страницы.

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

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

$posts = get_posts(array(
    'numberposts' => -1,
    'post_type'   => array('post', 'page', 'portfolio', 'product'),
    'post_status' => 'publish'
));

Аналогично можно добавить таксономии в sitemap, создав дополнительные блоки <url> с URL терминов. Например:

$terms = get_terms(array(
    'taxonomy' => 'category',
    'hide_empty' => true,
));

foreach ($terms as $term) {
    $term_link = get_term_link($term);
    if (!is_wp_error($term_link)) {
        $xml .= '<url>';
        $xml .= '<loc>' . esc_url($term_link) . '</loc>';
        $xml .= '<changefreq>weekly</changefreq>';
        $xml .= '<priority>0.6</priority>';
        $xml .= '</url>';
    }
}

Оптимизация и кеширование sitemap для крупных сайтов

Если на сайте много записей — генерация sitemap на каждый запрос может нагрузить сервер. Чтобы этого избежать, стоит реализовать кеширование результата в файл или с помощью Transients API.

Пример кеширования в файл:

function wpbest_generate_sitemap_xml() {
    $cache_file = WP_CONTENT_DIR . '/sitemap-cache.xml';
    $cache_time = 3600; // 1 час

    if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
        return file_get_contents($cache_file);
    }

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

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

    foreach ($posts as $post) {
        $url = get_permalink($post->ID);
        $lastmod = get_post_modified_time('c', true, $post);

        $xml .= '<url>';
        $xml .= '<loc>' . esc_url($url) . '</loc>';
        $xml .= '<lastmod>' . $lastmod . '</lastmod>';
        $xml .= '<changefreq>weekly</changefreq>';
        $xml .= '<priority>0.8</priority>';
        $xml .= '</url>';
    }

    $xml .= '</urlset>';

    file_put_contents($cache_file, $xml);

    return $xml;
}

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

Интеграция с плагинами и расширения функционала

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

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

Пример добавления hreflang

$languages = array(
    'ru' => get_permalink($post_ru->ID),
    'en' => get_permalink($post_en->ID)
);

$xml .= '<url>';
$xml .= '<loc>' . esc_url($languages['ru']) . '</loc>';
foreach ($languages as $lang => $link) {
    $xml .= '<xhtml:link rel="alternate" hreflang="' . $lang . '" href="' . esc_url($link) . '" />';
}
$xml .= '</url>';

Итоги и рекомендации по созданию sitemap в WordPress

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

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

Если хотите упростить задачи управления SEO, обратите внимание на плагины из WPSHOP, которые дополнят и автоматизируют многие процессы.

Как создать свой плагин WordPress с нуля
10.11.2025
Как откатить обновление WordPress до предыдущей версии
05.04.2026
Как удалить метаданные из медиа файлов WordPress для защиты конфиденциальности
22.02.2026
Как разрешить доступ к wp-admin по IP-адресам в WordPress
18.03.2026
Как использовать WPCommunity для создания сообщества на WordPress
12.02.2026