sitemap.xml
Общие сведения
Начиная с WordPress 5.5, встроенный sitemap доступен по адресу:
Он формируется классом WP_Sitemaps и управляется через фильтры. Никакой отдельный файл в теме не создаётся — всё генерируется динамически.
Ниже — основные способы управления содержимым.
1️⃣ Полностью отключить sitemap
2️⃣ Убрать конкретный тип записей (например, post)
Пример для кастомного типа:
3️⃣ Убрать таксономию (категории, теги и т.д.)
Убрать категории:
4️⃣ Убрать пользователей из sitemap
5️⃣ Изменить список ссылок (фильтрация конкретных URL)
Можно отфильтровать сами записи:
6️⃣ Изменить данные конкретной записи в sitemap
7️⃣ Добавить собственный sitemap
Можно зарегистрировать свой провайдер:
(для продакшена обычно создают отдельный класс-провайдер)
🔥 Где размещать код?
-
В
functions.phpтемы -
Или лучше — в собственном мини-плагине
⚠️ Важно
Если установлен SEO-плагин вроде:
-
Yoast SEO
-
Rank Math
-
All in One SEO
то встроенный sitemap WordPress обычно отключается, и управление происходит через плагин.
Работа с провайдерами 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);
Создание кастомного sitemap.xml
В статье рассматривается следующий сценарий:
- Сайт имеет только одну страницу - главную, остальные страницы это посты.
- На сайте установлен самописный плагин, который обрабатывает содержимое страницы или поста и можно получить либо русскую версию текста, либо английскую
- Русская версия текста вызывается обычной ссылкой на страницу или пост:
https://example.com/post-slug
- Английская версия вызывается добавлением к обычной ссылке окончания "/en":
https://example.com/post-slug/en
- Главная страница обязательно имеет английскую версию
- Для постов имеется поле ACF - "is_english", которое определяет, есть ли у страницы английская версия, если английской версии нет, то при ее запросе отображается 404 страница
- Для сайта формируется кастомный файл sitemap, который будет показан поисковикам через robots.txt или явным указанием в настройках индексирования.
- На сайте не используются плагины SEO
Отключение стандартного wp-sitemap.xml
add_filter('wp_sitemaps_enabled', '__return_false');
Регистрация кастомного sitemap.xml