Загрузка комментариев после загрузки всей страницы
Заголовок достаточно мутный, постараюсь объяснить на примере.
У меня есть страница “Скачать официальный русский BuddyPress 1.2“, к которой на данный момент оставлено 884 комментария. С учетом того, что у меня включены древовидные комментарии, то скорость загрузки конкретно этого поста была ужасной. И это мягко говоря.
Сегодня, ради спортивного интереса, я решил попробовать сделать пост-загрузку комментариев, то есть запускать процесс выбора и отображения комментариев после того, как вся страница (вместе с подвалом) уже загрузилась и отобразилась посетителю. После двухчасовой разминки мозга я нашел решение. То, что вы увидите – выглядит очень просто, но придти к такому решению я смог не сразу, ибо начал пытаться ломать сам WordPress :)
Для начала откройте любой js файл темы и вставьте туда вот это:
jQuery(document).ready(function(){
if (jQuery('div#comments_place').length){
// get vars
var class_holder = jQuery('div#comments_place').attr('class').split('_');
var post_id = class_holder[1];
var cpage = class_holder[2];
// do request to get comments
jQuery.ajax({
url: '/wp-admin/admin-ajax.php',
dataType: 'html',
data: {
action : 'get_comments',
post_id : post_id
},
success: function(comments){
jQuery('div#comments_placeholder').html(comments);
},
error: function(comments){
jQuery('div#comments_placeholder').html('Произошла ошибка во время получения комментариев. Перезагрузите страницу, пожалуйста.');
}
});
}
});
Далее открываете файлы single.php шаблона и вместо comments_template()
(или что у вас там отображает список комментариев) вставляете вот это:
<div id=”comments_placeholder” class=”post_<?php echo $post->ID ?>”>Пожалуйста, подождите, комментарии загружаются.</div>
И, наконец, для обработки аякса вам надо открыть файл functions.php шаблона и вставить туда вот этот код:
add_action('wp_ajax_get_comments','cd_get_comments');
add_action('wp_ajax_nopriv_get_comments','cd_get_comments');
function cd_get_comments(){
global $post, $wp_query;
if( !is_numeric($_GET['post_id']) )
die;
$wp_query = new WP_Query('p='.$_GET['post_id']);
while ($wp_query->have_posts()) : $wp_query->the_post();
comments_template();
endwhile;
die;
}
Теперь при заходе на страницу одной записи у вас будет обычная быстрая загрузка всей страницы, и только после ее окончания отправится запрос на получение комментариев. Можно сделать какие-нибудь плюшки и отправлять такой запрос только при клике на кнопку – Прочитать комментарии. А форму для комментирования показывать всегда, к примеру.
В общем, я ради теста включил ajax-подгрузку комментариев на всем сайте (некоторое время она была только для меня). Прошу говорить плюсы и минусы, мне будет интересно ваше мнение.
Точно известна проблема в iPad – комментарии не загружаются вообще.
Возможным решением будет загрузка комментариев по клику на кнопку.
Также нельзя перейти непосредственно к комментарию по хеш-тегу. На момент открытия страницы такого id еще нет в доме.
Почему-то мой код работал только в Firefox и Windows 7. Поэтому я временно все убрал для неавторизованных пользователей. Пока покапаюсь, может, что улучшить смогу…
Кажется починил – повторить проблему не получилось. Буду рад, если кто-нибудь что-нибудь здесь напишет :)
все работает)
зы: можно заменить
url: ‘/wp-admin/admin-ajax.php’,
на
url: ajaxurl,
данная константа определяется движком через site_url(‘/wp-admin/admin-ajax.php’)
а можно сделать еще лучше – создать свой ajax.php и не тянуть все и вся WP…
Да, работает :)
Нельзя ставить просто ajaxurl – вот у меня эта переменная не определена, пришлось самому ставить. А свой ajax.php – тоже не очень хороший вариант, так как иногда надо, чтобы вместе с комментариями загружались плагины
PS Исправил код в записи (добавилась одна строчка).
BuddyPress ajaxurl добавляет (или сам WP – не помню…)
BP – да, всегда добавляет. А WP как раз нет. Но это мелочи по сравнению с возможностями :)
Как можно развить эту идею для комментариев?
У меня свой код, но не подгружаются плагины, в чем может быть причина?
уже решил:)
Также в рамках кампании по улучшению сайта вернул поиск в шапке и вставил кнопку Google +1 :)
Сейчас разберусь с JESv2 и думаю смогу предложить конструктивные идеи) а насчет admin-ajax – уж больно он много тянет..имхо
Есть такой параметр SHORTINIT (погугли) в wordpress, может здорово ускорить ajax – так как не будут загружаться все плагины и темы – только ядро.
И буду ждать идеи :)
А можно ли сделать периодическое обновление комментариев?
В смысле? Если страница открыта, чтобы все дерево комментов перезаписывалось? Можно. setTimeout + вызов функции получения и отрисовки комментов.
Вы как понимаю, отказались от такой системы подгрузки комментариев здесь? Почему?
Нет, не отказался :)
Просто очень быстро сейчас все грузится.
Уже пару месяцев как не удавалось комментировать здесь
Весьма странно.
Еще используйте этот метод на сайте? Если нет, то почему? Правильно ли я понимаю, что такая загрузка комментариев закрывает их от индексации поисковиков?
Нет, уже давным давно отказался. Просто начал использовать хостинг получше + объектное кеширование (с использование Redis) – решило проблему скорости для меня.
Да, она их закрывает. Но имхо комментарии и так игнорируются поиcковиками, как не основной контент, плюс они короткие (именно поэтому наверное и игнорируются).