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

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

Почему стоит создавать sitemap вручную через код

Плагины часто генерируют sitemap, которые содержат все типы записей и таксономий по умолчанию, что не всегда нужно. Если у вас проект с особыми требованиями — например, исключить определённые категории, страницы или пользовательские типы записей, ручное создание sitemap позволит реализовать это максимально точно.

Кроме того, кодовое решение не будет требовать обновлений плагинов, что уменьшит риски конфликтов и уязвимостей. Также это хорошая практика для понимания работы WordPress и REST API.

Создание базового sitemap в WordPress с помощью кода

Давайте рассмотрим пример, как создать простой sitemap.xml, который будет выводить URL всех опубликованных записей и страниц.

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

function wpcom_generate_sitemap() {
    if ( ! isset( $_GET['wpcom_sitemap'] ) ) {
        return;
    }

    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">';

    // Получаем все опубликованные записи
    $posts = get_posts( array(
        'post_type'      => array( 'post', 'page' ),
        'post_status'    => 'publish',
        'posts_per_page' => -1
    ) );

    foreach ( $posts as $post ) {
        $url = get_permalink( $post->ID );
        $date = get_the_modified_time( 'c', $post->ID );

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

    echo '</urlset>';
    exit;
}
add_action( 'init', 'wpcom_generate_sitemap' );

Теперь, если вы перейдёте по адресу https://ваш-сайт.ru/?wpcom_sitemap=1, вы увидите XML-карту сайта с URL всех опубликованных постов и страниц.

Как расширить sitemap: добавляем пользовательские типы записей и таксономии

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

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

Для таксономий (категорий, тегов и пользовательских таксономий) можно добавить отдельный блок URL с архивами. Например, для категорий:

$categories = get_categories( array( 'hide_empty' => false ) );
foreach ( $categories as $category ) {
    $url = get_category_link( $category->term_id );
    echo '<url>';
    echo '<loc>' . esc_url( $url ) . '</loc>';
    echo '<changefreq>weekly</changefreq>';
    echo '<priority>0.6</priority>';
    echo '</url>';
}

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

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

Пример с использованием transient API:

function wpcom_get_sitemap_cached() {
    $sitemap = get_transient( 'wpcom_sitemap_cache' );
    if ( false === $sitemap ) {
        ob_start();
        // Здесь вставьте код генерации sitemap (без header и exit)
        // например, вызов функции wpcom_generate_sitemap_content();
        wpcom_generate_sitemap_content();
        $sitemap = ob_get_clean();
        set_transient( 'wpcom_sitemap_cache', $sitemap, 12 * HOUR_IN_SECONDS );
    }
    echo $sitemap;
}

function wpcom_generate_sitemap() {
    if ( ! isset( $_GET['wpcom_sitemap'] ) ) {
        return;
    }

    header( 'Content-Type: application/xml; charset=utf-8' );
    wpcom_get_sitemap_cached();
    exit;
}
add_action( 'init', 'wpcom_generate_sitemap' );

Такой подход существенно ускорит отдачу sitemap и снизит нагрузку на сервер.

Настройка robots.txt для указания sitemap

Чтобы поисковые системы быстрее нашли вашу карту сайта, добавьте в файл robots.txt строку с URL sitemap:

Sitemap: https://ваш-сайт.ru/?wpcom_sitemap=1

Если вы используете кеш или CDN, убедитесь, что sitemap доступен без ошибок.

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

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

Для простых сайтов подойдет и встроенный в WordPress sitemap (доступен с версии 5.5), но он не всегда покрывает все кастомные нужды.

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

  • Используйте ручную генерацию sitemap, если нужен точный контроль и минимальное количество плагинов.
  • Добавляйте все важные типы записей и таксономии, чтобы поисковые системы увидели полный контент.
  • Обязательно настройте кеширование для ускорения отдачи XML.
  • Проверьте доступность sitemap в разных браузерах и валидаторах XML.
  • Добавьте ссылку на sitemap в robots.txt и Google Search Console.

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

Сервис определения шаблона и плагинов на сайте