Карта сайта в 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 – генерирует карту для страниц архивов пользователей.

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

Почему у нас три провайдера, а в карте пять ссылок?
Провайдер может обладать подтипами, и для каждого из них создается своя карта. Например, провайдер 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 ) {}

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

Это можно сделать с помощью хука wp_sitemaps_taxonomies:

/** Убираем из карты сайта все страницы */
add_filter( 'wp_sitemaps_taxonomies', 'disable_sitemap_taxonomy_tag' );
function disable_sitemap_taxonomy_tag( $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 укажите идентификаторы терминов, которые нужно исключить.

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

Для исключения пользователя воспользуйтесь хук 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', 'modify_sitemap_entry_index', 10, 4);
function modify_sitemap_entry_index( $entry, $object_type, $object_subtype, $page ) {
// Включаем поле с датой последнего изменения только для карт сайта с постами
if( $object_type == 'post' ) {
$latest_post = wp_get_recent_posts([
'post_type' => $object_subtype,
'post_status' => 'publish',
'numberposts' => 1,
'orderby' => 'post_modified',
'order' => 'DESC'
]);
if( $latest_post ) {
$entry['lastmod'] = get_the_modified_date('c', $latest_post[0]['ID']);
}
}
return $entry;
}

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

Для проверки, активирована ли карта сайта, можно воспользоваться таким кодом:

$is_active_sitemap = wp_sitemaps_get_server()->sitemaps_enabled();
if( $is_active_sitemap ) {
echo 'Карта сайта активна.';
} else {}

Изменение количества ссылок в карте сайта

Индексная карта может включать до 50 000 других карт, и это значение нельзя изменить.

По умолчанию дочерние карты допускают до 2 000 ссылок на странице. Данный лимит можно отредактировать с помощью хука wp_sitemaps_max_urls.

add_filter( 'wp_sitemaps_max_urls', 'define_sitemaps_max_urls', 10, 2 );
function define_sitemaps_max_urls( $max_urls, $object_type ) {}

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

Как изменить ссылку wp-sitemap.xml на sitemap.xml

В 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, а старая ссылка будет автоматически перенаправлена на новую.

Оставьте комментарий