Ars Longa, Vita Brevis

Errare humanum est

Сегодня в WordPress открылся баг (с самым высоким приоритетом — "highest omg bbq"). Симптомы его следующие: при публикации поста выдаётся ошибка вида:

[-]
View Code Text
PHP Catchable fatal error: Object of class WP_Error could not be converted to string in /wp-includes/comment.php on line 1264

Причина ошибки заключается в том, что WordPress недостаточно тщательно проверяет результат, который возвращают функции wp_remote_get()/wp_remote_post().

Ошибка проявляется, когда функция WP_Http::chunkTransferDecode() возвращает ошибку. Я не лез в дебри функции: возможно, сервер вернул что-то не то, возможно, декодер содержит ошибку, а может быть, виновата другая функция — важно здесь несколько другое: элемент body возвращаемого результата может не быть скалярным.

Переходим к исправлению ошибки.

Официального решения пока не существует. Я предложил разработчикам патч, но от лица, сообщившего об ошибке, пока никакой реакции не последовало.

Те, у кого данная ошибка проявляется, могут попробовать применить данный патч:

[-]
Download 8591a.diff
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php     (revision 10195)
+++ wp-includes/comment.php     (working copy)
@@ -1261,6 +1261,9 @@

        $contents = $response['body'];

+       if ( is_wp_error( $contents ) )
+               return false;
+
        $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote);
        $pingback_link_offset_squote = strpos($contents, $pingback_str_squote);
        if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) {
Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php   (revision 10195)
+++ wp-includes/functions.php   (working copy)
@@ -1276,7 +1276,7 @@

        $response = wp_remote_get( $uri, $options );

-       if ( is_wp_error( $response ) )
+       if ( is_wp_error( $response ) || is_wp_error( $response['body'] ) )
                return false;

        return $response['body'];
Index: wp-admin/update-links.php
===================================================================
--- wp-admin/update-links.php   (revision 10195)
+++ wp-admin/update-links.php   (working copy)
@@ -41,7 +41,7 @@
 if ( is_wp_error( $response ) )
        wp_die(__('Request Failed.'));

-if ( $response['response']['code'] != 200 )
+if ( $response['response']['code'] != 200 || is_wp_error( $response['body'] ) )
        wp_die(__('Request Failed.'));

 $body = str_replace(array("\r\n", "\r"), "\n", $response['body']);
Index: wp-admin/includes/plugin-install.php
===================================================================
--- wp-admin/includes/plugin-install.php        (revision 10195)
+++ wp-admin/includes/plugin-install.php        (working copy)
@@ -39,7 +39,7 @@

        if ( ! $res ) {
                $request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'body' => array('action' => $action, 'request' => serialize($args))) );
-               if ( is_wp_error($request) ) {
+               if ( is_wp_error($request) || is_wp_error($request['body']) ) {
                        $res = new WP_Error('plugins_api_failed', __('An Unexpected HTTP Error occured during the API request.</p> <p><a href="?" onclick="document.location.reload(); return false;">Try again</a>'), $request->get_error_message() );
                } else {
                        $res = unserialize($request['body']);
Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php  (revision 10195)
+++ wp-admin/includes/file.php  (working copy)
@@ -443,7 +443,7 @@

        $response = wp_remote_get($url, array('timeout' => 30));

-       if ( is_wp_error($response) ) {
+       if ( is_wp_error($response) || ( isset( $response['body'] ) && is_wp_error( $response['body'] ) ) ) {
                fclose($handle);
                unlink($tmpfname);
                return $response;

Либо пропатченные файлы можно скачать у Lecactus'а.

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

Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Яндекс.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Закладки Google
  • Писали
  • СМИ 2
  • Моё Место
  • Сто Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - I.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA

Связанные записи

Комментарии к статье "WordPress 2.7: фатальная ошибка при публикации статьи" (1) »

  1. [Декабрь 13, 2008 03:24] Исправление фатальной ошибки WP2.7 при публикации (если у вас такое вдруг случилось) - Lecactus Home:

    [...] сообщает Владимир Колесников, некоторые пользователи столкнулись с ошибкой при [...]

    Ответить на данный комментарий

    #1

RSS-фид комментариев к данной статье.
TrackBack URL: http://blog.sjinks.org.ua/wordpress/450-wordpress-27-fatal-error-while-publishing-post/trackback/

Оставить комментарий к записи "WordPress 2.7: фатальная ошибка при публикации статьи"

XHTML: можно использовать следующие тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя