Дружим 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> <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% случаев похерятся. Так что делаем бэкап перед всеми обновлениями!