Тонкости Yoast SEO, Woocommerce и sitemap

Сразу скажу что этот рецепт справедлив для любого типа постов, Woocomerce приведен в качестве примера.
И так как всем любителям WordPress известно что для seo оптимизации и прочих целей лучше Yoast SEO плагина не найти, в том числе он хорош в создании динамического sitemap.xml.
Но думаю не многие этот самый sitemap открывали тем более смотрели на него своими глазами. Среди же тех кто видел есть люди желающие изменить его содержимое, в настройках плагина есть несколько вариантов кастомизации, но всегда хочется большего ситуацию усугубляет то что не все даже простые вещи можно настроить через админку.

Например для архивных типов записей в карту сайта добавляется по мимо ссылок на каждую запись еще и ссылка на страницу архива, этот факт и сподвиг меня на написание поста.
Мне понадобилось исключить ссылку на архивную страницу из sitemap, для этого я нашел соответствующий фильтр в коде Yoast SEO и дописал пару строк код:

add_filter('wpseo_sitemap_post_type_archive_link', function ($archive_url, $post_type) {

if ('product' == $post_type) {
return false;
}

return $archive_url;
}, 20, 2);

Теперь ссылка на на архив всех товаров (Woocommerce) в карту сайта не добавляется. Ключевое место сего кода if (‘product’ == $post_type) — значит если тип постов product то архивную страницу не выводить ( потому что ниже в теле условия return false; что как бы намекает что выводить ничего не надо ).

Если даже с таким описанием работа сниппета не понятно то примите мои соболезнования :)

Случайно в процессе написания нашел еще один любопытный фильтр — wpseo_sitemap_entry и поэтому сейчас покажу что можно получить с его помощью такого чего нельзя сделать через админку.

Исключаем из карты сайта все записи с четным ID

Не уверен в практической ценности, но вдруг кто-то давно хотел так сделать

add_filter('wpseo_sitemap_entry', function ($url, $type, $post) {
if (0 == $post->ID % 2 ) {
return false;
}
return $url;
}, 10, 3);

Исключаем из карты сайта записи с определенными ID

В карте сайта не будут выводиться записи указанные в массиве [10, 7, 6,5].

add_filter('wpseo_sitemap_entry', function ($url, $type, $post) {

if (in_array($post->ID, [10, 7, 6,5])) {
return false;
}

return $url;
}, 10, 3);

Исключаем из карты сайта записи c произвольным полем site_map_exclude значение котрого равно yes

add_filter('wpseo_sitemap_entry', function ($url, $type, $post) {

if ( 'yes' == get_post_meta( $post->ID, 'site_map_exclude', true)) {
return false;
}

return $url;
}, 10, 3);

Важно

Что бы все вышеописанное начало работать нужно сбросить кэш карты сайта, потому как ее вывод кешируется из понятный соображений.

Самый очевидный способ очистить кеш поменять количество водимых записей в настройках плагина

Например если изменить цифру со 100 скажем на 99 то произойдет очистка кэша и открыв карту сайта можно будет увидеть результат работы кода.
Если кэш не чистить то скорее всего откроется старая версия карты и будет казаться что вовсе ничего не произошло :(

И в окончание развязка рассказа. Казалось бы зачем исключать из sitemap что либо если это можно добавить в robots.txt и поисковики не будут это самое что либо (иными совами страницы) учитывать.

Казалось бы да но яндекс в своем сервисе для вебмастеров в таком случае просто завалит вас сообщениями что в карте сайта появились недоступные страницы, так происходит потому что поисковой робот обходя карту сайта все время будет попадать на страницы запрещенные к просмотру в robots.txt где он появляться по определению не должен такую противоречивую ситуацию правда можно считать ошибкой.

2 Комментариев

  1. Спасибо Вам, полезная статья. Ставлю сейчас его под замену другого премиум плагина, который давно перестал обновляться. В глубине души надеюсь, конечно, что за два года с написания статьи, банальных настроек в плагине поприбавилось, тем не менее фильтры взял на вооружение.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *