Создание sitemap — важный этап для SEO-оптимизации любого сайта на WordPress. Однако стандартные плагины зачастую генерируют простые карты сайта без возможности гибкой фильтрации по типам записей, категориям или пользовательским таксономиям. В этой статье мы подробно разберём, как создать собственный автоматический sitemap с поддержкой фильтров, чтобы улучшить индексацию и управление вашим контентом.
Почему важен кастомный sitemap с фильтрами
Стандартный sitemap генерируют плагины вроде Yoast SEO или Google XML Sitemaps. Они подходят для типовых сайтов, но если у вас сложная структура, кастомные типы записей или вы хотите исключить из sitemap определённые страницы, нужна кастомизация.
Фильтрация sitemap помогает:
- Избегать индексации неактуального или служебного контента.
- Улучшить SEO-фокус на важных разделах сайта.
- Ускорить сканирование сайта поисковиками.
Такой подход особенно актуален для сайтов с большим количеством пользовательских типов записей и таксономий.
Создание кастомного sitemap в WordPress: основные шаги
Для начала создадим отдельный endpoint, который будет отдавать sitemap в формате XML. Используем для этого Rewrite API и хуки WordPress.
Добавляем rewrite правило и endpoint
function wproot_add_sitemap_endpoint() {
add_rewrite_rule('^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top');
}
add_action('init', 'wproot_add_sitemap_endpoint');
function wproot_add_query_var($vars) {
$vars[] = 'custom_sitemap';
return $vars;
}
add_filter('query_vars', 'wproot_add_query_var');
Этот код создаёт URL https://вашсайт.ru/custom-sitemap.xml, который мы будем использовать для вывода sitemap.
Обработка запроса и генерация XML
Далее, добавим обработчик запроса, который формирует XML с фильтрами:
function wproot_render_custom_sitemap() {
global $wp_query;
if (intval(get_query_var('custom_sitemap')) !== 1) {
return;
}
header('Content-Type: application/xml; charset=utf-8');
$args = array(
'post_type' => array('post', 'page', 'product'), // например, фильтруем по типам
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('exclude-category'), // исключаем категорию
'operator' => 'NOT IN'
)
)
);
$query = new WP_Query($args);
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$url = get_permalink();
$lastmod = get_the_modified_date('c');
echo '<url>';
echo '<loc>' . esc_url($url) . '</loc>';
echo '<lastmod>' . esc_html($lastmod) . '</lastmod>';
echo '</url>';
}
}
echo '</urlset>';
exit;
}
add_action('template_redirect', 'wproot_render_custom_sitemap');
В этом примере мы фильтруем записи по типам post, page и product (например, для WooCommerce), а также исключаем из sitemap записи, относящиеся к категории exclude-category.
Добавление поддержки пользовательских фильтров через URL-параметры
Чтобы сделать sitemap ещё гибче, добавим возможность передавать фильтры через GET-параметры. Например, фильтрация по категории или дате.
Обработка дополнительных параметров
function wproot_render_custom_sitemap() {
global $wp_query;
if (intval(get_query_var('custom_sitemap')) !== 1) {
return;
}
header('Content-Type: application/xml; charset=utf-8');
$post_types = isset($_GET['post_type']) ? explode(',', sanitize_text_field($_GET['post_type'])) : array('post', 'page');
$exclude_category = isset($_GET['exclude_cat']) ? sanitize_text_field($_GET['exclude_cat']) : '';
$date_after = isset($_GET['date_after']) ? sanitize_text_field($_GET['date_after']) : '';
$tax_query = array();
if ($exclude_category) {
$tax_query[] = array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array($exclude_category),
'operator' => 'NOT IN'
);
}
$meta_query = array();
if ($date_after && preg_match('/^\d{4}-\d{2}-\d{2}$/', $date_after)) {
$meta_query[] = array(
'key' => 'post_date',
'value' => $date_after,
'compare' => '>=',
'type' => 'DATE'
);
}
$args = array(
'post_type' => $post_types,
'post_status' => 'publish',
'posts_per_page' => -1,
'tax_query' => $tax_query,
);
if (!empty($meta_query)) {
$args['meta_query'] = $meta_query;
}
$query = new WP_Query($args);
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$url = get_permalink();
$lastmod = get_the_modified_date('c');
echo '<url>';
echo '<loc>' . esc_url($url) . '</loc>';
echo '<lastmod>' . esc_html($lastmod) . '</lastmod>';
echo '</url>';
}
}
echo '</urlset>';
exit;
}
add_action('template_redirect', 'wproot_render_custom_sitemap');
Теперь можно запрашивать sitemap с такими параметрами:
?post_type=post,product&exclude_cat=news— sitemap только для постов и товаров, исключая категорию news.?date_after=2023-01-01— только записи после 1 января 2023 года.
Использование плагинов для расширения функционала sitemap
Если вы не хотите писать код с нуля, можно использовать плагины с расширенными возможностями генерации sitemap. Среди них:
- Clearfy Pro — позволяет гибко настраивать sitemap, исключать типы записей, категории и пользовательские таксономии. Подробнее на официальном сайте.
- WPGPT — может использоваться для генерации sitemap с помощью искусственного интеллекта, анализируя структуру сайта и предлагая оптимальные настройки.
Плагин Clearfy Pro отлично подходит для тех, кто хочет получить расширенные возможности без написания кода. Он поддерживает кастомные фильтры и интегрируется с большинством SEO-плагинов.
Рекомендации по оптимизации и отладке sitemap
Создавая собственный sitemap, важно:
- Проверять корректность XML через валидаторы.
- Учитывать нагрузку на сервер при больших сайтах — используйте пагинацию или кеширование.
- Регулярно обновлять sitemap, чтобы поисковики видели актуальную структуру.
- Тестировать работу фильтров с разными параметрами, чтобы избежать ошибок и пустых выдач.
Для кеширования можно использовать Transients API WordPress или плагин Clearfy Pro, который имеет встроенный кеш и оптимизацию.
Вывод
Создание автоматического sitemap с поддержкой фильтров — мощный инструмент для тонкой настройки индексации сайта на WordPress. Благодаря простому коду и возможности расширения через GET-параметры вы получаете гибкий механизм, который можно адаптировать под любые задачи.
Если вы предпочитаете готовые решения, обратите внимание на Clearfy Pro, который позволит быстро настроить sitemap под ваши нужды без дополнительных усилий.