Недавно я обнаружил забавный баг в популярном плагине Yoast SEO, который заключается в невозможности включить в sitemap ссылку на архив записей в случае, если сами записи запрещены к индексации.
Yoast признала ошибку 2 года назад, но до сих пор ничего не изменилось. Это достаточно странно тем, что WordPress уже давно используется не только как блог, и множество даже официальных тем создают собственные типы записей для чисто утилитарных целей, таких как хранение логотипов партнеров или преимуществ продукта. Такие типы записей обычно исключаются из индекса и не включаются в sitemap, но существует опция, позволяющая оставлять оставлять видимыми их архивы. Только она не работает 🙂
Ну да ладно, это же WordPress. С помощью небольшого сниппета можно исправить это недоразумение и получить нужную ссылку внутри page-sitemap.xml (сайтмап страниц сайта), с датой обновления равной дате изменения последней записи выбранного типа постов.
Просто добавьте следующий код в functions.php вашей темы или внутрь плагина, отвечающего за логику сайта:
add_filter( 'wpseo_sitemap_page_content', 'add_archive_URL' );
/**
* Adds an archive link into page-sitemap.xml (for selected post type)
*
* @see https://github.com/Yoast/wordpress-seo/issues/11391
* @return string
*/
function add_archive_URL() {
$post_type = 'partners';
$archive_url = get_post_type_archive_link( $post_type );
$args = [
'posts_per_page' => 1,
'post_type' => $post_type,
'orderby' => 'modified',
'order' => 'DESC',
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'fields' => 'ids',
'cache_results' => true
];
$latest = new WP_Query( $args );
while ( $latest->have_posts() ) {
$latest->the_post();
$date = get_post_modified_time( 'Y-m-d h:i:s', true );
$last_mod = YoastSEO()->helpers->date->format( $date );
}
$url = "\t<url>\n";
$url .= "\t\t<loc>$archive_url</loc>\n";
$url .= "\t\t<lastmod>$last_mod</lastmod>\n";
$url .= "\t</url>\n";
return $url;
}
Спасибо Михаилу за подсказку нужного хука и GermanWiki за правки по коду . Официальный сайт Yoast SEO не очень-то помогает в этом вопросе.
не работает