Как вы помните, я поставил себе кэширование на некоторые свои сайты, после чего пришлось мне делать динамические вставки с помощью 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>
<script type="text/javascript">
jQuery(document).ready(function($){
  $.ajax({
    type : "GET",
    url : "<?php echo get_option('home'); ?>/wp-content/plugins/wp-postratings/wp-postratings.php",
    data : { wp_ajaxaction : "jquery", post_id : <?php echo $id; ?> , _ajax_check : "<?php echo $nonce;?>"},
    success : function(response){$("#ratings-wrap-<?php echo $id; ?>").html(response);}
  });
});
</script><?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% случаев похерятся. Так что делаем бэкап перед всеми обновлениями!