WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

do_robots() WP 2.1

Выводит на экран контент файла robots.txt. Устанавливает HTTP заголовок файла. Создает динамический файл robots.txt.

В WP эта функция зацеплена на одноименный хук do_robots, который срабатывает в файле template-loader.php для URL /robots.txt:

// Process feeds and trackbacks even if not using themes.
if ( is_robots() ) :
	/**
	 * Fired when the template loader determines a robots.txt request.
	 *
	 * @since 2.1.0
	 */
	do_action( 'do_robots' );
	return;
elseif ( is_feed() ) :
	...

Изменить результат этой функции (код файла) можно через хуки:

  • do_robotstxt — событие срабатывает в начале функции. На этом хуке можно вывести какой либо текст и он будет выведен в файле robots.txt перед базовым кодом файла.
  • robots_txt — фильтр срабатывает в конце и фильтрует код (текст) файла robots.txt.

О файле robots.txt и правилах его создания, вы можете почитать в этой моей статье.

Функция устанавливает HTTP заголовок, поэтому использование её внутри HTML файла приведет к ошибке.

Создавать файл robots.txt лучше с помощью этой функции, а не путем прямого создания этого файла в корне сайта. Это даст возможность плагинам изменять ваш robots.txt.

Хуки из функции
Возвращает

Ничего (null).

Использование

do_robots();

Примеры

#1. Создадим динамический robots.txt

Через файл темы functions.php. В этом случае создавать файл robots.txt физически не нужно. Добавим такой код в начало файла:

add_action( 'do_robotstxt', 'my_robotstxt' );
function my_robotstxt(){

	$lines = [
		'User-agent: *',
		'Disallow: /wp-admin/',
		'Disallow: /wp-includes/',
		'',
	];

	echo implode( "\r\n", $lines );

	die; // обрываем работу PHP
}

Теперь, пройдя по ссылке http://example.com/robots.txt мы получим такой текст:

User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/

#2. Внедримся в robots.txt и изменим его через фильтр robots_txt

Добавим правило "Disallow: */comments":

add_filter( 'robots_txt', 'add_robotstxt' );
function add_robotstxt($text){
	$text .= "Disallow: */comments";
	return $text;
}

Пройдя по ссылке http://example.com/robots.txt получим примерно такой текст:

User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: */comments

Список изменений

С версии 2.1.0 Введена.

Код do robots: wp-includes/functions.php WP 5.2.3

<?php
function do_robots() {
	header( 'Content-Type: text/plain; charset=utf-8' );

	/**
	 * Fires when displaying the robots.txt file.
	 *
	 * @since 2.1.0
	 */
	do_action( 'do_robotstxt' );

	$output = "User-agent: *\n";
	$public = get_option( 'blog_public' );
	if ( '0' == $public ) {
		$output .= "Disallow: /\n";
	} else {
		$site_url = parse_url( site_url() );
		$path     = ( ! empty( $site_url['path'] ) ) ? $site_url['path'] : '';
		$output  .= "Disallow: $path/wp-admin/\n";
		$output  .= "Allow: $path/wp-admin/admin-ajax.php\n";
	}

	/**
	 * Filters the robots.txt output.
	 *
	 * @since 3.0.0
	 *
	 * @param string $output Robots.txt output.
	 * @param bool   $public Whether the site is considered "public".
	 */
	echo apply_filters( 'robots_txt', $output, $public );
}

Cвязанные функции

Из раздела: Без рубрики

8 комментов
  • @ Александр

    как отключить программную генерацию роботса, чтобы можно было работать с текстовым файлом в корне?

    Ответить5.5 лет назад #
    • Kama7602

      Создайте файл в корне и все.

      Ответить5.5 лет назад #
      • @ Александр

        он создан, но выводится две строки по умолчанию, а не то, что я в нем писал(
        вероятно, программную генерацию можно отключить с помощью remove_action например, но я в этом не разбираюсь((

        Ответить5.5 лет назад #
        • Kama7602

          Может у вас какой-то SEO плагин стоит, попробуйте отключить соответствующие плагины. По умолчанию так быть не должно. Если плагин вызывает функцию, то надо в нем смотреть, как её выключить.

          Ответить5.5 лет назад #
  • Петр

    Здравствуйте, Кама! Пытаюсь настроить robots.txt с помощью этой функции. Чтобы скрыть от индексации папку includes, я добавляю такой код:

    add_filter('robots_txt', 'add_robotstxt');
    function add_robotstxt($text){
    	$text .= "Disallow: /wp-includes";
    	return $text;
    }

    Корректно ли такое написание? И как можно добавить директивы именно для робота яндекс, чтобы указать главное зеркало?
    User-agent: Yandex
    Host: site.ru

    Ответить4.3 года назад #
    • Kama7602

      Если это ваш сайт, расположите лучше файл robots.txt в корне сайта. Подробнее здесь. yes

      Ответить4.3 года назад #
      • Oleg

        А как быть, если тема дочерняя, то файл robots.txt в корневой директории не помогает и вылетает виртуальный, даже, если он в основном или дочернем шаблоне.

        Ответить1.7 года назад #
Здравствуйте, !     Войти . Зарегистрироваться