WordPress как на ладони
Новые WordPress шаблоны Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

Как работают уведомления (пинги, трэкбэки) в WordPress

Тема в общем-то не особо нужная, но так, для общего кругозора будет полезно знать детали того, как устроены и как работают пинги и уведомления в WordPress.

Пинги (ping или pingback) и Уведомления (trackback) — это две стороны одной монеты:

  • Пинг (ping) — это когда ваш сайт уведомляет другой сайт о том, что на вашем сайте опубликована статья, где есть ссылка на другой сайт. При таком уведомлении ваш сайт отправляет пинг, а другой сайт получает уведомление (трекбек).

  • Уведомление (trackback) — это тоже самое, но наоборот: когда ваш сайт получает уведомление, отправленное (отпингованное) другим сайтом, о том что на другом сайте в статье есть ссылка на ваш сайт.

В WP обе эти «штуки» настраиваются отдельно на странице настроек «Обсуждение»:

Как работают пинги/уведомления

Тут два возможных сценария:

1) Отправка пинг запроса с вашего сайта

При публикации поста ВП проверят надо ли уведомлять упомянутые в посте сайты. Т.е. он смотрит включена ли опция default_pingback_flag. Если включена, то собирает ссылки из поста и по каждой проделывает следующие операции:

  • Проходит по ссылке, и проверяет наличие x-pingback: в HTTP заголовке. Если он там есть, то отправляет на УРЛ, указанный в этом заголовке, уведомление. Уведомление тут - это HTTP запрос с POST параметрами на указанный URL.

    Для ВП такой URL смотрит на файл xmlrpc.php. Там работает огромный класс wp_xmlrpc_server{}. В классе разделяются запросы для которых нужна авторизация и не нужна. Для такого пинг уведомления авторизация не нужна. Поэтому, если например, выключить xmlrpc через фильтр:

    // отключает XML-RPC методы которые требуют авторизацию
    add_filter( 'xmlrpc_enabled', '__return_false' );

    То уведомления (трекбеки) все равно будут работать!

  • Если x-pingback: не найден, то ВП ищет дальше: получает HTML контент и ищет там метатег rel="pingback". Если нашел - делает все тоже самое: отправляет уведомление по указанному в метатеге URL.

    Замечу, что из коробки ВП не добавляет этот метатег в HEAD темы, обычно он добавляется самой темой. Т.е. его нужно прописать вручную, если надо. Выглядит он так:

    <link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>">
меню

2) Получение пинг запроса вашим сайтом от другого сайта

Уведомления приходят в файл /xmlrpc.php - он их и обрабатывает:

  • Сначала проверяет опцию default_ping_status — разрешено ли на сайте вообще получать уведомления.

  • А затем находит упомянутый пост и проверяет открыты ли для него уведомления. Делается это функцией get_default_comment_status(), в частности, проверяется значение поля ping_status у записи, которое может быть со значением open или closed.

  • Если уведомления открыты, то к указанной записи публикуется комментарий с типом comment_type = 'pingback'.

В настройках сайта (картинка выше), мы можем отключить отдельно отправку уведомлений со своего сайта, или получение уведомлений с других сайтов, или и то и другое.

меню

Для чего еще нужен файл xmlrpc.php

Файл xmlrpc.php позволяет управлять блогом удаленно. Не знаю, пользуется ли этим кто-то сегодня. Но вообще есть такие программы: «Windows Live Writer», «Open Live Writer» и другие, с помощью которых можно публиковать посты и загружать фотки на сайт удаленно. Например, с компьютера можно публиковать посты на разные сайты (если вы знаете логин и пароль, разумеется). Все это благодаря файлу xmlrpc.php.

Спам через уведомления (пинги)

Так как для отправки уведомлений нужно всего лишь отправить запрос, спамеры любят это дело. Делается это очень просто: берем домен сайта, дописываем к нему /xmlrpc.php и отправляем заготовленный POST запрос. Причем запрос будет одинаковый для всех сайтов, поэтому спамить таким образом очень просто.

Так, если у вас на сайте в комментариях выводятся уведомления со ссылкой на сайт того, кто отправил это уведомление - спамер получит обратную ссылку на свой сайт. По этой причине многие отключают уведомления.

Однако такое отключение просто не обрабатывает запросы. Но если спамеры начнут отправлять множество запросов, то это может влиять на сервер (создавать лишнюю нагрузку), получится что-то типа непреднамеренной дос атаки. Впрочем, такое, насколько я знаю, редкость.

