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

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

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

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

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

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

`WP_Sitemaps`

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

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

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

<div class="TyagGW_tableContainer" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B0%D0%B9%D0%B4%D0%B5%D1%80-%D0%A7%D1%82%D0%BE-%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)" data-end="640" data-start="442"><thead data-end="472" data-start="442"><tr data-end="472" data-start="442"><th class="" data-col-size="sm" data-end="454" data-start="442">Провайдер</th><th class="" data-col-size="sm" data-end="472" data-start="454">Что генерирует</th></tr></thead><tbody data-end="640" data-start="505"><tr data-end="554" data-start="505"><td data-col-size="sm" data-end="515" data-start="505">`posts`</td><td data-col-size="sm" data-end="554" data-start="515">записи, страницы, custom post types</td></tr><tr data-end="611" data-start="555"><td data-col-size="sm" data-end="570" data-start="555">`taxonomies`</td><td data-col-size="sm" data-end="611" data-start="570">категории, теги, кастомные таксономии</td></tr><tr data-end="640" data-start="612"><td data-col-size="sm" data-end="622" data-start="612">`users`</td><td data-col-size="sm" data-end="640" data-start="622">архивы авторов</td></tr></tbody></table>

</div></div>---

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fwp-sitemap.xml"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`/wp-sitemap.xml`</div></div>Это индекс. В нём ссылки на:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fwp-sitemap-posts-po"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`/wp-sitemap-posts-post-1.xml/wp-sitemap-taxonomies-category-1.xml/wp-sitemap-users-1.xml`</div></div>Каждый из этих файлов формируется **отдельным провайдером**.

---

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-wp_sitemaps_provider"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-attribute">WP_Sitemaps_Provider</span>`</div></div>Он обязан реализовать два метода:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-get_url_list%28-%24page_"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2"><div class="bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs">  
</div></div></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-title function_ invoke__">get_url_list</span>( <span class="hljs-variable">$page_num</span>, <span class="hljs-variable">$subtype</span> )<span class="hljs-title function_ invoke__">get_max_num_pages</span>( <span class="hljs-variable">$subtype</span> )`</div></div>##### 🔹 get\_url\_list()

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

##### 🔹 get\_max\_num\_pages()

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

---

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

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

- Индекс — оглавление
- Провайдер — глава каталога
- get\_url\_list() — список страниц в главе

---

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

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

- отключить стандартные данные
- добавить собственные URL
- изменить логику выборки
- добавить кастомный sitemap (например, для API или фильтров)

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--4"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>```
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); 
```

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%D0%A2%D0%B5%D0%BF%D0%B5%D1%80%D1%8C-%2Fwp-sitemap.x"><div class="overflow-y-auto p-4" dir="ltr">Теперь `/wp-sitemap.xml` станет пустым</div></div>#### ✅ Создаём свой провайдер

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

```php
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;
    }
}

```

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

```php
add_action('init', function () {

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

});

```

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-%2Fwp-sitemap-custom-1"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div><div class="overflow-y-auto p-4" dir="ltr">`/wp-sitemap-custom-1.xml`</div></div>И он будет содержать только ваши данные.

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-add_filter%28%27wp_sitem-1"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-title function_ invoke__">add_filter</span>(<span class="hljs-string">'wp_sitemaps_enabled'</span>, <span class="hljs-string">'__return_false'</span>);`</div></div>---

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

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-unset%28%24post_types%5B%27p"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">unset</span>(<span class="hljs-variable">$post_types</span>[<span class="hljs-string">'product'</span>]);`</div></div>---

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--7"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"></div></div>Убрать категории:

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk-unset%28%24taxonomies%5B%27c"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"></div><div class="overflow-y-auto p-4" dir="ltr">`<span class="hljs-keyword">unset</span>(<span class="hljs-variable">$taxonomies</span>[<span class="hljs-string">'category'</span>]);`</div></div>---

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

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

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--9"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div></div>#### 5️⃣ Изменить список ссылок (фильтрация конкретных URL)

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

```php
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

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


```

<div class="contain-inline-size rounded-2xl corner-superellipse/1.1 relative bg-token-sidebar-surface-primary" id="bkmrk--11"><div class="sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]"><div class="absolute end-0 bottom-0 flex h-9 items-center pe-2">  
</div></div><div class="overflow-y-auto p-4" dir="ltr">  
</div></div>