Удалить мета-тег robots из wp_head
Мне нужно удалить только эту строку <meta name=robots content="noindex,follow"/>
из wp_head
, но не могу найти правильный хук для использования с remove_action()
.
<meta name=robots content="noindex,follow"/>
В основном, я хочу удалить только эту строку из заголовка, но только для страницы поиска. В этом случае я бы использовал что-то подобное:
if ( is_search() ) { remove_action('wp_head', 'whatever-the-action-name-is'); }
add_filter('wpseo_robots', 'yoast_no_home_noindex', 999);
function yoast_no_home_noindex($string= "") {
if (is_home() || is_front_page()) {
$string= "index,follow";
}
return $string;
}
Должно сработать... Добавьте этот код в файл functions.php вашей темы, и всё будет работать как надо.

Это решение не совсем точно соответствует заданному вопросу, но оно наиболее близкое. Оно позволяет изменять robots-директиву Yoast без взлома плагина. В моем случае мне нужно было применить это к кастомному шаблону, и я смог сделать это следующим образом:
add_filter('wpseo_robots', 'confPageNoIndex', 999);
function confPageNoIndex($string= "") {
if (is_page_template( 'page-confirmation.php') ) {
$string= "no-index,no-follow";
}
return $string;
}
Это можно модифицировать для страницы поиска. Однако плагин Yoast УЖЕ не индексирует страницу поиска.

Спасибо! Это единственное решение, которое сработало! Модифицированный сниппет:
add_filter('wpseo_robots', 'yoast_no_home_noindex', 999);
function yoast_no_home_noindex($string= "") {
if( is_paged() ) {
$string= "";
}
else {
$Path = strtok($_SERVER["REQUEST_URI"],'?');
$URI="https://" . $_SERVER['HTTP_HOST'] .$Path;
echo "<link rel=\"canonical\" href=\"" . $URI . "\">\n";
}
return $string;
}
Этот код определяет, является ли текущий URL страницей с пагинацией, и удаляет тег robots. Если это не так, вместо него будет выводиться канонический тег.

Судя по вашим комментариям к другому моему ответу, где вы явно выражаете желание оставить включенной опцию "Запретить индексацию сайта поисковыми системами", после более тщательного изучения исходного кода WordPress (в частности default-filters.php), я думаю, что, вероятно, вы искали именно это:
add_action( 'posts_selection', 'indexSearchPage' );
function indexSearchPage() {
// Обязательно укажите приоритет для действия, иначе оно не будет удалено
if( is_search() )
remove_action( 'wp_head', 'noindex', 1 );
}
Я использую хук posts_selection
, так как это первый хук в процедуре загрузки WordPress, который имеет доступ к условным тегам. Вы можете использовать более поздние действия вплоть до wp_head
, но если вы используете сам wp_head
, вам нужно добавить действие с приоритетом меньше 1
, поскольку noindex
добавляется с приоритетом 1
:
add_action( 'wp_head', 'indexSearchPage', -1 );
Альтернативно, можно условно обмануть WordPress, заставив его думать, что опция "Запретить индексацию сайта поисковыми системами" отключена:
add_action( 'posts_selection', 'indexSearchPage' );
function indexSearchPage() {
if( is_search() ) {
$alloptions = wp_load_alloptions();
$alloptions[ 'blog_public' ] = '1';
wp_cache_set( 'alloptions', $alloptions, 'options' );
wp_cache_set( 'blog_public', '1', 'options' );
}
}

Я понял, вывод контролируется плагином WordPress SEO, так как он активирован на сайте, поэтому мне пришлось немного поковыряться в файле плагина class-frontend.php.
Конечно, мне не очень нравится такое грязное решение, но пока оно работает, выводя этот метатег на странице поиска, как я и хотел.
В файле плагина class-frontend.php мне пришлось заменить строку 552 на это:
if ( is_search() ) { $robots['follow'] = 'nofollow'; } else { $robots['follow'] = 'follow'; }

ПРИМЕЧАНИЕ: В текущей версии WordPress SEO этот ответ больше не действителен - измененные строки в плагине больше не существуют. Посетители этого вопроса могут обнаружить, что мой второй ответ предлагает решения, которые не требуют взлома плагина. Если вы не используете WordPress SEO или хотите убрать индексацию поисковыми системами со всех страниц, лучшее решение для поставленного вопроса - включить опцию "Запретить поисковым системам индексировать этот сайт".

Я бы рекомендовал просто снять галочку с пункта "Запретить поисковым системам индексировать этот сайт" в разделе Настройки > Чтение
в админ-панели (это должно убрать мета-теги для роботов со всех страниц сайта), а затем вручную добавить мета-тег обратно в шапку вашей темы с помощью условных выражений, например так:
if( ! is_search() )
echo( '<meta name="robots" content="noindex,nofollow" />' );
Возможно, вам придется изменить условия для достижения желаемого эффекта, но, думаю, основная идея понятна.
Если вы не хотите изменять свою тему, можно подключить этот код через хук wp_head
:
add_action( 'wp_head', 'noRobots' );
function noRobots() {
if( ! is_search() )
echo( '<meta name="robots" content="noindex,nofollow" />' );
}

Да, я знаю, что это можно сделать таким образом, но я бы не хотел отключать все метатеги сразу для одной страницы. Сайт использует плагин Yoast SEO, который дает мне полный контроль и настройку SEO для всех остальных страниц, кроме этой страницы поиска. Фактически, имея это, я хочу удалить метатеги, созданные wp_head, а затем вывести те же самые, но с атрибутом nofollow вместо follow. Что-то вроде str_replace('<meta name=robots content="noindex,follow"/>', '<meta name=robots content="noindex,nofollow"/>', wp_head());

Извините - я не понимаю, чего вы пытаетесь достичь. Решение, которое я предложил, оставит тег на всех страницах, кроме страницы результатов поиска, так же, как и предложенный код в конце вашего вопроса. Я также не знаком с плагином Yoast SEO, поэтому, боюсь, не смогу быть полезным.

Пожалуйста, объясните, что вы имеете в виду под фразой "я бы не хотел отключать все метатеги сразу для одной страницы"

Если я отмечу "Запретить поисковым системам индексировать этот сайт", мне придется вручную выводить мета-тег для всех типов страниц, записей, тегов. Плагин Yoast SEO предоставляет множество опций для этих страниц, и я не хочу терять их. Мне нужно просто настроить вывод этого SEO мета-тега на странице результатов поиска, только его одного.

Пожалуйста, объясните этот ответ и почему вы считаете, что он должен решить проблему.

@Yarr вы, вероятно, имели в виду if ( is_search() ) { remove_action( 'wp_head', 'do_robots');
}
в любом случае я попробовал это, но тег <meta name=robots content="noindex,follow"/>
не удаляется

Функция do_robots() просто отображает файл robots.txt - она не имеет отношения к мета-тегам.
