Sitemap (карта сайта) — важный элемент для SEO и удобства индексации вашего сайта поисковыми системами. Многие начинающие и опытные администраторы WordPress предпочитают использовать плагины для генерации sitemap, но иногда возникает необходимость сделать это самостоятельно, без сторонних расширений. В этой статье мы подробно рассмотрим, как создать автоматический sitemap в WordPress без плагинов с помощью кода, а также разберём, как сделать его динамическим и актуальным.
Зачем нужен sitemap и особенности его создания в WordPress
Sitemap — это файл в формате XML, который содержит ссылки на все важные страницы сайта, а также метаданные, такие как дата последнего обновления и приоритет. Поисковые роботы используют sitemap для более эффективного обхода и индексации сайта.
В WordPress стандартно с версии 5.5 включён встроенный sitemap, но он достаточно базовый и не всегда учитывает все индивидуальные особенности сайта, например, кастомные типы записей или таксономии. Поэтому создание собственного sitemap даёт полный контроль над содержимым карты и её структурой.
Создание sitemap вручную позволяет:
- Добавлять кастомные типы записей и таксономии;
- Исключать ненужные страницы из индекса;
- Оптимизировать структуру для SEO-задач;
- Автоматически обновлять sitemap при изменении контента.
Создание базового sitemap в WordPress на PHP
Для начала создадим простой скрипт, который будет выводить ссылки на все опубликованные записи и страницы в формате XML. Этот код можно разместить в файле темы functions.php либо оформить как отдельный шаблон.
Пример базового кода для sitemap
function cyrtolat_generate_sitemap() {
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>\n';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';
// Получаем посты
$args = array(
'post_type' => array('post', 'page'),
'post_status' => 'publish',
'posts_per_page' => -1
);
$posts = get_posts($args);
foreach ($posts as $post) {
setup_postdata($post);
echo '<url>\n';
echo '<loc>' . esc_url(get_permalink($post->ID)) . '</loc>\n';
echo '<lastmod>' . get_the_modified_date('c', $post->ID) . '</lastmod>\n';
echo '<changefreq>weekly</changefreq>\n';
echo '<priority>0.8</priority>\n';
echo '</url>\n';
}
wp_reset_postdata();
echo '</urlset>';
exit;
}
// Регистрируем endpoint для sitemap
add_action('init', function() {
add_rewrite_rule('^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top');
});
add_filter('query_vars', function($vars) {
$vars[] = 'custom_sitemap';
return $vars;
});
add_action('template_redirect', function() {
if (get_query_var('custom_sitemap')) {
cyrtolat_generate_sitemap();
}
});Этот код создаёт новый URL https://ваш-сайт/custom-sitemap.xml, который выводит xml-карту сайта с постами и страницами.
После добавления кода не забудьте обновить правила перезаписи (Permalinks) в админке WordPress — просто сохраните настройки постоянных ссылок, чтобы правило вступило в силу.
Добавление кастомных типов записей и таксономий в sitemap
В реальном проекте почти всегда используются не только стандартные записи и страницы, но и кастомные типы записей (Custom Post Types, CPT), а также таксономии (например, категории и метки). Их тоже следует включать в sitemap.
Пример кода с CPT и таксономиями
function cyrtolat_generate_sitemap() {
header('Content-Type: application/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>\n';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';
// Типы записей для sitemap
$post_types = array('post', 'page', 'product', 'news'); // добавьте свои CPT
foreach ($post_types as $post_type) {
$posts = get_posts(array(
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => -1
));
foreach ($posts as $post) {
setup_postdata($post);
echo '<url>\n';
echo '<loc>' . esc_url(get_permalink($post->ID)) . '</loc>\n';
echo '<lastmod>' . get_the_modified_date('c', $post->ID) . '</lastmod>\n';
echo '<changefreq>weekly</changefreq>\n';
echo '<priority>0.7</priority>\n';
echo '</url>\n';
}
}
wp_reset_postdata();
// Добавляем таксономии (категории, метки и др.)
$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) {
echo '<url>\n';
echo '<loc>' . esc_url(get_term_link($term)) . '</loc>\n';
echo '<changefreq>weekly</changefreq>\n';
echo '<priority>0.5</priority>\n';
echo '</url>\n';
}
}
}
echo '</urlset>';
exit;
}В этом примере в sitemap добавляются записи, страницы, кастомные типы post_type 'product' и 'news', а также категории и теги.
Оптимизация и кеширование sitemap
Генерация sitemap динамически при каждом обращении может создавать нагрузку на сервер, особенно на крупных проектах с тысячами записей. Чтобы оптимизировать работу, рекомендуется кешировать сгенерированный XML.
Можно использовать transient API WordPress или записывать sitemap в файл на сервере и обновлять его по расписанию через WP-Cron.
Пример кеширования sitemap с использованием transient API
function cyrtolat_generate_sitemap_with_cache() {
$cache_key = 'cyrtolat_sitemap_cache';
$cached_sitemap = get_transient($cache_key);
if ($cached_sitemap) {
header('Content-Type: application/xml; charset=utf-8');
echo $cached_sitemap;
exit;
}
ob_start();
// Вставьте сюда код генерации sitemap (как в предыдущих примерах)
// Например, вызов функции cyrtolat_generate_sitemap_content() которая возвращает xml строку
echo '<?xml version="1.0" encoding="UTF-8"?>\n';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n';
$posts = get_posts(array('post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1));
foreach ($posts as $post) {
setup_postdata($post);
echo '<url>\n';
echo '<loc>' . esc_url(get_permalink($post->ID)) . '</loc>\n';
echo '<lastmod>' . get_the_modified_date('c', $post->ID) . '</lastmod>\n';
echo '<changefreq>weekly</changefreq>\n';
echo '<priority>0.8</priority>\n';
echo '</url>\n';
}
wp_reset_postdata();
echo '</urlset>';
$sitemap_content = ob_get_clean();
set_transient($cache_key, $sitemap_content, 12 * HOUR_IN_SECONDS); // Кеш на 12 часов
header('Content-Type: application/xml; charset=utf-8');
echo $sitemap_content;
exit;
}Такой подход значительно снижает нагрузку на базу данных и ускоряет отдачу sitemap роботу поисковой системы.
Использование плагинов WPSHOP для создания и управления sitemap
Если всё же хочется использовать готовые решения с расширенными возможностями, обратите внимание на плагины из каталога WPSHOP. Например, плагин Clearfy Pro позволяет гибко управлять SEO-настройками, включая генерацию sitemap с расширенными фильтрами.
Также полезны плагины, которые автоматизируют очистку и оптимизацию базы данных, чтобы sitemap всегда отражал актуальную структуру сайта.
Проверка и отправка sitemap в поисковые системы
После создания sitemap важно проверить его валидность. Для этого можно использовать официальные инструменты Google Search Console и Яндекс.Вебмастер. Там же можно отправить ссылку на sitemap для ускорения индексации.
URL sitemap будет выглядеть примерно так: https://ваш-сайт/custom-sitemap.xml. Убедитесь, что этот адрес доступен и корректно отдаёт XML.
В файле robots.txt добавьте строку:
Sitemap: https://ваш-сайт/custom-sitemap.xmlЭто дополнительно поможет поисковым ботам найти карту сайта.
Итоги
Создание собственного автоматического sitemap в WordPress без плагинов даёт полный контроль над содержимым и позволяет включать в карту любые типы записей и таксономии. Использование кеширования снижает нагрузку на сервер и ускоряет отдачу. При необходимости можно дополнить функционал готовыми решениями из WPSHOP.
Такой подход идеально подходит для сайтов с нестандартной структурой и высокими требованиями к SEO.