Пермалинк так сложился

Вчера вечером нашёл, а сегодня утром окончательно разобрался с одной очень интересной ошибкой плагина All in One SEO Pack. Ошибка проявляется в версии 1.4.6.15, но, возможно, более ранние версии тоже ей подвержены. Для проявления ошибки необходима определённая структура пермалинков: я столкнулся с ошибкой на такой структуре: /%category%/%postname%/. Тем не менее, структура — условие необходимое, но не достаточное: я не на всех сайтах смог воспроизвести ошибку. Возможно, причиной этому являются сторонние темы и/или плагины. Тем не менее, в причинах её возникновения я разобрался.

Проявляется ошибка следующим образом: при переходе на сайт по неверной ссылке (например, http://example.com/wpadmin) отображается пустая страница, а в логе ошибок присутствует примерно такое сообщение:

[-]
View Code Text
PHP Catchable fatal error:  Object of class WP_Error could not be converted to string in /wp-content/plugins/all-in-one-seo-pack/all_in_one_seo_pack.php on line 950

Не буду ручаться за номер строки (я добавлял отладочный код для идентификации ошибки, а после удаления кода количество пустых строк могло не совпасть), но код, соответствующий данной строке, выглядит так:

[-]
View Code PHP
  1.        } else if (is_category() && !is_feed()) {
  2.             $category_description = $this->internationalize(category_description());
  3.             $category_name = ucwords($this->internationalize(single_cat_title('', false)));
  4.             $title_format = get_option('aiosp_category_title_format');
  5.             $title = str_replace('%category_title%', $category_name, $title_format);
  6.             $title = str_replace('%category_description%', $category_description, $title);
  7.        } else if (is_page()) {

Ошибка проявляется в предпоследней строке. Я не стал углубляться в логику канонического переписывания URL, но получается так, что WordPress считает, что wpadmin — это имя категории. Я так и не понял, почему он не выдаёт 404 (возможно, виноват сторонний плагин), но факт остаётся фактом. Так как эта категория не существует, функция category_description() возвращает WP_Error, а не строку. Теоретически, ошибка могла проявиться в методе internationalize(), но это редкий случай.

Итак, чтобы исправить ошибку, нам нужно добавить простую проверку результата, возвращаемого функцией category_description().

Получим такой патч:

--- all_in_one_seo_pack.php.orig        2008-12-18 07:04:43.000000000 +0200
+++ all_in_one_seo_pack.php     2008-12-18 07:05:39.000000000 +0200
@@ -789,6 +789,10 @@
        }

        function internationalize($in) {
+               if (false == is_scalar($in)) {
+                       return '';
+               }
+
                if (function_exists('langswitch_filter_langs_with_message')) {
                        $in = langswitch_filter_langs_with_message($in);
                }
Добавить в закладки

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

18
Дек
2008

Комментарии к статье «All in One SEO Pack 1.4.6.15: пустой экран при неверном запросе» (9)  »

  1. mindofdead says:

    а как посмотреть этот лог ошибок, где?

    приобрел хостинг, ставлю чистый вордпресс 2.7 (пробовал и 2.6.5), даже без плагинов - часто пустые страницы при переходах по страницам. неверные запросы в никуда.

    если запрос перебить новым кликом - грузится
    но эти пропажи утомили. я уже хостинг решил менять
    ибо мне в тех. поддержки пишут - проблема у вас.
    а я тестировал файлы на другом хостинге, бесплатном - работает без пропажи запросов, но медленно слегка
    вот может лог ошибок даст знать, чв чем же дело =(

  2. MalDiva says:

    Здравствуйте, Владимир!

    Просто уже не знаю, куда писать…
    Установила себе тему (отсюда http://topwpthemes.com/classicmag/), русифицировала. Тема простояла полдня, а потом сбросилась на дефолтную. Так повторялось несколько раз. Была мысль, что в теме есть ошибка. Однако после установки другой темы произошло то же самое. Возникло подозрение, что есть конфликт с каким-то плагином. Вычислить его мне так и не удалось, а проблемы пошли дальше. Раньше все ЧПУ у меня были вида http://maldiva.ru/?p=123. Но новая тема с такими ЧПУ выдавала ошибку 404, поэтому пришлось выбрать произвольный вид /index.php/%postname%/. После этого ни одна тема вообще не хочет работать с ЧПУ другого вида, только с произвольным вариантом. Почему???
    На мыло стали приходить сообщения такого характера: Bad Link To /index.php/%25d0%25b4%… Раньше такого никогда не было. С чем это связано?

    На форумах поддержки WP ответа я так и получила(((( Очень прошу вас, помогите, пожалуйста, разобраться. Подскажите, где искать проблему?

Подписаться на RSS-ленту комментариев к статье «All in One SEO Pack 1.4.6.15: пустой экран при неверном запросе» Trackback URL: http://blog.sjinks.org.ua/wordpress/patches/457-all-in-one-seo-pack-blank-screen-for-404/trackback/

Оставить комментарий к записи «All in One SEO Pack 1.4.6.15: пустой экран при неверном запросе»

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

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

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