Зачем создавать sitemap вручную в WordPress?
В современных версиях WordPress с 5.5 и выше встроена функция генерации базового sitemap.xml, но она имеет ограниченный функционал и не всегда учитывает все нюансы SEO-оптимизации. Например, по умолчанию не строится sitemap для пользовательских типов записей и таксономий, не учитываются приоритеты или частота обновления. Поэтому иногда возникает задача создать свой собственный sitemap, который будет гибко настраиваться под особенности сайта.
Использование плагинов для sitemap, например Clearfy Pro, упрощает задачу, но если хочется полностью контролировать процесс и избежать лишних плагинов, можно написать свой генератор sitemap на PHP.
Основные требования к sitemap.xml
Sitemap должен быть валидным XML документом, соответствовать стандарту Google Sitemap Protocol. Основные теги:
<urlset>— корневой элемент;<url>— элемент для каждой ссылки;<loc>— URL страницы;<lastmod>— дата последнего изменения;<changefreq>— частота изменения (optional);<priority>— приоритет URL (optional).
Правильное форматирование и кодировка UTF-8 обязательны.
Создаем простейший sitemap с помощью кода
Для начала создадим функцию, которая будет выводить sitemap с URL всех опубликованных постов. Добавим её в файл functions.php вашей темы или в отдельный плагин.
function wpinrp_generate_sitemap() {
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">';
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1
);
$posts = get_posts($args);
foreach ($posts as $post) {
setup_postdata($post);
$loc = get_permalink($post);
$lastmod = get_the_modified_date('c', $post);
echo "<url>";
echo "<loc>" . esc_url($loc) . "</loc>";
echo "<lastmod>" . $lastmod . "</lastmod>";
echo "<changefreq>weekly</changefreq>";
echo "<priority>0.8</priority>";
echo "</url>";
}
wp_reset_postdata();
echo "</urlset>";
exit;
}Данная функция выводит sitemap со всеми опубликованными постами, указывая дату последнего изменения, частоту обновления и приоритет.
Регистрируем endpoint для sitemap
Чтобы сделать sitemap доступным по адресу https://example.com/sitemap.xml, добавим rewrite rule и перехватим запрос.
function wpinrp_add_sitemap_rewrite_rule() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?sitemap=1', 'top');
}
add_action('init', 'wpinrp_add_sitemap_rewrite_rule');
function wpinrp_add_query_vars($vars) {
$vars[] = 'sitemap';
return $vars;
}
add_filter('query_vars', 'wpinrp_add_query_vars');
function wpinrp_template_redirect() {
if (get_query_var('sitemap') == 1) {
wpinrp_generate_sitemap();
}
}
add_action('template_redirect', 'wpinrp_template_redirect');После добавления этих функций необходимо сбросить правила перезаписи, зайдя в админку WordPress в Настройки > Постоянные ссылки и просто нажать «Сохранить изменения».
Добавляем кастомные типы записей и таксономии в sitemap
Чтобы sitemap включал не только стандартные записи, но и, например, страницы, кастомные типы записей и таксономии, расширим функцию генерации.
function wpinrp_generate_sitemap() {
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">';
$post_types = array('post', 'page', 'product'); // добавьте свои CPT
foreach ($post_types as $post_type) {
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1
);
$posts = get_posts($args);
foreach ($posts as $post) {
setup_postdata($post);
$loc = get_permalink($post);
$lastmod = get_the_modified_date('c', $post);
echo "<url>";
echo "<loc>" . esc_url($loc) . "</loc>";
echo "<lastmod>" . $lastmod . "</lastmod>";
echo "<changefreq>weekly</changefreq>";
echo "<priority>0.8</priority>";
echo "</url>";
}
wp_reset_postdata();
}
// Добавляем таксономии, например категории
$taxonomies = array('category', '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) {
$loc = get_term_link($term);
if (!is_wp_error($loc)) {
echo "<url>";
echo "<loc>" . esc_url($loc) . "</loc>";
echo "<changefreq>weekly</changefreq>";
echo "<priority>0.6</priority>";
echo "</url>";
}
}
}
}
echo "</urlset>";
exit;
}Таким образом, в sitemap попадут все записи указанных типов и термины таксономий.
Оптимизация и кеширование sitemap
При большом количестве записей динамическая генерация sitemap может замедлять сайт. Для решения используйте кеширование.
Например, можно сохранить сгенерированный sitemap в transient и обновлять кеш раз в сутки:
function wpinrp_generate_sitemap() {
$cached = get_transient('wpinrp_sitemap_cache');
if ($cached !== false) {
header('Content-Type: application/xml; charset=utf-8');
echo $cached;
exit;
}
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
// ... код генерации sitemap как выше ...
echo "</urlset>";
$sitemap_xml = ob_get_clean();
set_transient('wpinrp_sitemap_cache', $sitemap_xml, DAY_IN_SECONDS);
header('Content-Type: application/xml; charset=utf-8');
echo $sitemap_xml;
exit;
}Это значительно снизит нагрузку на сервер.
Проверка sitemap и отправка в поисковые системы
После создания sitemap обязательно проверьте его валидность с помощью инструментов, например Google Search Console Sitemap Test или онлайн-валидаторов XML.
Затем добавьте ссылку на sitemap.xml в файл robots.txt:
Sitemap: https://example.com/sitemap.xmlИ зарегистрируйте sitemap в Google Search Console и Яндекс.Вебмастере для быстрой индексации.
Заключение
Создание собственного sitemap с помощью кода — отличный способ получить гибкий и оптимизированный для поисковиков файл без лишних плагинов. Вы можете расширять функционал, добавлять поддержку новых типов контента, задавать индивидуальные частоты обновления и приоритеты. Если же хочется готового решения с расширенными функциями, рекомендуем обратить внимание на Clearfy Pro или другие популярные плагины.