Программное расширение robots.txt, созданного в Yoast SEO
В новых версиях плагина Yoast SEO присутствует неприятная ошибка, которая делает виртуальный robots.txt невалидным.
Проблема
Плагин добавляет туда свой пустой блок, начинающийся с User-agent: *
:
# START YOAST BLOCK
# ---------------------------
User-agent: *
Disallow:
Sitemap: http://yandex-gpt.com/sitemap_index.xml
# ---------------------------
# END YOAST BLOCK
Теперь, если мы программно, через фильтр robots_txt
, добавим в этот файл свои правила:
add_filter(
'robots_txt',
function( string $rules ): string {
return $rules . PHP_EOL . implode(
PHP_EOL,
[
'User-agent: *',
'Disallow: /cgi-bin',
]
);
}
);
На выходе, при запросе файла robots.txt правило User-agent: *
задублируется и файл станет невалидным и игра с приоритетами хуков тут не поможет.
Решение
Покопавшись в кишках плагина через Xdebug, я нашел интересный хук-событие Yoast\WP\SEO\register_robots_rules
, через который можно добавить свои правила вовнутрь блок правил самого Yoast SEO, через методы add_disallow()
, add_allow()
, add_sitemap()
, в его API.
Я подготовил простой пример для демонстрации того, как работать с этим хуком. Я просто создал файл /wp-content/mu-plugins/RobosTxt.php со следующим содержимым:
<?php
/**
* Class RobotsTxt.
*
* @author Mikhail Kobzarev <mikhail@kobzarev.com>
*/
use Yoast\WP\SEO\Helpers\Robots_Txt_Helper;
/**
* Динамически расширяет robots.txt,
* сгенерированный плагином Yoast SEO.
*/
class RobotsTxt {
/**
* Инициализация хуков.
*
* @return void
*/
public static function setup_hooks(): void {
add_action( 'Yoast\WP\SEO\register_robots_rules', [ __CLASS__, 'add_rules' ] );
}
/**
* Добавляет новые правила в файл.
*
* @param Robots_Txt_Helper $robots_txt_helper Эксзепляр класса Robots_Txt_Helper.
*
* @return void
*/
public static function add_rules( Robots_Txt_Helper $robots_txt_helper ): void {
foreach ( self::get_disallow() as $path ) {
$robots_txt_helper->add_disallow( '*', $path );
}
foreach ( self::get_allow() as $path ) {
$robots_txt_helper->add_allow( '*', $path );
}
}
/**
* Получает массив правил для дериктивы Disallow.
*
* @return string[]
*/
private static function get_disallow(): array {
return [
'/cgi-bin',
'/?',
'/wp-json/',
'/?rest_route=',
'/wp-',
'*?s=',
'*&s=',
'/search',
'/author/',
'*?attachment_id=',
'*/feed',
'*/rss',
'*/embed',
'*/page/',
'/xmlrpc.php',
'*/comment',
'*/comments',
'/trackback/',
'*/trackback',
];
}
/**
* Получает массив правил для дериктивы Allow.
*
* @return string[]
*/
private static function get_allow(): array {
return [
'*/uploads',
'/?amp',
'/feed/mihdan-yandex-turbo-feed/',
'/feed/mihdan-mailru-pulse-feed/',
'/*/*.js',
'/*/*.css',
'/wp-*.png',
'/wp-*.jpg',
'/wp-*.jpeg',
'/wp-*.gif',
'/wp-*.webp',
'/wp-*.webm',
'/wp-*.svg',
'/wp-*.ttf',
'/wp-*.woff',
'/wp-*.woff2',
];
}
}
RobotsTxt::setup_hooks();
Результат можно увидеть вживую на информационном сайте, посвящённому генеративной нейросети YandexGPT, сам файл robots.txt.