Для улучшения индексации сайта поисковыми системами важным элементом является наличие актуального sitemap.xml. Многие пользуются плагинами, но иногда хочется более легкое и кастомное решение. В этой статье разберём, как создать автоматический sitemap для WordPress с помощью минимального кода, без сторонних плагинов.
Что такое Sitemap и зачем он нужен в WordPress
Sitemap — это XML-файл, который содержит список всех важных страниц сайта для поисковых систем. Он помогает поисковикам быстрее находить новые страницы и обновления, улучшая SEO. WordPress по умолчанию с версии 5.5 имеет базовый sitemap, но он не всегда подходит под задачи, например, если нужны кастомные типы записей, таксономии или исключения.
Создавая собственный sitemap, мы можем гибко управлять содержимым, расширять структуру и оптимизировать индексирование.
Как создать sitemap.xml на лету с помощью пользовательской функции
Для реализации sitemap без плагина можно добавить функцию в functions.php вашей темы (желательно дочерней) или в отдельный небольшой плагин.
Основные шаги:
- Перехватить запрос на URL sitemap.xml
- Сформировать XML с нужными URL
- Вывести XML с правильными заголовками
Ниже пример простой функции, которая выводит sitemap с постами, страницами и кастомным типом записи product:
function wpqa_generate_sitemap() {
if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
return;
}
$request_uri = $_SERVER['REQUEST_URI'];
if ( strpos( $request_uri, '/sitemap.xml' ) === false ) {
return;
}
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' => array( 'post', 'page', 'product' ),
'post_status' => 'publish',
'numberposts' => -1
);
$posts = get_posts( $args );
foreach ( $posts as $post ) {
setup_postdata( $post );
echo '<url>';
echo '<loc>' . esc_url( get_permalink( $post->ID ) ) . '</loc>';
echo '<lastmod>' . get_the_modified_date( 'c', $post->ID ) . '</lastmod>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.8</priority>';
echo '</url>';
}
wp_reset_postdata();
echo '</urlset>';
exit;
}
add_action( 'init', 'wpqa_generate_sitemap' );Эта функция проверяет, если текущий запрос — /sitemap.xml, то генерирует XML с URL всех опубликованных записей, страниц и продуктов. Это простой и эффективный способ добавить sitemap без плагинов.
Как расширить sitemap: таксономии, фильтрация и пагинация
Часто нужно добавить в sitemap категории, теги, другие таксономии или кастомные типы записей. Для этого расширим функцию, добавив генерацию URL таксономий:
function wpqa_generate_sitemap_extended() {
if ( ! isset( $_SERVER['REQUEST_URI'] ) ) {
return;
}
$request_uri = $_SERVER['REQUEST_URI'];
if ( strpos( $request_uri, '/sitemap.xml' ) === false ) {
return;
}
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' );
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 );
echo '<url>';
echo '<loc>' . esc_url( get_permalink( $post->ID ) ) . '</loc>';
echo '<lastmod>' . get_the_modified_date( 'c', $post->ID ) . '</lastmod>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.8</priority>';
echo '</url>';
}
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 ) {
echo '<url>';
echo '<loc>' . esc_url( get_term_link( $term ) ) . '</loc>';
echo '<changefreq>weekly</changefreq>';
echo '<priority>0.6</priority>';
echo '</url>';
}
}
}
echo '</urlset>';
exit;
}
remove_action( 'init', 'wpqa_generate_sitemap' );
add_action( 'init', 'wpqa_generate_sitemap_extended' );Этот код добавляет в sitemap ссылки на категории, теги и категории товаров WooCommerce, если установлен плагин. Это расширяет охват сайта для поисковиков.
Фильтрация URL и исключения
Чтобы исключить из sitemap определённые страницы или категории, можно добавить фильтры внутри цикла, например:
if ( $post->ID == 123 ) continue; // пропускаем страницу с ID 123
if ( in_array( 'noindex', get_post_meta( $post->ID, '_wp_meta_robots', true ) ) ) continue; // пропускаем страницы с мета noindexТакой подход позволяет тонко настраивать содержимое sitemap.
Использование плагинов для автоматизации и удобства
Если хочется получить расширенный функционал автоматически и с минимальным кодом, можно использовать плагин Clearfy Pro. Он позволяет создавать и настраивать sitemap, управлять индексацией, исключать URL и оптимизировать SEO.
Для примера, Clearfy Pro автоматически генерирует sitemap.xml, поддерживает кастомные типы записей и таксономии, а также умеет исключать страницы по меткам noindex. Это удобно для тех, кто не хочет писать код, но хочет гибкий контроль.
Тестирование и проверка корректности sitemap
После добавления sitemap важно проверить его валидность. Можно использовать такие сервисы:
- Google Search Console — добавьте URL sitemap.xml и проверьте ошибки.
- Яндекс.Вебмастер — аналогично, для Яндекса.
- Онлайн-валидаторы XML — например, xml-sitemaps.com.
Обязательно убедитесь, что URL корректны, не содержат дубли и ошибки.
Выводы и рекомендации
Создать sitemap.xml без плагинов — реально и просто, если нужен базовый функционал. Для сложных сценариев удобнее использовать готовые решения, например, Clearfy Pro.
Главное — поддерживать sitemap в актуальном состоянии и учитывать особенности вашего сайта: кастомные типы записей, таксономии, частоту обновления. Тогда поисковые системы быстрее и точнее индексируют контент.