Sitemap — важный элемент для SEO и индексации сайта поисковыми системами. Большинство пользователей WordPress устанавливают плагины для генерации sitemap, но иногда нужно создать индивидуальное решение без дополнительных плагинов. В этой статье разберём, как создать простой и эффективный sitemap.xml с помощью кода, интегрированного в тему или плагин.
Зачем создавать собственный sitemap в WordPress
Хотя WordPress с версии 5.5 имеет встроенный sitemap, в некоторых случаях его функционала может не хватать. Например, вы хотите исключить определённые типы записей, добавить кастомные таксономии или контролировать структуру URL.
Создавая sitemap самостоятельно, вы получаете полный контроль над содержимым и структурой файла. Это помогает оптимизировать индексацию и избежать попадания в sitemap лишних страниц.
Кроме того, собственный sitemap можно легко интегрировать с SEO-плагинами и использовать для специфических целей, например, для мультиязычных сайтов или сайтов с большим количеством пользовательского контента.
Основные принципы работы sitemap.xml
Sitemap — это XML-файл, который содержит список URL вашего сайта с дополнительными метаданными: датой последнего обновления, частотой изменения и приоритетом страницы для поисковых систем.
Стандарт sitemap описан на сайте sitemaps.org. Следование этому стандарту обязательно для корректного восприятия файла поисковыми системами.
Файл обычно называется sitemap.xml и размещается в корне сайта или доступен по адресу https://ваш-домен.ru/sitemap.xml.
Как создать sitemap.xml вручную в WordPress
Рассмотрим простой пример, как сгенерировать sitemap.xml динамически, используя хуки WordPress и собственный PHP-код.
1. Создание rewrite правила для sitemap
Для начала нужно зарегистрировать новый endpoint, чтобы при обращении к URL /sitemap.xml WordPress вызвал наш код.
function wptips_add_sitemap_rewrite_rule() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?sitemap=1', 'top');
}
add_action('init', 'wptips_add_sitemap_rewrite_rule');Далее добавим новый query_var, чтобы распознавать параметр:
function wptips_add_sitemap_query_var($vars) {
$vars[] = 'sitemap';
return $vars;
}
add_filter('query_vars', 'wptips_add_sitemap_query_var');2. Перехват запроса и вывод sitemap
Теперь нужно отследить, когда пользователь обращается к sitemap=1, и вывести XML с заголовками:
function wptips_sitemap_template_redirect() {
if (get_query_var('sitemap') == 1) {
header('Content-Type: application/xml; charset=utf-8');
echo wptips_generate_sitemap_xml();
exit;
}
}
add_action('template_redirect', 'wptips_sitemap_template_redirect');3. Генерация XML карты сайта
Функция wptips_generate_sitemap_xml будет собирать URL и формировать XML-структуру.
function wptips_generate_sitemap_xml() {
$posts = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1
));
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
$xml .= "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
foreach ($posts as $post) {
$permalink = get_permalink($post);
$lastmod = get_the_modified_date('c', $post);
$xml .= "\n<url>";
$xml .= "\n<loc>" . esc_url($permalink) . "</loc>";
$xml .= "\n<lastmod>" . $lastmod . "</lastmod>";
$xml .= "\n<changefreq>weekly</changefreq>";
$xml .= "\n<priority>0.8</priority>";
$xml .= "\n</url>";
}
$xml .= "\n</urlset>";
return $xml;
}Расширение sitemap для страниц, категорий и пользовательских типов записей
Чтобы сделать sitemap более полным, можно добавить страницы, категории и таксономии. Для примера добавим страницы и категории:
function wptips_generate_sitemap_xml() {
$items = array();
// Посты
$posts = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'numberposts' => -1
));
foreach ($posts as $post) {
$items[] = array(
'loc' => get_permalink($post),
'lastmod' => get_the_modified_date('c', $post),
'changefreq' => 'weekly',
'priority' => '0.8'
);
}
// Страницы
$pages = get_pages(array('post_status' => 'publish'));
foreach ($pages as $page) {
$items[] = array(
'loc' => get_permalink($page),
'lastmod' => get_the_modified_date('c', $page),
'changefreq' => 'monthly',
'priority' => '0.6'
);
}
// Категории
$categories = get_categories(array('hide_empty' => true));
foreach ($categories as $cat) {
$items[] = array(
'loc' => get_category_link($cat),
'lastmod' => date('c'),
'changefreq' => 'weekly',
'priority' => '0.5'
);
}
$xml = '<?xml version="1.0" encoding="UTF-8"?>';
$xml .= "\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">";
foreach ($items as $item) {
$xml .= "\n<url>";
$xml .= "\n<loc>" . esc_url($item['loc']) . "</loc>";
$xml .= "\n<lastmod>" . $item['lastmod'] . "</lastmod>";
$xml .= "\n<changefreq>" . $item['changefreq'] . "</changefreq>";
$xml .= "\n<priority>" . $item['priority'] . "</priority>";
$xml .= "\n</url>";
}
$xml .= "\n</urlset>";
return $xml;
}Советы по оптимизации и безопасность sitemap
При создании собственного sitemap важно избегать ошибок, которые могут привести к некорректной индексации сайта.
- Проверяйте, что все URL валидны и доступны.
- Регулярно обновляйте дату последней модификации, чтобы поисковики знали о свежем контенте.
- Используйте кэширование sitemap, если сайт большой, чтобы снизить нагрузку на сервер.
- Не включайте в sitemap страницы с параметрами, дублирующийся контент или страницы с noindex.
Для кэширования можно использовать transient API WordPress:
function wptips_generate_sitemap_xml() {
$cached = get_transient('wptips_sitemap_cache');
if ($cached) {
return $cached;
}
// ... генерация sitemap как ранее ...
$xml = '...';
set_transient('wptips_sitemap_cache', $xml, 12 * HOUR_IN_SECONDS);
return $xml;
}Использование плагинов для расширенного sitemap
Если создавать sitemap вручную не хочется, на рынке есть мощные плагины с поддержкой кастомизации.
Например, Clearfy Pro (подробнее на WPSHOP) позволяет гибко настраивать sitemap, отключать нежелательные страницы, интегрируется с SEO-плагинами.
Также стоит обратить внимание на плагины, которые умеют создавать sitemap для WooCommerce, кастомных типов записей и мультиязычных сайтов.
Подведение итогов
Создание собственного sitemap в WordPress с помощью кода — отличный способ получить полный контроль над индексацией вашего сайта, оптимизировать его под нужды SEO и избежать лишних плагинов. В статье мы подробно рассмотрели, как зарегистрировать endpoint, сформировать XML и расширить функционал.
Если хочется удобства и дополнительных функций, можно использовать специализированные плагины из WPSHOP.