Карта Сайту 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 є три провайдера (постачальника) карт сайтів для різних типів: записи, таксономії, користувачі:
posts
– WP_Sitemaps_Posts {}taxonomies
– WP_Sitemaps_Taxonomies{}users
– WP_Sitemaps_Users {}
Видаляти можна як самого провайдера карт сайтів, так і окремий тип (окрему карту “всередині” провайдера) або взагалі окремий елемент типу (посилання “всередині” карти). Розглянемо з прикладу таксономій. Можна відключити провайдера «taxonomies» і тоді всі таксономії зникнуть з карти сайту, можна відключити окрему таксономію та залишити інші таксономії, або можна виключити окрему рубрику (елемент) таксономії зі списку посилань.
Відключення Провайдера повністю (всіх таксономій, користувачів, типів постів)
хук wp_sitemaps_add_provider .
Провайдер – це загальне поняття, яке включає всі типи. Наприклад
- провайдер типу запису містить усі типи записів.
- Провайдер таксономії включає всі типи таксономій.
Якщо відключити провайдера повністю, з карти сайту будуть видалені всі типи, наприклад, якщо відключити провайдера таксономій, то всі типи таксономій (рубрики, мітки, архіви користувачів) будуть виключені з картки сайту.
# Відключення провайдера карт сайтів: користувачі та таксономії 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; }
Вимкнення типу запису (поста, сторінки)
хук wp_sitemaps_post_types .
Наприклад, у карті сайту нам не потрібен тип запису 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; }
Відключення таксономії (рубрики, мітки)
хук wp_sitemaps_taxonomies .
Наприклад, у карті сайту нам не потрібні мітки (таксономія 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
– 1997YYYY-MM
– 1997-07YYYY-MM-DD
– 1997-07-16YYYY-MM-DDThh:mmTZD
– 1997-07-16T19:20+01:00YYYY-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; }