Зачем нужен XML Sitemap в WordPress
XML Sitemap — это файл, который помогает поисковым системам, таким как Google и Яндекс, лучше индексировать ваш сайт. Он содержит список всех доступных страниц, постов и других типов контента, что значительно ускоряет и облегчает процесс сканирования сайта. Многие используют готовые плагины для создания sitemap, например, Yoast SEO или Rank Math, но иногда полезно знать, как реализовать это самостоятельно, чтобы минимизировать количество плагинов и повысить производительность сайта.
В этой статье мы подробно разберём, как создать динамический XML Sitemap на WordPress с помощью собственного кода, который автоматически обновляется при добавлении нового контента.
Как создать XML Sitemap без плагинов — базовая логика
Основная идея — создать отдельный endpoint (URL) на сайте, который будет выдавать XML-файл с актуальным списком ссылок. Для этого мы добавим правило в rewrite API WordPress, обработаем запрос и сформируем корректный XML.
Преимущества такого подхода:
- Отсутствие лишних плагинов — меньше нагрузки на сайт.
- Гибкость и контроль над структурой sitemap.
- Возможность оптимизации под свои нужды.
Создание rewrite правила и обработчика sitemap
Добавим в файл functions.php вашей темы или в отдельный плагин следующий код для регистрации нового URL /sitemap.xml:
function wpdigest_register_sitemap_rewrite() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?wpdigest_sitemap=1', 'top');
}
add_action('init', 'wpdigest_register_sitemap_rewrite');
function wpdigest_add_query_vars($vars) {
$vars[] = 'wpdigest_sitemap';
return $vars;
}
add_filter('query_vars', 'wpdigest_add_query_vars');
function wpdigest_template_redirect() {
if (get_query_var('wpdigest_sitemap')) {
wpdigest_generate_sitemap_xml();
exit;
}
}
add_action('template_redirect', 'wpdigest_template_redirect');Объяснение кода:
add_rewrite_ruleдобавляет правило, чтобы запрос к/sitemap.xmlобрабатывался нашим параметромwpdigest_sitemap.add_filter('query_vars')регистрирует этот параметр в WordPress.template_redirectперехватывает запрос и вызывает функцию генерации sitemap, если параметр установлен.
После добавления этого кода необходимо обновить правила перезаписи, перейдя в админке WordPress в Настройки > Постоянные ссылки и просто нажав кнопку «Сохранить изменения».
Генерация XML Sitemap с постами и страницами
Создадим функцию wpdigest_generate_sitemap_xml(), которая выведет sitemap в формате XML. В этом примере мы включим в sitemap страницы, записи и произвольные типы постов (если нужно, их можно расширить).
function wpdigest_generate_sitemap_xml() {
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
// Главная страница
echo '<url><loc>' . esc_url(home_url('/')) . '</loc><priority>1.0</priority></url>';
// Получаем все опубликованные записи и страницы
$args = array(
'post_type' => array('post', 'page'),
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'modified',
'order' => 'DESC',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$loc = get_permalink();
$lastmod = get_post_modified_time('c');
echo "<url><loc>" . esc_url($loc) . "</loc><lastmod>" . $lastmod . "</lastmod><priority>0.8</priority></url>";
}
wp_reset_postdata();
}
echo '</urlset>';
}Объяснение:
- Заголовок
Content-Typeсообщает браузеру и поисковикам, что это XML файл. - Добавляем главную страницу с приоритетом 1.0 — это важно для SEO.
- Запрашиваем все опубликованные посты и страницы, сортируя по дате изменения.
- Для каждого элемента выводим URL, дату последнего изменения и приоритет.
Добавление пользовательских типов записей и таксономий в sitemap
Если у вас есть сайты с кастомными типами постов (например, портфолио, товары, отзывы), их тоже можно включить в sitemap. Для этого достаточно добавить нужные типы в массив аргументов:
$args = array(
'post_type' => array('post', 'page', 'portfolio', 'product'), // добавляем свои типы
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'modified',
'order' => 'DESC',
);Кроме того, полезно добавить sitemap для таксономий — категорий и тегов. Это делается отдельным циклом:
$taxonomies = array('category', 'post_tag');
foreach ($taxonomies as $taxonomy) {
$terms = get_terms(array(
'taxonomy' => $taxonomy,
'hide_empty' => true,
));
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $term) {
$term_link = get_term_link($term);
if (!is_wp_error($term_link)) {
echo "<url><loc>" . esc_url($term_link) . "</loc><priority>0.6</priority></url>";
}
}
}
}<Это позволит поисковикам быстрее индексировать все важные разделы сайта.
Как проверить и отладить созданный sitemap
После реализации sitemap откройте в браузере https://ваш-сайт.ru/sitemap.xml. Вы должны увидеть валидный XML с тегами <urlset>. Если выдаёт ошибку 404, проверьте, обновлены ли правила перезаписи (перейдите в Настройки постоянных ссылок и нажмите «Сохранить»).
Для проверки валидности XML можно использовать сервисы Google Search Console или https://www.xml-sitemaps.com/validate-xml-sitemap.html.
Также можно добавить sitemap в файл robots.txt, чтобы поисковики быстрее его нашли:
function wpdigest_add_sitemap_to_robots($output, $public) {
if ($public) {
$output .= "\nSitemap: " . home_url('/sitemap.xml') . "\n";
}
return $output;
}
add_filter('robots_txt', 'wpdigest_add_sitemap_to_robots', 10, 2);Заключение и рекомендации по производительности
Самодельный sitemap — это отличный способ лучше контролировать индексацию сайта. Однако при большом количестве записей стоит подумать о кэшировании результата, чтобы не нагружать базу данных на каждом запросе.
Пример простого кэширования с использованием Transients API:
function wpdigest_generate_sitemap_xml() {
header('Content-Type: application/xml; charset=utf-8');
$cached_sitemap = get_transient('wpdigest_sitemap_cache');
if ($cached_sitemap !== false) {
echo $cached_sitemap;
return;
}
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
echo '<url><loc>' . esc_url(home_url('/')) . '</loc><priority>1.0</priority></url>';
// Получение постов и страниц как ранее
$args = array(
'post_type' => array('post', 'page'),
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'modified',
'order' => 'DESC',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$loc = get_permalink();
$lastmod = get_post_modified_time('c');
echo "<url><loc>" . esc_url($loc) . "</loc><lastmod>" . $lastmod . "</lastmod><priority>0.8</priority></url>";
}
wp_reset_postdata();
}
echo '</urlset>';
$sitemap_output = ob_get_clean();
set_transient('wpdigest_sitemap_cache', $sitemap_output, HOUR_IN_SECONDS);
echo $sitemap_output;
}Таким образом, sitemap будет генерироваться не чаще раза в час, снижая нагрузку.
Если вы хотите более продвинутую оптимизацию и дополнительные функции, обратите внимание на плагин Clearfy Pro, который умеет оптимизировать sitemap, ускорять сайт и многое другое.