Карта сайта в WordPress. Класс WP_Sitemaps

Ранее были рассмотрены способы создания карты сайта в WordPress. В этой статье подробно опишем встроенные возможности WordPress по созданию и настройке карты сайта.

Основная информация

Начиная с версии WordPress 5.5 по ссылке site.ru/wp-sitemap.xml доступна карта сайта, которая автоматически генерируется ядром. Этот файл содержит список всех дочерних карт, которые есть на сайте. А дочерние карты уже содержат ссылки на страницы, посты, категории и другие архивы. По умолчанию создаются карты для постов (записей и страниц), таксономий (категорий и меток) и пользователей. За создание различных типов карт отвечает свой класс провайдера (provider). Что такое провайдер карты сайта рассмотрим ниже.

Главная страница карты (/wp-sitemap.xml) может содержать максимум 50 000 дочерних карт, а одна дочерняя содержит не более 2 000 записей.

В карту сайта добавляются только публичные public и доступные к публичному просмотру publicly_queryable типы записей и таксономии.

Карта будет доступна по адресу /wp-sitemap.xml только при условии, если сайт не скрыт от индексации в поисковых системах (Настройки > Чтение > Попросить поисковые системы не индексировать сайт).

Для работы карты сайта требуется расширение SimpleXML для PHP. Узнайте у своего хостинг провайдера его наличие.

Отключение карты сайта

Отключить карту сайта можно через хук wp_sitemaps_enabled.

add_filter( 'wp_sitemaps_enabled', '__return_false' );

Данный код отключит карту, а по ссылке /wp-sitemap.xml будет выпадать 404 страница.

Если вы используете на сайте плагины для создания карты сайта, то они должны автоматически отключать встроенную карту сайта WordPress.

Удаление элементов карты сайта

По умолчанию существует три поставщика (провайдера) карт сайта для разных типов объектов WordPress:

  • posts – отвечает за создание карты сайта для записей, страниц и кастомных типов записей.
  • taxonomies – создает карты сайта любых таксономий WordPress.
  • users – создает карту сайта со ссылками на архивные страницы пользователей.

Если на вашем сайте есть записи, страницы, категории и метки, то карта сайта будет выглядеть так:

Почему провайдера три, а в карте сайта 5 ссылок?
Провайдер может содержать подтипы. Для каждого подтипа создается своя карта сайта. Например, провайдер posts имеет подтипы post и page.

Удаление провайдера карты сайта

Отключая провайдер целиком, удаляются и все подтипы, которые он содержит. Провайдер posts (класс WP_Sitemaps_Posts) содержит подтипы post, page и другие произвольные типы записей (если они есть на сайте).

Отключить провайдер можно через хук wp_sitemaps_add_provider

/** Отключение провайдера posts */
add_filter( 'wp_sitemaps_add_provider', 'disable_sitemap_provider', 10, 2 );

function disable_sitemap_provider( $provider, $name ){

	$disable_provider = 'posts';

	if( $name == $disable_provider ){
		return false;
	}

	return $provider;
}

Чтобы отключить несколько провайдеров одновременно, например taxonomies и users используйте следующий код:

/** Отключение провайдеров taxonomies, users */
add_filter( 'wp_sitemaps_add_provider', 'disable_sitemap_provider', 10, 2 );

function disable_sitemap_provider( $provider, $name ){

	$disable_providers = [ 'taxonomies', 'users' ];

	if( in_array( $name, $disable_providers ) ){
		return false;
	}

	return $provider;
}

Удаление типов постов

Для удаления из карты сайта записей (post), страниц (page) или других типов используйте хук wp_sitemaps_post_types

/**	Убираем из карты сайта все страницы */
add_filter( 'wp_sitemaps_post_types', 'disable_sitemap_page_type' );
 
function disable_sitemap_page_type( $post_types ) {
 
	unset( $post_types['page'] );
	
	return $post_types;
}

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

Сделать это можно с помощью хука wp_sitemaps_taxonomies.

/**	Убираем из карты сайта все страницы */
add_filter( 'wp_sitemaps_taxonomies', 'disable_sitemap_taxonomy_tag' );
 
function disable_sitemap_taxonomy_tag( $taxonomies ) {
 
	unset( $taxonomies['post_tag'] );
	
	return $taxonomies;
}

