Карта Сайту WordPress

У Версії WordPress 5.5 було додано підтримку карти сайту в ядро. Плагін Google XML Sitemaps і подібні йому більше не потрібні.



Знайомство

Головна сторінка Картки Сайту WordPress знаходиться за адресою /wp-sitemap.xmlабо /sitemap-xml(з редиректом). Вона містить посилання на карти посилань.

І вже кожна карта посилань містить посилання на сторінки сайту.

Що за умовчанням потрапляє до Карти сайту?

Лише публічні типи постів чи таксономій , а також сторінки постів авторів . Публічний тип чи ні визначається параметрами publicly_queryable під час реєстрації типу запису чи таксономії.

Максимальна кількість посилань у Карті

Головна (index) сторінка може містити максимум 50 000 карток (посилань на картки) . Це значення не можна змінити, воно знаходиться в приватній властивості WP_Sitemaps_Index::$max_sitemaps .

Кожна карта посилань може містити максимум 2000 посилань на сторінці. Це значення змінюється через хук wp_sitemaps_max_urls :

# Змінимо макс. кількість посилань у кожній карті посилань.
# Можливі значення $object_type: post, term, user
add_filter( 'wp_sitemaps_max_urls', 'kama_sitemap_max_urls', 10, 2);
function kama_sitemap_max_urls( $num, $object_type ){
	return 1000;
}

Зміна кол-ва макс. посилань впливає на кількість посилань пагінації на головній сторінці Карти сайту. Наприклад, якщо ми маємо лише 500 постів, то за замовчуванням буде лише одна карта посилань для всіх постів. Але якщо ми змінимо максимум на 100. На індексній сторінці з’явиться 5 посилань на Карти постів.

Не працює Карта сайту WordPress, 501 помилка?

XML Карта Сайту WP працює на основі PHP розширення SimpleXML . Якщо його немає на сервері, то при переході на сторінку карти сайту ви отримаєте 501 помилку .

Посилання на карту сайту у файлі robots.txt

Посилання https://домен/wp-sitemap.xmlдодається до кінця файлу robots.txt автоматично. Але тільки якщо у вас немає фізичного файлу robots.txt в корені сайту. Тобто. robots.txt має створюватися динамічно. Докладніше про динамічний файл robots читайте у функції do_robots() .

Приклад правильного створення динамічного файлу robots.txt для WordPress дивіться за цим посиланням .



Вимкнення Карти сайту WordPress

Якщо на сайті встановлений плагін або код, який вже створює карту сайту та Карта сайту від WordPress вже не потрібна, її можна відключити. Для цього вставте наступний код у functions.php теми, в код плагіна або кудись ще (втім, швидше за все, ваш плагін це вже зробив).

add_filter( 'wp_sitemaps_enabled', '__return_false');

Тепер, якщо перейти на адресу /wp-sitemap.xmlви побачите 404 сторінку.

Примітка: таке відключення не видаляє правила перезапису для карт сайту, тому що вони потрібні щоб віддавати відповіді при відключеній карті сайту. Докладніше тут .

Зверніть увагу, що картка сайту WordPress відключається автоматично, якщо в налаштуваннях «Читання» є галочка «Попросити пошукові системи не індексувати сайт».



Додавання елементів до карти сайту

Щоб додати тип запису або таксономію до карти сайту WordPress, потрібно зробити їх публічними, для цього при реєстрації потрібно встановити true параметри publicly_queryable .

Щоб додати довільні посилання на карту сайту, потрібно створити свій Провайдер .



Видалення елементів

З коробки WP є три провайдера (постачальника) карт сайтів для різних типів: записи, таксономії, користувачі:

Видаляти можна як самого провайдера карт сайтів, так і окремий тип (окрему карту “всередині” провайдера) або взагалі окремий елемент типу (посилання “всередині” карти). Розглянемо з прикладу таксономій. Можна відключити провайдера «taxonomies» і тоді всі таксономії зникнуть з карти сайту, можна відключити окрему таксономію та залишити інші таксономії, або можна виключити окрему рубрику (елемент) таксономії зі списку посилань.



Відключення Провайдера повністю (всіх таксономій, користувачів, типів постів)

