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

Опубликовано: 01.09.2018

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

Уведомления в IOS 12 // Что изменилось, настройка и группировка

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



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

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


Что делать если не приходят push уведомления из мессенджеров?

Уведомление (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...'); } }
rss