Как подружить Yet Another Photoblog и объектный кэш

Делаем YAPB дружелюбнее к объектному кэшу

Один из пользователей плагина WP File Cache сообщил о конфликте с плагином Yet Another Photoblog (), проявляющейся в выдаче сообщения об ошибке вида

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(): результат, как правило, подсказывает, в каком направлении нужно копать.

[+]
View Code Text

В данном случае мы видим, что функция esc_attr() получает вместо строки объект класса YapbImage. Это происходит из-за того, что в объекте, переданном функции sanitize_post(), присутствует еще один объект (поле image).

Сам по себе объект внутри объекта записи/страницы в попасть не может. Следовательно он либо помещается специально, либо по незнанию. Идём в функцию get_posts() и смотрим, из какой группы кэша берутся данные. Из группы posts ($_post = wp_cache_get($post, 'posts')). Дальше дело техники: смотрим, где используется wp_cache_xxx() с группой posts и какие фильтры, могущие повлиять на результат, вызываются. Смотрим, на какие события вешает фильтры , анализируем результат. И приходим к месту ошибки. Просто, когда знать, как.

Есть в особый фильтр — называется the_posts. Он вызывается после получения данных о записях из БД, но перед помещением результата в кэш. Соответственно, все изменения над записями, внесённые данным фильтром, при использовании объектного кэша будут глобальными. В частности, такое происходило с плагином auto_more.

YAPB устанавливает свой обработчик для данного фильтра:

[-]
View Code PHP
function _filter_the_posts($posts) {
    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, ищем строку

[-]
View Code PHP
add_filter('the_posts', array(&$this, '_filter_the_posts'));

Заменяем на

[-]
View Code PHP
add_action('loop_start', array(&$this, '_filter_the_posts'));

Затем ищем метод _filter_the_posts и исправляем его на такой:

[-]
View Code PHP
                function _filter_the_posts(&$query) {
                        $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 или любой другой плагин.

Автор: ; опубликовано в: WordPress; метки: WordPress, YAPB, кэш, ошибка, плагин
8
Апр
2010

RSS Комментарии к статье «Как подружить Yet Another Photoblog и объектный кэш» (1)  »

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

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Как подружить Yet Another Photoblog и объектный кэш»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

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

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

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

गते गते पारगते पारसंगते बोधि स्वाहा