Провайдер – це загальне поняття, яке включає всі типи. Наприклад

  • провайдер типу запису містить усі типи записів.
  • Провайдер таксономії включає всі типи таксономій.

Якщо відключити провайдера повністю, з карти сайту будуть видалені всі типи, наприклад, якщо відключити провайдера таксономій, то всі типи таксономій (рубрики, мітки, архіви користувачів) будуть виключені з картки сайту.

# Відключення провайдера карт сайтів: користувачі та таксономії
add_filter( 'wp_sitemaps_add_provider', 'kama_remove_sitemap_provider', 10, 2);

function kama_remove_sitemap_provider( $provider, $name ){

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

	// відключаємо архіви користувачів
	if( in_array( $name, $remove_providers ) ){
		return false;
	}

	return $provider;
}



Вимкнення типу запису (поста, сторінки)

Наприклад, у карті сайту нам не потрібен тип запису page.

# Видалимо тип запису з картки сайту
add_filter( 'wp_sitemaps_post_types', 'wpkama_remove_sitemaps_post_types' );

function wpkama_remove_sitemaps_post_types( $post_types ){

	unset($post_types['page']);

	return $post_types;
}



Відключення таксономії (рубрики, мітки)

Наприклад, у карті сайту нам не потрібні мітки (таксономія post_tag).

# Видалимо таксономії з карти сайту
add_filter( 'wp_sitemaps_taxonomies', 'wpkama_remove_sitemaps_taxonomies' );

function wpkama_remove_sitemaps_taxonomies( $taxonomies ){

	unset($taxonomies['post_tag']);

	return $taxonomies;
}



Виняток окремих url (url записи, рубрики, мітки)

Елементи виключаються шляхом зміни параметрів запиту через спеціальні хуки.

Примітка: Якщо після виключення окремих елементів у картці сайту взагалі не залишається елементів для даного типу чи провайдера, то тип чи провайдер буде повністю виключений із картки сайту.

Видалимо окремі Записи з Карти сайту

Наприклад, пости з ID 12 і 24 не потрібні нам у карті сайту (нехай вони мають метатег noindex ,
але в карті з’являються), виключимо їх з Карти сайту.

хук WP_Query() .

add_filter( 'wp_sitemaps_posts_query_args', 'kama_sitemaps_posts_query_args', 10, 2);
function kama_sitemaps_posts_query_args( $args, $post_type ){

	if ( 'post' !== $post_type ){
		return $args;
	}

	// Врахуємо, що цей параметр може бути вже встановлений
	if( !isset( $args['post__not_in'] ) )
		$args['post__not_in'] = array();

	// Виключаємо пости
	foreach( [ 12, 24 ] as $post_id ){
		$args['post__not_in'][] = $post_id;
	}

	return $args;
}

Видалимо Терміни з Карти сайту

Наприклад терміни з ID 12 і 24 з таксономії citiesмають метатег noindex , виключимо їх з Карти сайту.

хук get_terms() .

add_filter( 'wp_sitemaps_taxonomies_query_args', 'kama_sitemaps_taxonomies_query_args', 10, 2);
function kama_sitemaps_taxonomies_query_args( $args, $taxonomy ){

	if ( 'cities' !== $taxonomy ){
		return $args;
	}

	// Врахуємо, що цей параметр може бути вже встановлений
	if( !isset( $args['exclude'] ) )
		$args['exclude'] = array();

	// Виключаємо терміни
	$args['exclude'] = array_merge( $args['exclude'], [ 12, 24 ] );

	return $args;
}

Видалимо окремих Користувачів з Карти сайту

Наприклад нам не потрібні користувачі з ID 12, 24.

хук get_users() .

add_filter( 'wp_sitemaps_users_query_args', 'kama_sitemaps_users_query_args');
function kama_sitemaps_users_query_args( $args ){

	// Врахуємо, що цей параметр може бути вже встановлений
	if( !isset( $args['exclude'] ) )
		$args['exclude'] = array();

	// Виключаємо користувачів
	$args['exclude'] = array_merge( $args['exclude'], [ 12, 24 ] );

	return $args;
}



Як перевірити Чи увімкнена карта сайту

Щоб дізнатися, чи увімкнена карта сайту, використовуйте таку перевірку:

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

