sitemap.xml

Общие сведения
Начиная с WordPress 5.5, встроенный sitemap доступен по адресу: 

 

 

 

 

 /wp-sitemap.xml

 

 

 Он формируется классом WP_Sitemaps и управляется через фильтры. Никакой отдельный файл в теме не создаётся — всё генерируется динамически. 

 Ниже — основные способы управления содержимым. 

 

 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️⃣ Убрать таксономию (категории, теги и т.д.) 

 

 

 

 

 

 

 add_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 );

 

 

 

 7️⃣ Добавить собственный sitemap 

 Можно зарегистрировать свой провайдер: 

 

 

 

 

 

 

 add_action ( 'init' , function () {

 $provider = new WP_Sitemaps_Provider (

 'custom' ,

 'custom' 

 );

 wp_register_sitemap_provider ( 'custom' , $provider );

});

 

 

 (для продакшена обычно создают отдельный класс-провайдер) 

 

 🔥 Где размещать код? 

 

 

 В 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 

 архивы авторов 

 

 

 

 

 

 

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

 

 

 

 

 

 

 /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);

Создание кастомного 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 

   

  