Верх страницы
Обложка к записи Программное расширение robots.txt, созданного в Yoast SEO
Время для прочтения: 1 мин. 27 сек.

Программное расширение 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.

RTFM

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, Opencart, DLE, Laravel, Moonshine, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Предыдущая запись

Давайте дружить
в Телеграме

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы