Skip to main content

Работа с провайдерами sitemap

В контексте WordPress провайдер sitemap — это класс, который отвечает за генерацию определённого набора URL внутри XML-карты сайта.

Проще говоря:

Провайдер = источник данных для sitemap.

📌 Как это устроено внутри WordPress

Начиная с версии 5.5 в WordPress появился класс:

WP_Sitemaps

Он управляет всей системой sitemap и подключает провайдеры.

Каждый провайдер отвечает за свой тип данных.

По умолчанию есть три:

Провайдер Что генерирует
posts записи, страницы, custom post types
taxonomies категории, теги, кастомные таксономии
users архивы авторов

🔎 Пример структуры


/wp-sitemap.xml

Это индекс. В нём ссылки на:


/wp-sitemap-posts-post-1.xml /wp-sitemap-taxonomies-category-1.xml /wp-sitemap-users-1.xml

Каждый из этих файлов формируется отдельным провайдером.


📦 Что делает провайдер технически

Каждый провайдер — это класс, наследующий:


WP_Sitemaps_Provider

Он обязан реализовать два метода:


get_url_list( $page_num, $subtype ) get_max_num_pages( $subtype )
🔹 get_url_list()

Возвращает массив URL для текущей страницы sitemap.

🔹 get_max_num_pages()

Возвращает количество страниц sitemap (если URL много).


🧠 Простая аналогия

Представьте sitemap как каталог:

  • Индекс — оглавление

  • Провайдер — глава каталога

  • get_url_list() — список страниц в главе


💡 Почему это удобно

Провайдеры позволяют:

  • отключить стандартные данные

  • добавить собственные URL

  • изменить логику выборки

  • добавить кастомный sitemap (например, для API или фильтров)

✅ Отключаем стандартные провайдеры

Добавьте в functions.php или в плагин:



add_filter('wp_sitemaps_add_provider', function ($provider, $name) { 
  // отключаем стандартные: posts, taxonomies, users 
  if (in_array($name, ['posts', 'taxonomies', 'users'])) { 
    return false; 
  } 
  return $provider; 
}, 10, 2); 
Теперь /wp-sitemap.xml станет пустым

✅ Создаём свой провайдер

Создадим собственный класс.

class My_Custom_Sitemap_Provider extends WP_Sitemaps_Provider {

    public function __construct() {
        $this->name = 'custom';
        $this->object_type = 'custom';
    }

    /**
     * Количество страниц sitemap
     */
    public function get_max_num_pages( $subtype = '' ) {
        return 1;
    }

    /**
     * Список URL для sitemap
     */
    public function get_url_list( $page_num, $subtype = '' ) {

        $urls = [];

        $args = [
            'post_type'      => 'post',
            'post_status'    => 'publish',
            'posts_per_page' => -1
        ];

        $posts = get_posts($args);

        foreach ($posts as $post) {
            $urls[] = [
                'loc'     => get_permalink($post),
                'lastmod' => get_the_modified_date('c', $post),
            ];
        }

        return $urls;
    }
}

✅ Регистрируем провайдер

add_action('init', function () {

    wp_register_sitemap_provider(
        'custom',
        new My_Custom_Sitemap_Provider()
    );

});

🔎 Что получится

Теперь будет доступен:

/wp-sitemap-custom-1.xml

И он будет содержать только ваши данные.