Карта сайта (Sitemap) — это важный элемент для улучшения индексации вашего сайта поисковыми системами. Многие используют готовые плагины, однако создание собственной динамической карты сайта позволит вам полностью контролировать ее структуру и оптимизировать под свои нужды. В этой статье подробно разберем, как с помощью чистого PHP-кода и стандартных функций WordPress создать автоматический Sitemap, который будет обновляться при появлении новых записей.
Что такое Sitemap и зачем он нужен
Sitemap — это файл, обычно в формате XML, который содержит список всех страниц сайта, доступных для индексирования поисковыми системами. Поисковые роботы используют Sitemap, чтобы быстрее и точнее находить новые или измененные страницы. Это особенно важно для крупных сайтов с большим количеством контента или сложной структурой.
В WordPress по умолчанию с версии 5.5 появился встроенный базовый Sitemap, но он очень простой и не всегда подойдет для сложных задач. Создание собственного Sitemap дает гибкость и позволяет добавить в него кастомные типы записей, таксономии, а также управлять приоритетом и частотой обновления.
Как работает динамический Sitemap на WordPress
Идея состоит в том, чтобы при обращении к определенному URL (например, /sitemap.xml) WordPress генерировал XML-файл с актуальной информацией о страницах сайта. Для этого мы создадим специальный обработчик запросов, который выведет XML с нужными данными.
Основные шаги:
- Зарегистрировать rewrite-правило для URL /sitemap.xml
- Создать функцию-генератор XML с контентом Sitemap
- Подключить функцию к хуку WordPress для обработки запроса
- Обеспечить правильные заголовки HTTP для XML
Пример кода для создания Sitemap
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wprus_add_sitemap_rewrite_rule() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?wprus_sitemap=1', 'top');
}
add_action('init', 'wprus_add_sitemap_rewrite_rule');
function wprus_add_query_var($vars) {
$vars[] = 'wprus_sitemap';
return $vars;
}
add_filter('query_vars', 'wprus_add_query_var');
function wprus_generate_sitemap() {
global $wp_query;
if (get_query_var('wprus_sitemap') != 1) {
return;
}
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">';
// Получаем все опубликованные страницы
$pages = get_posts([
'post_type' => ['post', 'page'],
'post_status' => 'publish',
'numberposts' => -1
]);
foreach ($pages as $page) {
$url = get_permalink($page->ID);
$modified = get_post_modified_time('c', true, $page->ID);
echo '<url>';
echo '<loc>' . esc_url($url) . '</loc>';
echo '<lastmod>' . $modified . '</lastmod>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.8</priority>';
echo '</url>';
}
echo '</urlset>';
exit;
}
add_action('template_redirect', 'wprus_generate_sitemap');
// Чтобы новые правила заработали, нужно обновить пермалинки один раз в админке
Объяснение кода
Мы добавляем новое правило перезаписи, которое перехватывает запрос к /sitemap.xml и передает управление нашему обработчику. В функции wprus_generate_sitemap проверяем, что запрос именно к sitemap, и выводим XML с данными всех опубликованных постов и страниц.
Использование стандартной функции get_posts позволяет легко расширять список для других типов записей или таксономий. В тегах <lastmod> указываем дату последнего изменения записи в формате ISO, что важно для поисковых систем.
Добавление кастомных типов записей и таксономий в Sitemap
Если у вас есть кастомные типы записей (например, портфолио, товары или обзоры), их также следует включить в Sitemap. Для этого достаточно изменить параметр post_type в запросе:
$pages = get_posts([
'post_type' => ['post', 'page', 'portfolio', 'product'],
'post_status' => 'publish',
'numberposts' => -1
]);
Помимо типов записей, полезно добавить таксономии, например категории или метки. Для этого нужно получить термины и вывести их URL:
$taxonomies = ['category', 'post_tag'];
foreach ($taxonomies as $taxonomy) {
$terms = get_terms(['taxonomy' => $taxonomy, 'hide_empty' => true]);
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $term) {
$url = get_term_link($term);
echo '<url>';
echo '<loc>' . esc_url($url) . '</loc>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.6</priority>';
echo '</url>';
}
}
}
Оптимизация и рекомендации по SEO для Sitemap
Чтобы Sitemap работал максимально эффективно, рекомендуем:
- Обновлять карту сайта при публикации и обновлении контента. Можно добавить триггеры на хуки
save_postдля сброса кэша. - Добавлять правильные теги
<priority>и<changefreq>в зависимости от важности и частоты обновления страниц. - Отправить Sitemap в Google Search Console и Яндекс.Вебмастер для ускорения индексации.
- Использовать кэширование результатов генерации, если сайт большой, чтобы снизить нагрузку.
Альтернатива: использование плагина Clearfy Pro для управления Sitemap
Если вы хотите более простой способ без кода, обратите внимание на плагин Clearfy Pro. Он позволяет гибко настраивать Sitemap, отключать ненужные типы записей, добавлять кастомные URL и многое другое, не погружаясь в программирование.
Плагин отлично подойдет тем, кто хочет быстро получить SEO-оптимизированную карту сайта с минимальными усилиями и максимальной надежностью.
Выводы
Создание собственного динамического Sitemap в WordPress — задача вполне выполнимая с минимальными знаниями PHP и особенностей WP. Такой подход дает полный контроль над содержанием карты сайта и позволяет адаптировать ее под уникальные потребности вашего проекта. Если же хочется более удобный интерфейс и дополнительные функции, рекомендуем попробовать плагин Clearfy Pro.