Для многих сайтов на WordPress sitemap (карта сайта) является важным инструментом для SEO и правильной индексации страниц поисковыми системами. Обычно для создания sitemap используют плагины, например, популярный Yoast SEO или Google XML Sitemaps. Но иногда хочется обойтись без плагинов — чтобы снизить нагрузку, повысить безопасность или получить более гибкий контроль над процессом.
Что такое sitemap и зачем он нужен в WordPress
Sitemap — это XML-файл, в котором перечислены URL сайта с дополнительной информацией: когда страница обновлялась, как часто меняется и приоритет для индексации. Поисковики, такие как Google, Яндекс и Bing, используют эту карту для более эффективного обхода и индексирования сайта.
В WordPress по умолчанию с версии 5.5 есть базовая поддержка sitemap, но она достаточно простая и не всегда подходит для сложных сайтов с кастомными типами записей и таксономиями. В таких случаях можно написать собственный генератор sitemap, который будет удовлетворять именно вашим требованиям.
Как создать sitemap в WordPress без плагинов: пошаговое руководство
1. Создаем пользовательскую функцию для генерации sitemap
Все действия будем выполнять через functions.php вашей темы или в отдельном подключаемом файле. Главная идея — при обращении к специальному URL (например, /sitemap.xml) выводить XML с картой сайта.
add_action('init', 'wordpressa_register_sitemap_endpoint');
function wordpressa_register_sitemap_endpoint() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?sitemap=1', 'top');
}
add_filter('query_vars', 'wordpressa_add_sitemap_query_var');
function wordpressa_add_sitemap_query_var($vars) {
$vars[] = 'sitemap';
return $vars;
}
add_action('template_redirect', 'wordpressa_sitemap_template_redirect');
function wordpressa_sitemap_template_redirect() {
if (get_query_var('sitemap')) {
header('Content-Type: application/xml; charset=' . get_bloginfo('charset'), true);
echo wordpressa_generate_sitemap();
exit;
}
}Эти функции регистрируют правило, которое обрабатывает запросы к /sitemap.xml, и возвращают в ответ XML-контент.
2. Генерируем XML-карту сайта с основными страницами
Функция wordpressa_generate_sitemap() собирает URL сайта — в нашем случае это главная страница, страницы, записи и категории.
function wordpressa_generate_sitemap() {
$site_url = get_site_url();
$posts = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1
));
$pages = get_pages(array(
'sort_column' => 'post_date',
'sort_order' => 'DESC'
));
$sitemap = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
$sitemap .= "\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
// Главная страница
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . esc_url($site_url) . "</loc>\n";
$sitemap .= " <priority>1.0</priority>\n";
$sitemap .= " </url>\n";
// Записи
foreach ($posts as $post) {
setup_postdata($post);
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . get_permalink($post) . "</loc>\n";
$sitemap .= " <lastmod>" . get_the_modified_date('c', $post) . "</lastmod>\n";
$sitemap .= " <priority>0.8</priority>\n";
$sitemap .= " </url>\n";
}
wp_reset_postdata();
// Страницы
foreach ($pages as $page) {
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . get_permalink($page) . "</loc>\n";
$sitemap .= " <lastmod>" . get_the_modified_date('c', $page) . "</lastmod>\n";
$sitemap .= " <priority>0.7</priority>\n";
$sitemap .= " </url>\n";
}
// Категории
$categories = get_categories();
foreach ($categories as $category) {
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . esc_url(get_category_link($category->term_id)) . "</loc>\n";
$sitemap .= " <priority>0.6</priority>\n";
$sitemap .= " </url>\n";
}
$sitemap .= "</urlset>";
return $sitemap;
}В этом коде описаны основные типы контента, которые нужно включить в sitemap. Для добавления пользовательских типов записей или таксономий достаточно расширить запросы.
Добавляем кастомные типы записей и таксономии в sitemap
Если у вас есть кастомные типы записей, например, 'portfolio', или таксономии, например, 'product_cat', их тоже стоит включить в карту сайта.
function wordpressa_generate_sitemap() {
$site_url = get_site_url();
$post_types = array('post', 'page', 'portfolio'); // Добавьте свои типы
$sitemap = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>';
$sitemap .= "\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
// Главная страница
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . esc_url($site_url) . "</loc>\n";
$sitemap .= " <priority>1.0</priority>\n";
$sitemap .= " </url>\n";
foreach ($post_types as $post_type) {
$posts = get_posts(array(
'post_type' => $post_type,
'post_status' => 'publish',
'numberposts' => -1
));
foreach ($posts as $post) {
setup_postdata($post);
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . get_permalink($post) . "</loc>\n";
$sitemap .= " <lastmod>" . get_the_modified_date('c', $post) . "</lastmod>\n";
$sitemap .= " <priority>0.8</priority>\n";
$sitemap .= " </url>\n";
}
wp_reset_postdata();
}
// Таксономии
$taxonomies = array('category', 'post_tag', 'product_cat'); // Добавьте свои таксономии
foreach ($taxonomies as $taxonomy) {
$terms = get_terms(array('taxonomy' => $taxonomy, 'hide_empty' => true));
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $term) {
$sitemap .= " <url>\n";
$sitemap .= " <loc>" . esc_url(get_term_link($term)) . "</loc>\n";
$sitemap .= " <priority>0.6</priority>\n";
$sitemap .= " </url>\n";
}
}
}
$sitemap .= "</urlset>";
return $sitemap;
}Таким образом, вы получите расширенную sitemap, идеально подходящую под структуру вашего сайта.
Обновление правил пермалинков и тестирование sitemap
После добавления правил для обработки /sitemap.xml необходимо обновить настройки постоянных ссылок в админке WordPress: зайдите в «Настройки» → «Постоянные ссылки» и нажмите кнопку «Сохранить изменения» без изменения настроек. Это сбросит кэш правил и позволит новому URL работать.
Проверьте работу sitemap, открыв в браузере https://ваш-сайт.ru/sitemap.xml. Если все сделано правильно, вы увидите сгенерированный XML-файл.
Рекомендации и улучшения для кастомного sitemap
Собственный sitemap без плагинов дает гибкость, но требует поддержки. Вот что можно добавить:
- Кэширование результата в transient или в файл, чтобы снизить нагрузку на сервер.
- Разбитие sitemap на несколько частей, если сайт большой (по 50000 URL — лимит поисковиков).
- Добавление дополнительных тегов, например,
<changefreq>и<priority>с более точной настройкой. - Автоматическое уведомление поисковых систем о новом sitemap через функцию
wp_remote_get()с запросом к API Google или Яндекса.
Пример кэширования sitemap для повышения производительности
Чтобы не генерировать XML каждый раз при обращении, используйте transient API WordPress:
function wordpressa_generate_sitemap() {
$cache_key = 'wordpressa_sitemap_cache';
$sitemap = get_transient($cache_key);
if ($sitemap !== false) {
return $sitemap;
}
// Генерация sitemap как раньше
// ... код генерации sitemap ...
// Для примера используем сокращённый код
$sitemap = '<?xml version="1.0" encoding="'.get_bloginfo('charset').'"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n <url>\n <loc>' . esc_url(get_site_url()) . '</loc>\n </url>\n</urlset>';
set_transient($cache_key, $sitemap, 12 * HOUR_IN_SECONDS); // Кэш на 12 часов
return $sitemap;
}Это существенно снижает нагрузку на сервер при большом количестве посещений.
Альтернативы и плагины для sitemap
Если вы всё же предпочтёте использовать плагины, обратите внимание на:
- Clearfy Pro — в том числе оптимизация SEO и генерация sitemap.
- JournalX — тема с расширенными SEO возможностями и поддержкой sitemap.
Но собственный код даст максимум контроля и легкости.