Карта сайта wp-sitemap.xml в WordPress

Поздравляю вас с тем, что на вашем сайте теперь будет -1 плагин! 🎉 Потому что начиная с версии WordPress 5.5 в ядре движка будет присутствовать расширяемая карта сайта!

Карта сайта будет находиться по адресу /wp-sitemap.xml, если вы уже обновились и у вас версия WordPress 5.5 или выше, попробуйте перейти по этому адресу и у вас откроется XML карта сайта. Если же при переходе у вас возникла ошибка 501, то значит у вас не стоит расширение для PHP, SimpleXML, которое необходимо для создание XML карты сайта.

Индекс карты сайта может содержать до 20000 карт сайта, в каждой по 2000 страниц (можно изменить при помощи хука).

По умолчанию в карту сайта попадают все типы постов с параметрами public и publicly_queryable и таксономии, а также архивы автора и главная страница сайта.

Также рекомендую вам свой видеокурс по WordPress, в котором мы создаём тему для сайта на основе готовой HTML вёрстки с учётом всех последних изменений в движке – вот ссылка.

Как отключить карту сайта WordPress

Допустим я уже использую какой-то плагин для WordPress для создания карты сайта, например Google XML Sitemaps и он меня полностью устраивает, а тестить новый функционал у меня пока что нет времени.

Вы можете вставить этот код в functions.php вашей текущей или дочерней темы:

add_filter( 'wp_sitemaps_enabled', '__return_false' );

И всё, карта сайта по адресу /wp-sitemap.xml исчезнет и будет выводиться ошибка 404.

Кроме того, хочу добавить, что карта сайта будет выдавать 404 ещё в одном случае – когда в настроках чтения у вас включена галка «Попросить поисковые системы не индексировать сайт».

Попросить поисковые системы на индексировать сайт
Опция «Попросить поисковые системы на индексировать сайт» находится в Настройки > Чтение

Также у вас есть возможность проверить, что карты сайта включены при помощи метода  wp_sitemaps_get_server()->sitemaps_enabled():

if(  wp_sitemaps_get_server()->sitemaps_enabled() ) {
	// ага, включены
}

Удаляем определённые карты сайта из индекса

У вас также есть возможность удалить определённые провайдеры (карты сайта) из индекса, например если вам не нужны в вашей карте архивы постов пользователей, то вы можете использовать этот фильтр-хук:

add_filter( 'wp_sitemaps_add_provider', 'truemisha_remove_user_sitemap', 25, 2 );
 
function truemisha_remove_user_sitemap( $provider, $name ) {
 
	if ( 'users' === $name ) { // если архивы пользователей, то отключаем
		return false;
	}
	return $provider;
 
}

Убираем определённые типы постов из карты

Для этого существует отдельный хук wp_sitemaps_post_types, если вы например хотите исключить из вашей карты сайта тип постов Страницы, то код будет выглядеть так:

add_filter( 'wp_sitemaps_post_types', 'truemisha_remove_pages', 25 );
 
function truemisha_remove_pages( $post_types ) {
 
	unset( $post_types['page'] );
	return $post_types;
 
}

Удаляем определённые таксономии из карты сайта

Похожая ситуация и для таксономий – есть хук wp_sitemaps_taxonomies, при помощи которого легко это сделать, например для таксономии Теги post_tag:

add_filter( 'wp_sitemaps_taxonomies', 'truemisha_remove_tags', 25 );
 
function truemisha_remove_tags( $taxonomies ) {
 
	unset( $taxonomies['post_tag'] );
	return $taxonomies;
 
}

Добавляем теги XML

По умолчанию карта сайта в WordPress содержит только один тег XML – URL (loc).

Карта сайта WordPress
Как видите, по умолчанию в таблице карты сайта присутствует только одна колонка (тег) – URL.

Другие же теги, такие как changefreq, priority и lastmod не являются обязательными и поэтому не присутствуют сразу же по умолчанию в вашей карте, для оптимизации производительности.

Тем не менее вы можете добавить их в определённую карту при помощи этих хуков:

  • wp_sitemaps_index_entry – основной индекс,
  • wp_sitemaps_posts_entry – карта с типами постов,
  • wp_sitemaps_taxonomies_entry – карта с таксономиями,
  • wp_sitemaps_users_entry – архивы пользователей.

Хорошо, допустим я хочу добавить все три тега в карту с постами:

add_filter( 'wp_sitemaps_posts_entry', 'truemisha_add_sitemap_tags', 25, 2 );
 
function truemisha_add_sitemap_tags( $entry, $post ) {
 
	$entry[ 'priority' ] = '40%';
	$entry[ 'changefreq' ] = 'Monthly';
	$entry[ 'lastmod' ] = $post->post_modified_gmt;
 
	return $entry;
 
}

Готово, внутри функции хука доступен также объект поста $post, благодаря которому мы легко получаем время последнего изменения.

Если вы попробуете добавить несуществующие теги, то это приведёт к уведомлению _doing_it_wrong.

Исключаем определённую страницу из карты сайта

Предположим, что вы создали какой-то SEO-плагин, который позволяет добавлять мета-тег robots noindex для определённых страниц или записей сайта, тогда вполне логично, что их нужно исключать и из карты сайта.

В этом вам поможет фильтр-хук wp_sitemaps_posts_query_args:

add_filter( 'wp_sitemaps_posts_query_args', 'truemisha_exclude_post', 25, 2 );
 
function truemisha_exclude_post( $args, $post_type ) {
 
	// ничего не делаем, если тип поста не post
	if ( 'post' !== $post_type ) {
		return $args;
	}
 
	// параметр post__not_in уже может существовать, не теряем его
	$args[ 'post__not_in' ] = isset( $args[ 'post__not_in' ] ) ? $args[ 'post__not_in' ] : array();
 
	// исключаем запись с ID 1, да, которая "Привет мир"
	$args[ 'post__not_in' ][] = 1; 
 
	return $args;
 
}

Количество URL в одной карте

Ещё один хук, который хочу вам показать – это wp_sitemaps_get_max_urls. Как я уже сказал в самом начале урока – по умолчанию содержится 2000 URL в одной карте, но мы можем изменить это значение.

add_filter( 'wp_sitemaps_max_urls', 'truemisha_url_v_karte', 25 );
 
function truemisha_url_v_karte( $object_type ){
 
	// $object_type может быть 'post', 'term', 'user'
	return 1000;
 
}

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 16

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал