Карта сайта XML — важный элемент SEO-оптимизации любого сайта на WordPress. Она позволяет поисковым системам быстро находить и индексировать новые страницы. Сегодня мы подробно разберём, как самостоятельно создать обновляемую карту сайта XML с возможностью гибкой фильтрации ссылок, чтобы в карту попадали только нужные разделы сайта.
Почему нужна кастомная карта сайта с фильтрацией
Стандартные плагины, например, Clearfy Pro или Yoast SEO, создают базовые карты сайта, но часто они включают в себя всё подряд: страницы, записи, вложения, категории и т.д. Иногда нужно исключить определённые типы записей или категории, например, чтобы не индексировались служебные страницы или черновики. Также бывает полезно создавать несколько карт для разных целей.
Создание собственной карты сайта с фильтрацией помогает:
- Исключить из индексации ненужный контент;
- Оптимизировать нагрузку на сервер за счёт генерации карты по запросу или с кешем;
- Автоматизировать обновление карты при публикации/редактировании контента;
- Гибко настраивать структуру и приоритеты ссылок.
Пример базового кода для создания карты сайта XML
Рассмотрим, как реализовать простую карту сайта на PHP в рамках WordPress без плагинов. Код добавляем в functions.php вашей темы или в отдельный плагин (рекомендуется).
add_action('init', 'wproot_register_sitemap_endpoint');
function wproot_register_sitemap_endpoint() {
add_rewrite_rule('^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top');
}
add_filter('query_vars', 'wproot_add_sitemap_query_var');
function wproot_add_sitemap_query_var($vars) {
$vars[] = 'custom_sitemap';
return $vars;
}
add_action('template_redirect', 'wproot_sitemap_template_redirect');
function wproot_sitemap_template_redirect() {
if (get_query_var('custom_sitemap')) {
header('Content-Type: application/xml; charset="'.get_bloginfo('charset').'"');
echo wproot_generate_sitemap_xml();
exit;
}
}
function wproot_generate_sitemap_xml() {
$posts = get_posts([
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1,
'category__not_in' => [10], // исключаем категорию с ID 10
]);
$xml = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
$xml .= "\n".'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach ($posts as $post) {
$permalink = get_permalink($post);
$date = get_the_modified_date('c', $post);
$xml .= "\n<url>";
$xml .= "\n<loc>".esc_url($permalink)."</loc>";
$xml .= "\n<lastmod>".$date."</lastmod>";
$xml .= "\n<changefreq>weekly</changefreq>";
$xml .= "\n<priority>0.8</priority>";
$xml .= "\n</url>";
}
$xml .= "\n</urlset>";
return $xml;
}
В этом примере мы создаём endpoint custom-sitemap.xml, который выводит карту сайта с постами, исключая категорию с ID 10. Это простейшая фильтрация, но её легко расширить.
Расширение фильтрации: исключение по меткам и пользовательским полям
Чтобы ещё точнее контролировать, какие записи попадут в карту, можно использовать дополнительные параметры WP_Query:
- Исключить записи по меткам (tags)
- Фильтровать по произвольным полям (custom fields)
- Включить только записи с определённым шаблоном или статусом
Например, расширим функцию wproot_generate_sitemap_xml(), чтобы исключить записи с меткой noindex и добавить фильтр по кастомному полю show_in_sitemap:
function wproot_generate_sitemap_xml() {
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1,
'category__not_in' => [10],
'tax_query' => [
[
'taxonomy' => 'post_tag',
'field' => 'slug',
'terms' => ['noindex'],
'operator' => 'NOT IN',
],
],
'meta_query' => [
[
'key' => 'show_in_sitemap',
'value' => '1',
'compare' => '=',
],
],
];
$posts = get_posts($args);
$xml = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
$xml .= "\n".'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach ($posts as $post) {
$permalink = get_permalink($post);
$date = get_the_modified_date('c', $post);
$xml .= "\n<url>";
$xml .= "\n<loc>".esc_url($permalink)."</loc>";
$xml .= "\n<lastmod>".$date."</lastmod>";
$xml .= "\n<changefreq>weekly</changefreq>";
$xml .= "\n<priority>0.8</priority>";
$xml .= "\n</url>";
}
$xml .= "\n</urlset>";
return $xml;
}
Так мы исключим из карты все записи с меткой noindex и включим только те, у которых в произвольном поле show_in_sitemap стоит значение 1. Это даёт полный контроль над содержимым карты.
Кеширование карты сайта для повышения производительности
Генерация карты сайта при каждом запросе может нагружать сайт, особенно если много записей. Чтобы этого избежать, стоит кешировать результат. В WordPress для этого удобно использовать транзиенты:
function wproot_generate_sitemap_xml_cached() {
$cache_key = 'wproot_sitemap_xml';
$xml = get_transient($cache_key);
if ($xml !== false) {
return $xml;
}
$xml = wproot_generate_sitemap_xml();
// Кешируем на 6 часов
set_transient($cache_key, $xml, 6 * HOUR_IN_SECONDS);
return $xml;
}
// В template_redirect заменяем вызов на wproot_generate_sitemap_xml_cached()
add_action('template_redirect', 'wproot_sitemap_template_redirect');
function wproot_sitemap_template_redirect() {
if (get_query_var('custom_sitemap')) {
header('Content-Type: application/xml; charset="'.get_bloginfo('charset').'"');
echo wproot_generate_sitemap_xml_cached();
exit;
}
}
Теперь карта сайта будет пересоздаваться не чаще, чем раз в 6 часов, что сильно снизит нагрузку.
Использование готовых плагинов с расширенной фильтрацией
Если хочется быстрее получить функционал без кодинга, рассмотрите такие плагины с расширенной фильтрацией:
- Clearfy Pro — предлагает удобную фильтрацию типов записей, таксономий, исключение по ID и многое другое.
- Google XML Sitemaps — классика с базовой фильтрацией, но без гибких кастомизаций.
- WP Sitemap Page — позволяет выводить карты сайта в виде страницы с шорткодом, поддерживает базовые фильтры.
Для профессиональных проектов лучше использовать кастомный код или Clearfy Pro с его расширенными возможностями.
Настройка уведомления поисковых систем о новой карте сайта
После создания карты сайта не забудьте уведомить поисковые системы. Это можно сделать вручную в Google Search Console или добавить автоматическое уведомление в код, например, так:
function wproot_notify_search_engines() {
$sitemap_url = home_url('/custom-sitemap.xml');
$search_engines = [
'https://www.google.com/ping?sitemap=',
'https://search.yahoo.com/ping?sitemap=',
'https://www.bing.com/ping?sitemap=',
];
foreach ($search_engines as $url) {
wp_remote_get($url . urlencode($sitemap_url));
}
}
// Вызывать функцию после публикации записи
add_action('publish_post', 'wproot_notify_search_engines');
Это позволит ускорить переиндексацию сайта после обновления карты.
Итоговые рекомендации по созданию кастомной карты сайта
Подытожим ключевые моменты:
- Создайте endpoint для карты сайта через rewrite rules и query vars.
- Генерируйте XML с помощью WP_Query с фильтрами по категориям, меткам и метаполям.
- Добавьте кеширование через транзиенты для снижения нагрузки.
- Используйте уведомления поисковых систем после обновлений.
- При необходимости используйте готовые плагины, такие как Clearfy Pro, для расширенной фильтрации без кода.
Такой подход позволит вам гибко управлять содержимым карты сайта, повысить SEO и контролировать индексацию важных страниц.