if( $is_sitemaps_enabled ){
	// карти сайту WP працюють
}
else {
	// карти сайту WP відключені
}



Додаткові поля (теги) для Карти сайту

Додамо всі додаткові підтримувані теги для Карт записів (постів).

add_filter( 'wp_sitemaps_posts_entry', 'wpkama_sitemaps_posts_entry', 10, 2);
function wpkama_sitemaps_posts_entry( $entry, $post ){

	$entry['lastmod'] = get_the_modified_date('c', $post);
	$entry['priority'] = 0.8;
	$entry['changefreq'] = 'weekly';

	return $entry;
}

Отримаємо:

Розглянемо все докладніше

Протокол sitemaps підтримує чотири атрибути для кожного елемента <url>картки сайту (за умовчанням WP використовується тільки <loc>). Інші можна додати через фільтри.

Ось що виводиться за замовчуванням у WordPress:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <url>
	  <loc>http://www.example.com/</loc>
   </url>

</urlset>

Ось що підтримується протоколом:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

   <url>
	  <loc>http://www.example.com/</loc>
	  <lastmod>2005-01-01</lastmod>
	  <changefreq>monthly</changefreq>
	  <priority>0.8</priority>
   </url>

</urlset>
loc
(обов’язковий)
URL-адреса сторінки. Ця URL-адреса повинна починатися з протоколу (наприклад, http). Має бути менше 2048 символів.
lastmod
Дата останньої зміни файлу. Дата має бути у форматі W3C Datetime :

  • YYYY– 1997
  • YYYY-MM– 1997-07
  • YYYY-MM-DD– 1997-07-16
  • YYYY-MM-DDThh:mmTZD– 1997-07-16T19:20+01:00
  • YYYY-MM-DDThh:mm:ssTZD– 1997-07-16T19:20:30+01:00

Зауважте, що цей тег незалежний від заголовка If-Modified-Since (304), який може повертати сервер, і пошукові системи можуть використовувати інформацію з обох джерел по-різному.

changefreq
Як часто сторінка може змінюватись. Це значення дає загальну інформацію для пошукових систем. Пошуковики можуть ігнорувати цю інформацію та заходити на сторінку частіше чи рідше. Можливі значення:

  • always– використовується для сторінок, які змінюються під час кожного звернення до них.
  • hourly
  • daily
  • weekly
  • monthly
  • yearly
  • never– використовується для архівованих URL-адрес.
priority
Важливість цієї URL по відношенню до інших URL-адрес. Значення вказується від 0.0до 1.0. Це значення не впливає на те, як ваші сторінки порівнюються зі сторінками на інших сайтах, воно тільки дозволяє пошуковим системам дізнатися, які сторінки ви вважаєте найважливішими. Стандартний пріоритет дорівнює 0.5.

Зверніть увагу, що пріоритет, який ви призначаєте на сторінці, навряд чи вплине на положення Ваших URL-адрес на сторінках результатів пошукової системи. Пошукові системи можуть використовувати цю інформацію при виборі між URL-адресами на тому самому сайті, тому ви можете використовувати цей тег, щоб збільшити ймовірність того, що ваші найважливіші сторінки будуть присутні в пошуковому індексі.

Також зверніть увагу, що присвоєння високого пріоритету всім URL-адресам навряд чи щось покращить. Оскільки пріоритет є відносним, він використовується тільки для вибору ботом, яку сторінку відвідати в першу чергу між URL-адресами на вашому сайті.

Усі фільтри дод. XML тегів 
wp_sitemaps_posts_entryДодаткові теги (поля) для URL Карт сайту записів (постів).
wp_sitemaps_taxonomies_entryДодаткові теги (поля) для URL Карт сайту таксономій .
wp_sitemaps_users_entryДодаткові теги (поля) для URL Карт сайту користувачів .
wp_sitemaps_index_entryДодаткові теги (поля) для URL головної сторінки карти сайту.



Класи, Функції, Хуки

Для керування/зміни Карти сайту є набір функцій, класів та хуків. Нижче наведено список усіх функцій, класів і хуків, які пов’язані з картою сайту WordPress.

