Как подружить Yet Another Photoblog и объектный кэш
Делаем YAPB дружелюбнее к объектному кэшу
Один из пользователей плагина WP File Cache сообщил о конфликте с плагином Yet Another Photoblog (YAPB), проявляющейся в выдаче сообщения об ошибке вида
Catchable fatal error: Object of class YapbImage could not be converted to string in /wp-includes/formatting.php on line 427
Хотя с первого взгляда на код YAPB становится ясно, что виноват ну никак не WP File Cache, проблема тем не менее остаётся и требует решения.
Для локализации подобных проблем нужно получить трассу вызовов при помощи функции debug_backtrace(): результат, как правило, подсказывает, в каком направлении нужно копать.
В данном случае мы видим, что функция esc_attr() получает вместо строки объект класса YapbImage. Это происходит из-за того, что в объекте, переданном функции sanitize_post(), присутствует еще один объект (поле image).
Сам по себе объект внутри объекта записи/страницы в кэш попасть не может. Следовательно он либо помещается специально, либо по незнанию. Идём в функцию get_posts() и смотрим, из какой группы кэша берутся данные. Из группы posts ($_post = wp_cache_get($post, 'posts')). Дальше дело техники: смотрим, где используется wp_cache_xxx() с группой posts и какие фильтры, могущие повлиять на результат, вызываются. Смотрим, на какие события вешает фильтры плагин, анализируем результат. И приходим к месту ошибки. Просто, когда знать, как.
Есть в WordPress особый фильтр — называется the_posts. Он вызывается после получения данных о записях из БД, но перед помещением результата в кэш. Соответственно, все изменения над записями, внесённые данным фильтром, при использовании объектного кэша будут глобальными. В частности, такое происходило с плагином auto_more.
YAPB устанавливает свой обработчик для данного фильтра:
for ($i=0, $len=count($posts); $i<$len; $i++) {
$post = &$posts[$i];
if (!is_null($image = YapbImage::getInstanceFromDb($post->ID))) {
$post->image = $image;
}
}
return $posts;
}
В этом обработчике в объект записи и добавляется тот злополучный YapbImage, о который спотыкается esc_attr().
С причиной ошибки разобрались, переходим к лечению.
Целью метода _filter_the_posts() было добавление объекта с информацией о картинке к записям, которые будут отображаться на странице (честно говоря, я не совсем понимаю, почему это нельзя было сделать в обработчике the_content).
В данном случае можно вместо фильтра the_posts использовать событие loop_start. В общем случае они не эквивалентны, но если записи выводятся только внутри The Loop, то работать будет.
Открываем файл lib/Yapb.class.php, ищем строку
Заменяем на
Затем ищем метод _filter_the_posts и исправляем его на такой:
$posts = $query->posts;
for ($i=0, $len=count($posts); $i<$len; $i++) {
$post = &$posts[$i];
if (!is_null($image = YapbImage::getInstanceFromDb($post->ID))) {
$post->image = $image;
}
}
}
Очищаем кэш и наслаждаемся прекрасной работой
PS: актуально для любого плагина объектного кэширования, будь то WP File Cache, SJ Object Cache или любой другой плагин.
Автор: Vladimir; опубликовано в: WordPress; метки: WordPress, YAPB, кэш, ошибка, плагинАпр
2010
Комментарии к статье «Как подружить Yet Another Photoblog и объектный кэш» (1) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Как подружить Yet Another Photoblog и объектный кэш»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


[...] This post was mentioned on Twitter by Интернет заработок. Интернет заработок said: V.Kolesnikov: Как подружить Yet Another Photoblog и объектный кэш
http://bit.ly/bR9hce[...]