т.к. Мультисайт — это единая директория с сайтом, то возникает вопрос — как сделать robots.txt для поддоменов.
Multisite Robots.txt Manager
Решением является плагин Multisite Robots.txt Manager (300+), он правда не обновлялся более 2-х лет, но работает как надо. В консоли каждого поддомена появляется настройка в которую мы прописываем содержимое файла robots.txt, в т.ч. и для основного. При этом физически файла robots.txt в основной директории сайта быть не должно.
Также в настройках указывается путь к sitemap.
При недавнем обновлении WordPress 5.9 плагин стал выдавать головной robots.txt на всех подсайтах. Проблема решилась удалением файла robots.txt из корня сайта.
Multisite Robots.txt Manager пропал из репозитория. Вместо него можно использовать хороший плагин Virtual Robots.txt.
Создание robots.txt функцией
Универсальная функция для мультисети, с отдельным выводом для основного сайта:
// Генерация robots.txt для мультисети
add_filter('robots_txt', 'custom_robots_txt_for_multisite', 10, 2);
function custom_robots_txt_for_multisite($output, $public) {
if (!is_multisite()) {
return $output; // Если не multisite — вернуть стандарт
}
$site_id = get_current_blog_id();
$site_details = get_blog_details($site_id);
$domain = $site_details->domain;
// Общие правила
$output = "User-agent: *\n";
$output .= "Disallow: /cgi-bin\n";
$output .= "Disallow: /wp-admin\n";
$output .= "Disallow: /wp-includes\n";
$output .= "Disallow: /wp-content/plugins\n";
$output .= "Disallow: /wp-content/cache\n";
$output .= "Disallow: /wp-content/themes\n";
$output .= "Disallow: /trackback\n";
$output .= "Disallow: */trackback\n";
$output .= "Disallow: */*/trackback\n";
$output .= "Disallow: */*/feed/*/\n";
$output .= "Disallow: */feed\n";
$output .= "Disallow: /*?*\n";
$output .= "Disallow: /tag\n";
$output .= "Disallow: */embed*\n";
$output .= "Disallow: */wp-json*\n";
$output .= "Disallow: /slide/*\n";
$output .= "Disallow: /label/*\n";
$output .= "Disallow: /offers/*\n";
$output .= "Disallow: /type/*\n";
$output .= "Disallow: /author/*\n";
$output .= "Disallow: */page/*\n";
$output .= "Disallow: */attachment/*\n\n";
if ($site_id == 1) {
// Правила для главного сайта
$output .= "Disallow: *.jpg\n";
$output .= "Disallow: *.png\n\n";
$output .= "Host: https://$domain\n";
$output .= "Sitemap: https://$domain/sitemap_index.xml\n";
} else {
// Правила для всех остальных сайтов
$output .= "Host: https://$domain\n";
$output .= "Sitemap: https://$domain/sitemap_index.xml\n";
}
return $output;
}
Отключить формирование robots.txt Yoast SEO
Если на сайте используется плагин Yoast SEO то он будет формировать свои строки в robots.txt. Чтобы это полностью исключить нашёл вот такую функцию:
// Отключить генерацию robots.txt YOAST
function wpwc_fix_yoast_seo_robots_txt() {
global $wp_filter;
if ( isset( $wp_filter['robots_txt']->callbacks ) && is_array( $wp_filter['robots_txt']->callbacks ) ) {
foreach ( $wp_filter['robots_txt']->callbacks as $callback_priority => $callback ) {
foreach ( $callback as $function_key => $function ) {
if ( 'filter_robots' === $function['function'][1] ) {
unset( $wp_filter['robots_txt']->callbacks[ $callback_priority ][ $function_key ] );
}
}
}
}
}
add_action( 'wp_loaded', 'wpwc_fix_yoast_seo_robots_txt' );
[site-socialshare]