Функції 
wp_sitemaps_get_server()Отримує поточний екземпляр Sitemaps.
wp_get_sitemap_providers()Отримує масив постачальників карток сайту.
wp_register_sitemap_provider()Реєструє нового постачальника картки сайту.
wp_sitemaps_get_max_urls()Повертає максимальну кількість URL-адрес для карти сайту.
Класи 
WP_Sitemaps{}Основний клас відповідає за налаштування перезаписів та реєстрації всіх постачальників.
WP_Sitemaps_Index{}Створює головну сторінку sitemap, на якій перераховані посилання на всі карти сайтів.
WP_Sitemaps_Provider{}Базовий клас для розширення постачальників карток сайту. Також містить загальні функціональні можливості.
WP_Sitemaps_Registry{}Обробляє реєстрацію постачальників карток сайту.
WP_Sitemaps_Renderer{}Відповідає за рендеринг даних sitemap у XML відповідно до протоколу sitemap.
WP_Sitemaps_Stylesheet{}Надає таблиці стилів XSL для стилізації всіх карток сайту.
WP_Sitemaps_Posts{}Провайдер. Створює карти сайтів для типу об’єкта запису і його підтипів (типи типів користувача).
WP_Sitemaps_Taxonomies{}Провайдер. Створює карти сайтів для типу об’єкта таксономія і його підтипів (таксономії користувача).
WP_Sitemaps_Users{}Провайдер. Створює карти сайтів типу об’єкта користувач .
Загальні хуки 
wp_sitemaps_enabledФільтрує, чи включені XML-картки сайтів чи ні.
wp_sitemaps_max_urlsФільтрує максимальну кількість URL-адрес, що відображаються на карті сайту.
wp_sitemaps_initСпрацьовує під час ініціалізації карт сайтів.
wp_sitemaps_index_entryФільтрує запис sitemap для головної сторінки.
Хуки Постачальників (Providers) 
wp_sitemaps_add_providerФільтрує постачальника sitemap перед його додаванням.
wp_sitemaps_post_typesФільтрує типи записів для включення до карт сайтів.
wp_sitemaps_posts_entryФільтрує теги <url> запису.
wp_sitemaps_posts_show_on_front_entryФільтрує теги <url> домашньої сторінки.
wp_sitemaps_posts_query_argsФільтрує параметри запиту WP_Query.
wp_sitemaps_posts_pre_url_listФільтрує список URL-адрес до його створення (замикання).
wp_sitemaps_posts_pre_max_num_pagesФільтрує макс. у сторінок сторінок постів (замикання).
wp_sitemaps_taxonomiesФільтрує список таксономій.
wp_sitemaps_taxonomies_entryФільтрує теги <url> елемента таксономії.
wp_sitemaps_taxonomies_query_argsФільтрує параметри запиту на отримання елементів таксономії.
wp_sitemaps_taxonomies_pre_url_listФільтрує список URL таксономій до створення (замикання).
wp_sitemaps_taxonomies_pre_max_num_pagesФільтрує макс. у сторінок таксономій (замикання).
wp_sitemaps_users_entryФільтрує теги <url> користувача.
wp_sitemaps_users_query_argsФільтри параметри запиту користувачів.
wp_sitemaps_users_pre_url_listФільтрує список URL користувачів до створення (замикання).
wp_sitemaps_users_pre_max_num_pagesФільтрує макс. у сторінок користувачів (замикання).



нотатки



Оптимізуємо WP_Query усередині карт сайту

За замовчуванням для виведення постів всіх типів, клас WP_Sitemaps_Posts{} використовує WP_Query і в результат віддає масив з об’єктами постів, тоді як у будь-якому сценарії нам вистачить лише ID посту. Якщо у вас дуже багато постів будь-якого типу, то ви можете виявити довгу генерацію окремих карт. Код нижче дозволяє змінити WP_Query, змусивши його віддавати масив лише з ID, що покращить швидкість генерації сторінки та зменшить навантаження.

// Додаємо фільтр, щоб WP_Query віддавав тільки масив id постів
add_filter( 'wp_sitemaps_posts_query_args', 'optimize_sitemap_posts_query', 10, 1);
function optimize_sitemap_posts_query( $args ){
	$args['fields'] = 'ids';

	return $args;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *