Исправляем кодировку Ping в WordPress’е
Если вы думаете, что trackback'и и ping'и в WordPress'е реализуются одинаково, то ошибетесь. В ближайшее время я планирую написать статью, рассказывающую об их различиях, а пока кратко опишу их алгоритмы и приведу хак (исправление), с помощью которого ваш WordPress сможет корректно работать с любой кодировкой.
Разница между пингами и трэкбаками на практическом уровне заключаются в том, что для трэкбака в WordPress'е предусмотрено отдельное поле, в котором вы указываете ссылку на трэкбэк комментируемой статьи.
Пинги же - это не что иное, как простое указание ссылки прямо в тексте сообщения. При публикации поста, WordPress автоматически «вычленяет» все ссылки и пытается отправить по этим адресам адрес только что созданного вами сообщения. Главное различие между пингом и трэкбэком заключается в том, что пинг - это простая посылка только ссылки (URL), а трэкбэк - это определенным образом сформированный xml-запрос.
Механизм трэкбэков реализуется на уровне «движка», пинги - это не что иное, как технология XML-RPC (по-сути - управление сайтом).
Проблему кодировки трэкбэков я уже рассматривал и там же привел способ полностью решить эту проблему. Сейчас я привожу уже готовое решение пингов для блогов с кодировками UTF-8 или Windows-1251.
Кодировка «входящего» сообщения будет определена правильно только в случае, если на самой странице в явном виде указана кодировка «meta ... charset=...». Если такого указания нет, то будет использоваться кодировка UTF-8.
Приступаем
Скачайте файл исправления - это обычный текстовый файл, который вы вставите в xmlrpc.php.
Откройте файл xmlrpc.php. Почти в самом конце найдите такую функцию (она длинная, поэтому будьте внимательны; сделайте резервную копию файла):
/* pingback.ping gets a pingback and registers it */
function pingback_ping($args) {
...
В ней строчки, между которыми нужно вставить исправление («#### FIX ...»).
...
// Let's check the remote site
$linea = wp_remote_fopen( $pagelinkedfrom );
if ( !$linea )
return new IXR_Error(16, 'The source URI does not exist.');
вот сюда (вместо этой строки!) нужно вставить исправление
// Work around bug in strip_tags():
$linea = str_replace('< !DOC', '<DOC', $linea);
...
Напомню, что копирование в буфер обмена Ctrl+C, вставка из буфера - Ctrl+V.
После этого сохраните файл xmlrpc.php и загрузите его на сервер.
Постоянная ссылка: http://maxsite.org/?p=30
Версия для печати
