Сразу скажу что этот рецепт справедлив для любого типа постов, 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 где он появляться по определению не должен такую противоречивую ситуацию правда можно считать ошибкой.
Источник: https://alkoweb.ru/tonkosti-yoast-seo-woocommerce-i-sitemap/