Работа с провайдерами sitemap
В контексте WordPress провайдер sitemap — это класс, который отвечает за генерацию определённого набора URL внутри XML-карты сайта.
Проще говоря:
Провайдер = источник данных для sitemap.
📌 Как это устроено внутри WordPress
Начиная с версии 5.5 в WordPress появился класс:
WP_Sitemaps
Он управляет всей системой sitemap и подключает провайдеры.
Каждый провайдер отвечает за свой тип данных.
По умолчанию есть три:
| Провайдер | Что генерирует |
|---|---|
posts |
записи, страницы, custom post types |
taxonomies |
категории, теги, кастомные таксономии |
users |
архивы авторов |
🔎 Пример структуры
Это индекс. В нём ссылки на:
Каждый из этих файлов формируется отдельным провайдером.
📦 Что делает провайдер технически
Каждый провайдер — это класс, наследующий:
Он обязан реализовать два метода:
🔹 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);
✅ Создаём свой провайдер
Создадим собственный класс.
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()
);
});
🔎 Что получится
Теперь будет доступен:
И он будет содержать только ваши данные.
✅Основные способы управления содержимым провайдера
1️⃣ Полностью отключить sitemap
2️⃣ Убрать конкретный тип записей (например, post)
add_filter('wp_sitemaps_post_types', function ($post_types) {
unset($post_types['post']); // убираем записи return $post_types;
});
Пример для кастомного типа:
3️⃣ Убрать таксономию (категории, теги и т.д.)
dd_filter('wp_sitemaps_taxonomies', function ($taxonomies) {
unset($taxonomies['post_tag']); // убрать теги return $taxonomies;
});
Убрать категории:
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);
No comments to display
No comments to display