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

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

✅Основные способы управления содержимым провайдера

1️⃣ Полностью отключить sitemap

add_filter('wp_sitemaps_enabled', '__return_false');

2️⃣ Убрать конкретный тип записей (например, post)

add_filter('wp_sitemaps_post_types', function ($post_types) {
  unset($post_types['post']); // убираем записи return $post_types;
}); 

Пример для кастомного типа:

unset($post_types['product']);

3️⃣ Убрать таксономию (категории, теги и т.д.)

dd_filter('wp_sitemaps_taxonomies', function ($taxonomies) {
  unset($taxonomies['post_tag']); // убрать теги return $taxonomies;
}); 

Убрать категории:

unset($taxonomies['category']);

4️⃣ Убрать пользователей из sitemap

add_filter('wp_sitemaps_add_provider', function ($provider, $name) {
  if ($name === 'users') {
    return false;
  } return $provider;
}, 10, 2); 

5️⃣ Изменить список ссылок (фильтрация конкретных URL)

Можно отфильтровать сами записи:

add_filter('wp_sitemaps_posts_query_args', function ($args, $post_type) {
   if ($post_type === 'post') {
     $args['meta_query'] = array( array( 'key' => 'exclude_from_sitemap', 'compare' => 'NOT EXISTS' ) );
   }
   return $args;
}, 10, 2);

6️⃣ Изменить данные конкретной записи в sitemap

add_filter('wp_sitemaps_posts_entry', function ($entry, $post, $post_type) {
   $entry['priority'] = 0.8;
   $entry['changefreq'] = 'weekly';
   return $entry;
}, 10, 3);