Загрузка комментариев после загрузки всей страницы

Заголовок достаточно мутный, постараюсь объяснить на примере.

У меня есть страница “Скачать официальный русский 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-подгрузку комментариев на всем сайте (некоторое время она была только для меня). Прошу говорить плюсы и минусы, мне будет интересно ваше мнение.

 

комментарий 21

  1. Точно известна проблема в iPad – комментарии не загружаются вообще.
    Возможным решением будет загрузка комментариев по клику на кнопку.

    Также нельзя перейти непосредственно к комментарию по хеш-тегу. На момент открытия страницы такого id еще нет в доме.

  2. Почему-то мой код работал только в Firefox и Windows 7. Поэтому я временно все убрал для неавторизованных пользователей. Пока покапаюсь, может, что улучшить смогу…

    • Кажется починил – повторить проблему не получилось. Буду рад, если кто-нибудь что-нибудь здесь напишет :)

      • Jettochkin:

        все работает)

      • Jettochkin:

        зы: можно заменить
        url: ‘/wp-admin/admin-ajax.php’,
        на
        url: ajaxurl,

        данная константа определяется движком через site_url(‘/wp-admin/admin-ajax.php’)

        а можно сделать еще лучше – создать свой ajax.php и не тянуть все и вся WP…

        • Да, работает :)
          Нельзя ставить просто ajaxurl – вот у меня эта переменная не определена, пришлось самому ставить. А свой ajax.php – тоже не очень хороший вариант, так как иногда надо, чтобы вместе с комментариями загружались плагины

          PS Исправил код в записи (добавилась одна строчка).

          • Jettochkin:

            BuddyPress ajaxurl добавляет (или сам WP – не помню…)

          • BP – да, всегда добавляет. А WP как раз нет. Но это мелочи по сравнению с возможностями :)

            Как можно развить эту идею для комментариев?

        • У меня свой код, но не подгружаются плагины, в чем может быть причина?

  3. Также в рамках кампании по улучшению сайта вернул поиск в шапке и вставил кнопку Google +1 :)

  4. Александр:

    Сейчас разберусь с JESv2 и думаю смогу предложить конструктивные идеи) а насчет admin-ajax – уж больно он много тянет..имхо

    • Есть такой параметр SHORTINIT (погугли) в wordpress, может здорово ускорить ajax – так как не будут загружаться все плагины и темы – только ядро.
      И буду ждать идеи :)

  5. Алексей:

    А можно ли сделать периодическое обновление комментариев?

    • В смысле? Если страница открыта, чтобы все дерево комментов перезаписывалось? Можно. setTimeout + вызов функции получения и отрисовки комментов.

  6. Slam:

    Вы как понимаю, отказались от такой системы подгрузки комментариев здесь? Почему?

  7. AlexD:

    Уже пару месяцев как не удавалось комментировать здесь

  8. Iv:

    Еще используйте этот метод на сайте? Если нет, то почему? Правильно ли я понимаю, что такая загрузка комментариев закрывает их от индексации поисковиков?

    • Нет, уже давным давно отказался. Просто начал использовать хостинг получше + объектное кеширование (с использование Redis) – решило проблему скорости для меня.
      Да, она их закрывает. Но имхо комментарии и так игнорируются поиcковиками, как не основной контент, плюс они короткие (именно поэтому наверное и игнорируются).

Добавить комментарий

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