Как работают уведомления в WordPress: пинги, трекбеки, файл xmlrpc.php

Как работают уведомления в WordPress (пинги, трекбеки) – файл xmlrpc.php

В этой статье мы поговорим о пингах (трекбеках, пингбэках) в WordPress, как они устроены, чем отличаются и как эффективно ими пользоваться.

Трекбеки и пингбэки — это способы связи между сайтами на WordPress. Они существуют с первых дней WordPress, но мало кто из пользователей осведомлён об этих функциях.

Содержание:

  • Что такое трекбеки и пингбэки?
  • Чем отличаются трекбеки и пингбэки?
  • Как настроить трекбеки и пингбэки?
  • Как работают уведомления (пинги)
    • 1) Ваш сайт отправляет пинг-запрос на другой сайт
      • Пингбэк
      • Трекбек
    • 2) Ваш сайт получает пинг-запрос от другого сайта
      • Пингбэк
      • Трекбек
  • Цель файла xmlrpc.php
  • Спам через уведомления (пинги)
  • Уведомления для типов записей
  • Нужно ли отключать пинги в WordPress?
  • Как это работает (по шагам в коде)
  • Как отключить запросы XML-RPC

Что такое трекбеки и пингбэки?

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

Пингбэк

Автоматическое уведомление. Не отправляет содержимое.

Когда вы публикуете пост, ваш сайт автоматически уведомляет "другой сайт", что контент поста содержит ссылку на "другой сайт". При этом ваш сайт отправляет пинг, а другой сайт получает его в виде комментария с типом comment_type = pingback.

Трекбек

Ручное уведомление. Отправляет фрагмент из содержимого поста.

Для этого уведомления вам нужно вручную указать URL статьи, на которую вы хотите отправить уведомление. Другой сайт получит это уведомление в виде комментария с типом comment_type = trackback.

Чтобы отправить трекбек, вы можете сделать это со страницы редактирования поста.

Пример трекбека

Чем отличаются трекбеки и пингбэки?

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

  1. Трекбеки отправляются вручную, в то время как пингбэки отправляются автоматически.
  2. Пингбэки не отправляют содержимое, тогда как трекбеки сопровождаются фрагментом содержимого.
  3. Для отправки и получения запросов используются разные технологии.

Как настроить трекбеки и пингбэки?

В WordPress вы можете включить или отключить получение и отправку уведомлений на странице Настройки → Обсуждение.

Настройки обсуждений

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

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

1) Ваш сайт отправляет пинг-запрос на другой сайт

Пингбэк

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

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

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

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

    Трекбеки всё равно будут работать!

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

    По умолчанию WordPress не добавляет этот метатег в HEAD темы, обычно его добавляет сама тема. При необходимости его нужно добавить вручную. Это будет выглядеть так:

Трекбек

При публикации или обновлении поста проверяется поле trackback_url:

Настройки трекбеков

Если указано, оно будет добавлено в поле to_ping таблицы wp_posts, которая хранит ссылки на сайты, которые должны быть уведомлены. Операция уведомления будет выполнена позже через cron.

2) Ваш сайт получает пинг-запрос от другого сайта

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

Пингбэк

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

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

  • Затем находится упомянутая запись и проверяется, открыты ли уведомления для неё. Это делается с помощью функции get_default_comment_status(), которая конкретно проверяет значение поля ping_status записи. Оно может быть: open или closed.

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

Трекбек

Файл /wp-trackback.php обрабатывает трекбеки.

Комментарий трекбека имеет тип comment_type = 'trackback'.

Цель файла xmlrpc.php

Файл xmlrpc.php позволяет удалённо управлять сайтом. Я не знаю, использует ли кто-то это сегодня.

Для такого управления существуют специальные программы, например, "Windows Live Writer", "Open Live Writer" и другие. С их помощью вы можете удалённо публиковать посты и загружать фотографии на сайт.

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

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

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

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

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

# Закрыть доступ к файлу

Order Deny,Allow
Deny from all

Для 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 для новых постов по умолчанию будет закрыт, и уведомления с ссылкой на этот тип поста не будут обрабатываться.

Нужно ли отключать пинги в 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'], [ 'trackback', 'pingback' ] ) ){
      return;
   }

   $external_html = wp_remote_retrieve_body( wp_remote_get( $commentdata['comment_author_url'] ) );

   // Остановить, если нет ссылки на нас
   if( ! preg_match('~]+href=['"](https?:)?//'. preg_quote( parse_url( home_url(), PHP_URL_HOST ) ) .'~si', $external_html) ){
      die( 'no backlink...' );
   }
}

Как это работает (по шагам в коде)

Пинги из записей вашего сайта отправляются через cron. Схема следующая:

ШАГ 1 (Создание задания CRON)

Функция _publish_post_hook() привязана к хуку publish_post:

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

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

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 (CRON)

Когда задание cron выполняется, срабатывает функция do_all_pings():

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

Эта функция вызывает хук do_all_pings, к которому по умолчанию прикреплено 4 функции:

add_action( 'do_all_pings', 'do_all_pingbacks', 10, 0 );
add_action( 'do_all_pings', 'do_all_enclosures', 10, 0 );
add_action( 'do_all_pings', 'do_all_trackbacks', 10, 0 );
add_action( 'do_all_pings', 'generic_ping', 10, 0 );

Поскольку WP 5.6, код функции был разделён на эти 4 функции. Ранее код выполнял множество различных операций одновременно.

Старая версия описания кода (что делает каждая функция):

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

    • для метаполя _pingmepingback( $post_content, $post_id ).
    • для метаполя _enclosemedo_enclose( null, $post_id ). Это отдельная логика для встраивания аудио и видео из контента и не относится к пингам. Такие встраивания добавляются в RSS-ленту в тег:
  2. Также собираются все опубликованные посты со статусом publish И to_ping != '', которые ��бычно содержат ссылки из содержимого, уведомляющие, что они были использованы в посте, и вызывается функция для каждого поста:

    • do_trackbacks( $post_id ) — которая, в свою очередь, вызывает trackback().
  3. Отправка пингов на сайты, которые нужно уведомить (указанные в настройках). Функция, отвечающая за эту операцию — generic_ping().

Процесс отправки пингов

Как отключить запросы XML-RPC

Прежде всего, я хотел бы повторить, что файл xmlrpc.php обрабатывает запросы, которые не требуют авторизации (пинги) и те, которые требуют (публикация контента на сайте).

Поэтому не рекомендуется полностью отключать этот файл, лучше отключить только часть логики, которая требует авторизации. Это можно сделать с помощью одной строки, используя хук xmlrpc_enabled:

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

Теперь вы имеете информацию о том, как работают уведомления в WordPress, и сможете эффективно их использовать, учитывая вышеописанные моменты.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *