Сразу скажу что этот рецепт справедлив для любого типа постов, 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 где он появляться по определению не должен такую противоречивую ситуацию правда можно считать ошибкой.
Спасибо Вам, полезная статья. Ставлю сейчас его под замену другого премиум плагина, который давно перестал обновляться. В глубине души надеюсь, конечно, что за два года с написания статьи, банальных настроек в плагине поприбавилось, тем не менее фильтры взял на вооружение.
В yoast seo наоборот сделали меньше настроек в последнее время