В случае такой нагрузки от спамеров, можно полностью закрыть доступ к файлу /xmlrpc.php через файл .htaccess.

# Закрываем доступ к файлу
<FilesMatch "xmlrpc.php">
Order Deny,Allow
Deny from all
</FilesMatch>

Для nginx это делается так:

location = /xmlrpc.php {
	deny all;
}

Такое закрытие полностью «вырубает» все возможности уведомлений, тут уже можно больше ничего не делать.

Обращаю внимание еще раз. Вот такое отключение xmlrpc не отключает обработку уведомлений, а отключает возможность удаленно управлять сайтом!

// отключает XML-RPC методы которые требуют авторизацию
add_filter( 'xmlrpc_enabled', '__return_false' );
меню

Уведомления для типов записей

Для постоянных страниц (записей типа page) обработка уведомлений от других сайтов отключена жестко в коде.

Для других типов записей, уведомления можно включит или отключить отдельно на старнице редактирования записи:

При регистрации типа записи в параметре supports функции register_post_type(), нужно указать поддержку трэкбеков:

'supports' => array('title', 'editor', 'trackbacks'),

Иначе ping_status у новых записей по умолчанию будет closed и уведомление со ссылкой на эту запись этого типа не будет обрабатываться.

меню

Стоит ли отключать пинги в WordPress

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

Однако, обязательно нужно проверять есть ли обратная ссылка на ваш сайт в статье, которая упомянута в уведомлении. WordPress этого не делает по умолчанию, а зря!

Чтобы включить такую проверку можете установить мой плагин антиспама Kama Spamblock

Ну, или использовать такой код в файле functions.php:

## проверка ссылки на этот сайт при обработке трекбэков (пингов)
add_action( 'preprocess_comment', 'trackbacks_check_protect', 0 );
function trackbacks_check_protect( $commentdata ){

	if( in_array( $commentdata['comment_type'], array('trackback','pingback') ) ){
		$external_html = wp_remote_retrieve_body( wp_remote_get( $commentdata['comment_author_url'] ) );

		// стоп, если нет ссылки на нас
		if( ! preg_match('~<a[^>]+href=[\'"](https?:)?//'. preg_quote( parse_url( home_url(), PHP_URL_HOST ) ) .'~si', $external_html) )
			die('no backlink...');
	}
}
меню

Как работает код уведомлений

Пинги со статьи вашего сайта отправляются кроном, схема такая:

1 шаг

На хук publish_post, зацеплена функция _publish_post_hook().

add_action( 'publish_post', '_publish_post_hook', 5, 1 );

Таким образом, при публикации/обновлении опубликованного поста, срабатывает функция _publish_post_hook(), которая добавляет специальные метаполя и Крон задачу:

...
	if ( get_option('default_pingback_flag') )
		add_post_meta( $post_id, '_pingme', '1' );
	add_post_meta( $post_id, '_encloseme', '1' );

	if ( ! wp_next_scheduled( 'do_pings' ) ) {
		wp_schedule_single_event( time(), 'do_pings' );
	}
...
2 шаг

Далее при выполнении крон-задачи срабатывает функция do_all_pings()

add_action( 'do_pings', 'do_all_pings', 10, 1 );

Что делает do_all_pings():

  1. Cобирает все посты с установленными метаполями и запускает для каждого из них функцию:

  2. Также собирает все опубликованные посты (status=publish), у которых поле to_ping != '' (там обычно находятся ссылки из контента, которые нужно уведомить что они использовались в посте) и для каждого поста запускает функцию:

  3. Отправляет пинги на сайты, которые нужно пинговать (указанные в настройках). За эту операцию отвечает функция generic_ping().

3 коммента
  • newbie32 cайт: yumchief.com

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

    Это можно узнать через яндекс.вебмастер/гугл консоль или сторонние сервисы, например серп стат

    • @ campusboy3060 cайт: www.youtube.com/c/wpplus

      Они это покажут, если ссылка будет проиндексирована. А при работе с пингбеками, то уведомление придёт даже если сайт, который отправил уведомление, закрыт паролем.

    • Kama7019

      Пинги в данном случае - еще один вариант узнать, что на тебя ссылаются. Впрочем можно закрыть.

Здравствуйте, !     Войти . Зарегистрироваться