Як працюють повідомлення у WordPress (пінги, трекбеки)
У цій статті поговоримо про пінги (trackback, pingback) у WordPress, як вони влаштовані, чим відрізняються, як працюють і як ефективно використовувати їх.
Trackbacks та pingbacks – це способи комунікації між сайтами WordPress. Вони існують з перших днів появи WordPress, але небагато користувачів знають про ці функції.
Читайте також: Відключаємо повідомлення (пінги) на свої ж посади
Trackbacks та Pingbacks
У WP є два види повідомлень про те, що хтось послався на вашу статтю (цім хтось може бути і ваш сайт, коли ви посилаєтеся на статтю іншого сайту):
- Pingback
Автоматичне сповіщення. Не надсилають жодного вмісту.
Це коли ваш сайт автоматично повідомляє “інший сайт” під час публікації запису, про те, що в контенті запису є посилання на “інший сайт”. При такому повідомленні ваш сайт автоматично відправляє пінг, а інший сайт отримує цей пінг у вигляді коментаря з типом
comment_type = pingback
.- Trackback
Ручне сповіщення. Надсилають витримку з контенту посту.
При такому повідомленні ви повинні вручну вказати URL статті, на яку хочете надіслати повідомлення, а інший сайт отримує це повідомлення у вигляді коментаря з типом
comment_type = trackback
.Надіслати Trackback, можна зі сторінки редагування посту.
Чим відрізняються Trackbacks та Pingbacks?
З опису вище видно, що й те й інше робить приблизно те саме, але мають ряд відмінностей:
Trackbacks відправляються вручну, а Pingbacks – автоматично.
Pingbacks не надсилають ніякого контенту, в той час, як trackbacks супроводжуються витримкою з контенту.
- Використовуються різні технології надсилання та отримання запиту.
Налаштування Trackbacks та Pingbacks?
У WP увімкнути/вимкнути отримання/відправлення повідомлень можна на сторінці Настройки → Обсуждение
(Settings → Discussion):
Як працюють повідомлення (пінги)
Тут два можливі сценарії:
1) Ваш сайт надсилає пінг запит на інший сайт
Pingback
При публікації поста ВП перевірять, чи треба повідомляти згадані в пості сайти. Тобто. він дивиться чи включена опція 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' ); ?>">
Trackback
При публікації/оновленні поста перевіряється поле trackback_url
:
Якщо воно вказано, воно буде додано в поле to_ping
таблиці wp_posts
, в якому зберігаються посилання на сайти, які потрібно повідомити. Операція сповіщення відбудеться пізніше за кроном do_trackbacks() .
2) Ваш сайт отримує пінг запит з іншого сайту
В налаштуваннях сайту (картинка вище), ми можемо відключити окремо відправлення повідомлень зі свого сайту, або отримання повідомлень з інших сайтів, або й те й інше.
Pingback
Повідомлення надходять у файл /xmlrpc.php – він їх і обробляє:
Спочатку перевіряє опцію
default_ping_status
– чи дозволено на сайті взагалі отримувати сповіщення.А потім знаходить згаданий пост і перевіряє, чи відкриті для нього повідомлення. Робиться це функцією get_default_comment_status() , зокрема, перевіряється значення поля
ping_status
запису, яке може бути:open
абоclosed
.- Якщо повідомлення відкриті, до зазначеного запису публікується коментар із типом
comment_type = 'pingback'
.
Trackback
Трекбекі обробляє файл /wp-trackback.php .
Трекбек коментар має тип comment_type = 'trackback'
.
Навіщо ще потрібен файл 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_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 , на якому за умовчанням висять 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);
do_all_pingbacks() | Performs all pingbacks. |
do_all_enclosures() | Performs all enclosures. |
do_all_trackbacks() | Performs all trackbacks. |
generic_ping() | Використовуйте pings до всіх ping site services. |
З версії WP 5.6 код функції був розбитий на ці чотири функції. До цього код виконував безліч різних операцій разом. Старий опис коду (в ньому видно, що робить кожна функція вище):
Збирає всі пости з встановленими метаполями та запускає для кожного з них функцію:
- для метаполя
_pingme
– pingback($post_content, $post_id) . для метаполя
_encloseme
– do_enclose (null, $ post_id) . Це окрема логіка вбудовування аудіо та відео з контенту не стосується пінгів. Такі вбудовування додаються до RSS стрічки в тег:<enclosure url="http://example.com/file.mp3" length="123456789" type="audio/mpeg" />
- для метаполя
Також збирає всі опубліковані пости
status=publish AND to_ping != ''
(у to_ping там зазвичай знаходяться посилання з контенту, які потрібно повідомити, що вони використовувалися в пості) і для кожного посту запускає функцію:Відправляє пінги на сайти, які потрібно пінгувати (наведені в налаштуваннях). За цю операцію відповідає функція generic_ping() .