Дружим WP-PostRating и WP Super Cache
Как вы помните, я поставил себе кэширование на некоторые свои сайты, после чего пришлось мне делать динамические вставки с помощью SSI. Этот вариант отлично подходит для сторонних самописных дополнений, никак не связаных с движком WordPress. Но вот, захотелось мне поставить плагин рейтинга - WP-PostRating. И, как вы наверно уже догадались, он не заработал как надо. Виной тому, как вы тоже уже наверно догадались, кэширование :) Но мыж не лохи какие-нибудь, если хочеца рейтинга с кэшированием - мы его сделаем! :)
Когда ставишь оценку посту, то происходит запрос аяксом к серверу и значение оценки сохраняеца в БД. Проблема в том, что когда обновляешь страницу, то твоя оценка не показывается, то есть, из кэша берется старая страница, в которой нет учета твоего голоса при подсчете средней оценки.
На одном из буржуйских форумов я нашел решение, когда запрос результатов рейтинга идет аяксом - таким образом эти результаты никогда не кэшируются. Конечно, мы опять чутка увеличили нагрузку на сервак (первый раз мы это сделали, использовав SSI), ну да и хуй с ней, зато рейтинг будет в тему :)
Решение успешно заработало (с небольшой правкой) на WP версии 3.1.1, WP-PostRating версии 1.6.1 и WP Super Cache версии 0.9.9.9.
Открываем файл functions.php в /wp-content/themes/вашатема/. Если его нет - создаем. И пихаем в конец (внимательней смотрите на указатели начала и конца php-кода, чтоб не запутаться) такой кусок кода:
<?php
function get_rating_ajax($id) {
$nonce = wp_create_nonce('my_rating');
?>
<div id="ratings-wrap-<?php echo $id;?>">
<img src="/wp-content/uploads/images/loading_rating.gif" />
</div>
<?php
}
?>
Далее, открываем файл wp-postrating.php в папке с плагином WP-PostRating, ищем строку
$wpdb->ratings = $wpdb->prefix.'ratings';
и ниже ее добавляем такой код:
if ( $_GET['wp_ajaxaction'] == 'jquery' ) {
$nonce =$_REQUEST['_ajax_check'];
if (! wp_verify_nonce($nonce, 'my_rating') ) die('Security check');
$id = $wpdb->escape($_GET['post_id']);
the_ratings('div',$id);
exit();
}
При вызове самого плагина используется функция в коде страницы. Мы ее меняем на ID); ?>.
И вроде бы все должно заработать. Но у меня нифига не заработало :) Ругалось так: Fatal error: Call to undefined function get_ipaddress() in /…/wp-content/plugins/wp-postratings/wp-postratings.php on line 310
Я полез туда, и вижу чуть ниже эту самую функцию - get_ipaddress, ток перед ее объявлением проверяется ее существование. Я так понимаю, это чтоб она не конфликтовала с другими плагинами этого автора, юзающих эту же функцию. Так вот, если убрать эту проверку - то ошибка не вылазит, а плагин работает как должен. Я не знаю, почему так происходит, лениво было разбираться, главное - работает :)
И на последок - не забывайте о изменениях, подобных этим. При обновлении движка/плагинов все они в 99% случаев похерятся. Так что делаем бэкап перед всеми обновлениями!