Программное расширение 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, я нашел интересный хук-событие YoastWPSEOregister_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 YoastWPSEOHelpersRobots_Txt_Helper;

/**
 * Динамически расширяет robots.txt,
 * сгенерированный плагином Yoast SEO.
 */
class RobotsTxt {
	/**
	 * Инициализация хуков.
	 *
	 * @return void
	 */
	public static function setup_hooks(): void {
		add_action( 'YoastWPSEOregister_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

Источник: https://www.kobzarev.com/technical-seo/robots-txt-yoast-seo/

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

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

Добавить комментарий

%d такие блоггеры, как: