XML Sitemap — важный инструмент для SEO, который помогает поисковым системам быстро и эффективно индексировать страницы сайта. Многие используют плагины для создания Sitemap, однако иногда требуется более легкое и гибкое решение без дополнительной нагрузки на сайт. В этом материале мы рассмотрим, как создать автоматически обновляемый Sitemap в WordPress без плагинов с помощью своего кода.
Почему стоит создавать Sitemap без плагинов
Плагины для Sitemap удобны, но они добавляют дополнительный вес и могут конфликтовать с другими инструментами. К тому же, написание собственного решения дает полный контроль над структурой и содержимым Sitemap. Это особенно полезно на сайтах с нестандартной структурой или кастомными типами записей.
Кроме того, самостоятельное создание Sitemap позволяет оптимизировать запросы к базе данных, исключить лишние URL и динамически обновлять карту сайта при добавлении новых материалов.
Основные требования к Sitemap XML
Для корректной работы Sitemap должен соответствовать стандарту Sitemap Protocol. В нем указываются URL страниц сайта, дата последнего обновления, приоритет и частота изменения. Минимально необходимо указать URL и дату изменения.
Обязательно соблюдение правильной кодировки (UTF-8) и структуры XML. Наше решение будет генерировать валидный XML, который можно проверить через инструменты Google Search Console и Яндекс.Вебмастер.
Создание функции генерации Sitemap в WordPress
Для начала создадим функцию wp_lessons_generate_sitemap, которая будет формировать XML-контент карты сайта с учетом стандартных и кастомных типов записей.
function wp_lessons_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 = [
'post_type' => ['post', 'page'],
'post_status' => 'publish',
'posts_per_page' => -1
];
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
$url = get_permalink();
$modified = get_the_modified_date('c');
echo '<url>';
echo '<loc>' . esc_url($url) . '</loc>';
echo '<lastmod>' . esc_html($modified) . '</lastmod>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.8</priority>';
echo '</url>';
}
wp_reset_postdata();
echo '</urlset>';
exit;
}Эта функция выводит список всех опубликованных записей и страниц с датой последнего изменения и базовыми значениями changefreq и priority.
Регистрация rewrite правила и endpoint для Sitemap
Для удобного доступа к карте сайта создадим endpoint /sitemap.xml с помощью rewrite правил. Добавим в functions.php следующий код:
function wp_lessons_add_sitemap_rewrite() {
add_rewrite_rule('^sitemap\.xml$', 'index.php?sitemap=1', 'top');
}
add_action('init', 'wp_lessons_add_sitemap_rewrite');
function wp_lessons_add_query_var($vars) {
$vars[] = 'sitemap';
return $vars;
}
add_filter('query_vars', 'wp_lessons_add_query_var');
function wp_lessons_template_redirect_sitemap() {
if (get_query_var('sitemap') == 1) {
wp_lessons_generate_sitemap();
}
}
add_action('template_redirect', 'wp_lessons_template_redirect_sitemap');После добавления этого кода необходимо обновить настройки пермалинков (Настройки - Постоянные ссылки) для активации правила.
Добавление кастомных типов записей и таксономий в Sitemap
Если на сайте используются кастомные типы записей, например, product или portfolio, их тоже стоит добавить в Sitemap. Для этого расширим аргументы запроса:
$args = [
'post_type' => ['post', 'page', 'product', 'portfolio'],
'post_status' => 'publish',
'posts_per_page' => -1
];Также можно добавить таксономии, например категории или теги, чтобы они тоже индексировались:
$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>';
}
}
}<Оптимизация и кеширование Sitemap
Генерация Sitemap на больших сайтах может занимать много времени. Чтобы избежать нагрузки, стоит добавить кеширование результата с помощью Transients API:
function wp_lessons_generate_sitemap() {
header('Content-Type: application/xml; charset=utf-8');
$cached = get_transient('wp_lessons_sitemap_cache');
if ($cached) {
echo $cached;
exit;
}
ob_start();
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
// здесь код выборки постов и таксономий (как выше)
echo '</urlset>';
$output = ob_get_clean();
set_transient('wp_lessons_sitemap_cache', $output, 12 * HOUR_IN_SECONDS);
echo $output;
exit;
}Так Sitemap будет генерироваться не чаще одного раза в 12 часов, что значительно снизит нагрузку.
Интеграция с плагинами и темами WPSHOP
Для пользователей WPSHOP, например с темой Reboot или плагинами типа Clearfy Pro, можно расширить Sitemap дополнительными URL, например, страницами настроек или пользовательскими разделами. Для этого добавьте соответствующие URL вручную в XML или расширьте функцию выборки.
Проверка Sitemap и рекомендации
После реализации Sitemap обязательно проверьте его работоспособность через:
- Google Search Console — раздел «Sitemaps»;
- Яндекс.Вебмастер — раздел «Индексирование»;
- валидаторы XML, например xml-sitemaps.com.
Обратите внимание на правильное отображение всех URL и отсутствие ошибок. При необходимости корректируйте функцию генерации.