Удаление карты сайта пользователей

Провайдер users не содержит подтипы и для удаления нужно отключить провайдер полностью.

/** Отключение провайдера users */
add_filter( 'wp_sitemaps_add_provider', 'disable_sitemap_provider_users', 10, 2 );

function disable_sitemap_provider_users( $provider, $name ){

	$disable_provider = 'users';

	if( $name == $disable_provider ){
		return false;
	}

	return $provider;
}

Удаление из карты конкретной записи, страницы

Посты в карте сайта выбираются из базы данных с помощью класса WP_Query. Изменяя параметры этого класса, мы можем исключить определенные посты из карты. Для изменения параметров используется хук wp_sitemaps_posts_query_args.

Хук передает в функцию два параметра: $args и $post_type.

Перед изменением параметров запроса обязательно проверяйте тип поста.

add_filter( 'wp_sitemaps_posts_query_args', 'remove_sitemap_posts', 10, 2 );

function remove_sitemap_posts( $args, $post_type ) {

	// Для всех типов постов, кроме страниц
	if( $post_type == 'page' ) {
		return $args;
	}

	// Проверяем, есть ли параметр post__not_in у текущего запроса
	$args['post__not_in'] = isset( $args['post__not_in'] ) ? $args['post__not_in'] : [];

	// Исключаем посты по ID 
	$exclude_posts = [ 18, 20, 34 ];
	$args['post__not_in'] = array_merge( $args['post__not_in'], $exclude_posts );

	return $args;
}

Удаление из карты конкретного термина таксономии

Для получения списка терминов и вывода в карте сайте используется класс WP_Term_Query. Чтобы исключить конкретные термины, надо изменить параметры запроса через хук wp_sitemaps_taxonomies_query_args.

add_filter( 'wp_sitemaps_taxonomies_query_args', 'remove_sitemap_terms', 10, 2 );

function remove_sitemap_terms( $args, $taxonomy ) {

	// Для всех таксономий, кроме category
	if( $taxonomy == 'category' ) {
		return $args;
	}

	// Проверяем, есть ли параметр exclude у текущего запроса
	$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : [];

	// Исключаем термины по ID 
	$exclude_terms = [ 16, 94, 215 ];
	$args['exclude'] = array_merge( $args['exclude'], $exclude_terms );

	return $args;
}

В массиве $exclude_terms укажите ID терминов, которые необходимо исключить.

Удаление из карты конкретного пользователя

Для удаления пользователя используем хук wp_sitemaps_users_query_args. Изменяем с помощью него параметры запроса WP_User_Query.

add_filter( 'wp_sitemaps_users_query_args', 'remove_sitemap_users' );

function remove_sitemap_users( $args ) {

	// Проверяем, есть ли параметр exclude у текущего запроса
	$args['exclude'] = isset( $args['exclude'] ) ? $args['exclude'] : [];

	// Исключаем термины по ID 
	$exclude_users = [ 2, 7 ];
	$args['exclude'] = array_merge( $args['exclude'], $exclude_users );

	return $args;
}

Добавление элементов в карту сайта

Как было сказано в самом начале статьи, в карту сайта добавляются все типы постов, таксономий если они публичные public и доступны к публичному просмотру publicly_queryable. Поэтому, после создания они отобразятся в карте сайта автоматически.

Для добавления в карту сайта произвольных ссылок, которые не относятся к объектам WordPress нужно создать свой класс провайдера, который расширяет WP_Sitemaps_Provider. Тема достаточно объемная, поэтому расскажу о ней в отдельной статье.

Добавление дополнительных полей в карту сайта

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

Дополнительные поля для карты постов

Используйте хук wp_sitemaps_posts_entry. В параметры функции передаются $entry и $post.

add_filter('wp_sitemaps_posts_entry', 'add_sitemap_entry_posts', 10, 2);

function add_sitemap_entry_posts($entry, $post)
{
	$entry['lastmod'] = $post->post_modified_gmt;
	$entry['priority'] = 0.6;
	$entry['changefreq'] = 'weekly';
	return $entry;
}

Карта с дополнительными параметрами выглядит так

Дополнительные поля для карты таксономий

Используем хук wp_sitemaps_taxonomies_entry.

add_filter('wp_sitemaps_taxonomies_entry', 'add_sitemap_entry_taxonomy', 10, 4);

function add_sitemap_entry_taxonomy($entry, $term_id, $taxonomy, $term)
{
	// Получаем последний пост текущего термина
	$last_post = wp_get_recent_posts([
		$taxonomy => $term_id,
		'post_status' => 'publish',
		'numberposts' => 1,
		'orderby' => 'post_modified',
		'order' => 'DESC'
	]);

	$entry['lastmod'] = get_the_modified_date('c', $last_post[0]['ID']);
	$entry['priority'] = 0.8;
	$entry['changefreq'] = 'weekly';
	return $entry;
}

Дополнительные поля для карты сайта юзеров

Используем хук wp_sitemaps_users_entry.

add_filter('wp_sitemaps_users_entry', 'add_sitemap_entry_user', 10, 2);

function add_sitemap_entry_user($entry, $user)
{
	// Получаем последний пост из архива юзера
	$last_post = wp_get_recent_posts([
		'author' => $user->ID,
		'post_status' => 'publish',
		'numberposts' => 1,
		'orderby' => 'post_modified',
		'order' => 'DESC'
	]);

	$entry['lastmod'] = get_the_modified_date('c', $last_post[0]['ID']);
	$entry['priority'] = 0.5;
	$entry['changefreq'] = 'monthly';
	return $entry;
}

Дополнительные поля для индексной карты сайта wp-sitemap.xml

На странице индексной карты сайта чаще всего требуется добавить только один параметр – дата последнего обновления. Сделать это можно с помощью хука wp_sitemaps_index_entry.

add_filter('wp_sitemaps_index_entry', 'add_sitemap_entry_index', 10, 4);

function add_sitemap_entry_index( $entry, $object_type, $object_subtype, $page ) {
	
	// Добавляем поле последнего обновления только для карты сайта post
	if( $object_type == 'post' ) {
		$last_post = wp_get_recent_posts([
			'post_type' => $object_subtype,
			'post_status' => 'publish',
			'numberposts' => 1,
			'orderby' => 'post_modified',
			'order' => 'DESC'
		]);
		
		if( $last_post ) {
			$entry['lastmod'] = get_the_modified_date('c', $last_post[0]['ID']);
		}
	}

	return $entry;
}

Как проверить, активна ли карта сайта

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

$is_active_sitemap = wp_sitemaps_get_server()->sitemaps_enabled();

if( $is_active_sitemap ){
	echo 'Карта сайта включена.';
}
else{
	echo 'Карта сайта отключена.';
}

Индексная карта может содержать до 50 000 карт. Значение постоянное и изменить его нельзя.

Дочерние карты по умолчанию могут содержать до 2 000 ссылок на странице. Заменить это значение можно с помощью хука wp_sitemaps_max_urls.

add_filter( 'wp_sitemaps_max_urls', 'set_sitemaps_max_urls', 10, 2 );

function set_sitemaps_max_urls( $max_urls, $object_type ){
	return 200;
}

Если постов на сайте больше чем максимальное количество ссылок в карте сайта, то будет создано несколько дочерних карт сайт, которые будут выведены в индексной карте.

Для карты сайта WordPress можно задать классическую ссылку /sitemap.xml. Делается это с помощью следующего кода

add_action( 'init', 'add_rewrite_rule_wp_sitemap' );
add_filter( 'home_url', 'change_url_wp_sitemap', 11, 2 );

function add_rewrite_rule_wp_sitemap() {
	add_rewrite_rule( '^sitemap\.xml$', 'index.php?sitemap=index', 'top' );
}

function change_url_wp_sitemap( $url, $path ) {

	if ( '/wp-sitemap.xml' === $path ) {
		return str_replace( '/wp-sitemap.xml', '/sitemap.xml', $url );
	}

	return $url;
}

После добавления кода в functions.php обновите правила для ЧПУ. Зайдите в админку, откройте раздел Настройки > Постоянные ссылки и нажмите кнопку Сохранить изменения. Теперь карта сайта будет доступна по адресу /sitemap.xml. Старая ссылка будет редиректить на новую.

Содержание:
Нет комментариев