Загрузка...

Вывод комментариев с пагинацией

Выводим все комменты на WordPress из базы данных с пагинацией


Иногда может быть удобно дать доступ к такой странице в блоге на wordpress. Допустим у нас очень много комментариев, а в виджете выводятся около 5 последних:

scr-c1Консоль » Виджеты

Эти комментарии отображаются где нибудь в сайдбаре, в публичной части сайта, в зависимости от специфики конкретной темы. Но что если пользователям предоставить возможность просматривать все комментарии блога? Для этого я рассмотрю нижеследующую схему, по которой можно это реализовать, а в дальнейшем вы сами сможете улучшить код под свои нужды. Сразу отмечу, что весь код приведенный в этой заметке, необходимо будет адаптировать конкретно под ту тему, на которой вы планируете создать такой вывод комментариев, потому что описываю, по сути только механизм и минимальный вывод данных, таких как: автор, тело коммента, дата, аватар (если есть). Весь html в шаблоне приведен как пример. Итак, давайте реализуем вывод комментариев из базы данных с постраничной навигацией без всяких плагинов.

Для начала нужно создать шаблон такой страницы. В папке с темой (например, пускай это будет Twenty Seventeen тема, на сегодняшний день самая новая из коробки wp) создаем файл page-comments.php, в нем:

<?
/*
  Template Name: Page_Comments
*/
get_header(); ?>
    <div class="wrap">
        <div id="primary" class="content-area">
            <main id="main" class="site-main" role="main">
                <?= comments_out(400, 7) ?>
            </main><!-- #main -->
        </div><!-- #primary -->
    </div><!-- .wrap -->
<? get_footer(); ?>

Основная функция comments_out ( int $ex, int $max ), возвращает html и ссылки пагинации

  • ex — integer, сколько символов обрезать в каждом комментарии
  • max — integer, по сколько комментариев выводить на странице (15 по умолчанию)
  • comments_out(400) — вернет html всех комментарии, контент каждого комментария усечен до 400 символов, по 15 шт на страницу

Теперь создаем страницу Создать страницу » Добавить новую:

scr-c-2Устанавливаем шаблон Page_Comments странице

Получившийся url страницы (прописываем в редакторе url: /comments/) выводим где захотим, по нему посетители будут попадать на страницу вывода всех комментариев, а тем временем регистрируем несколько функции в файле functions.php своей темы, которые будут проводить всю работу:

function comments_out($ex, $max = 15)
{
    global $wpdb;

    $join = "LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
		 LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
    $and = "AND tax.taxonomy = 'category'";

    $page = intval($_REQUEST['pg']);
    $sql = "SELECT comment_ID FROM $wpdb->comments";
    $count = count($wpdb->get_results($sql));
    $pages = intval($count / $max);
    $pages = (($count / $max) == $pages) ? $pages : $pages + 1;
    $out = '';
    if ($page >= $pages) {
        return false;
    } else {
        if (!isset($_REQUEST['pg']) && $page == 0) {
            $limit = '0, ' . $max;
            $sql = build_sql_comment($wpdb, $limit, $and, $join);
            $results = $wpdb->get_results($sql);
            $out .= render_page_comment($out, $results, $ex);
        } else {
            $current = $page * $max;
            $limit = $current . ', ' . $max;
            $sql = build_sql_comment($wpdb, $limit, $and, $join);
            $results = $wpdb->get_results($sql);
            $out .= render_page_comment($out, $results, $ex);
        }
        $out .= '<div class="pagination pagination-comments">';
        for ($i = 0; $i < $pages; $i++) {
            if ($i == $page)
                $out .= '<span class="page-numbers current">' . ($i + 1) . '</span>';
            else
                $out .= '<a class="page-numbers" href="/comments/?pg=' . $i . '">' . ($i + 1) . '</a>';
        }
        $out .= '</div>';
        return $out;
    }
}

function render_page_comment($out, $results, $ex)
{
    foreach ($results as $comment) {
        $hash = md5(strtolower(trim($comment->comment_author_email)));
        $comtext = strip_tags($comment->comment_content);
        $leight = (int)iconv_strlen($comtext, 'utf-8');
        if ($leight > $ex)
            $comtext = iconv_substr($comtext, 0, $ex, 'UTF-8') . ' …';
        $date_out = explode('-', explode(' ', $comment->comment_date)[0]);
        $date_time = explode(':', explode(' ', $comment->comment_date)[1]);
        $string_date = " сказал " . $date_out[2] . "." . $date_out[1] . "." . $date_out[0];
        $string_time = "<p>В " . $date_time[0] . " : " . $date_time[1] . "</p>";
        $out .= "<div class='comment-div'><h5 class='title-comment'>" .
            strip_tags($comment->comment_author) .
            $string_date . ":</h5>" . $string_time . "
                <div class='comment-body'>
                    <div class='comment-ava'><img src='https://www.gravatar.com/avatar/{$hash}'></div>
                    <div class='comment-link'>
                        <a href = " . get_comment_link($comment->comment_ID) . " title = " . $comment->post_title . ">&mdash;&nbsp;" . $comtext . "</a>
                    </div>
                </div>
        </div>";
    }
    return $out;
}

function build_sql_comment($wpdb, $str, $and, $join)
{
    return "SELECT comment_ID, comment_post_ID, comment_content, post_title, guid,
                   comment_author, comment_author_email, user_id, comment_date
	    FROM $wpdb->comments com
            LEFT JOIN $wpdb->posts p ON (com.comment_post_ID = p.ID) {$join}
            WHERE comment_approved = '1'
	    AND comment_type = '' {$and}
	    ORDER BY comment_date DESC
            LIMIT $str";
}

На выходе каждый коммент будет в таком html:

<div class="comment-div">
   <h5 class="title-comment">John Doe сказал 01.01.2001:</h5>
   <p>В 00: 00</p>
   <div class='comment-body'>
      <div class='comment-ava'>
         <img src="https://www.gravatar.com/avatar/e80559576bc9ec303afbd293f3514315">
      </div>
      <div class='comment-link'>
         <a href="http://site.com/#comment-1" title="">—&nbsp;comment content</a>
      </div>
   </div>
</div>

Применяя css стилизовать страницу комментариев можно уже по своему.

Чтобы протестировать, закачиваем себе новый вп, устанавливаем тему. Делаем быстрый импорт и смотрим, играемся:

У меня при выводе 2 комментариев на страницу, т.е. при вызове:

echo comments_out(400, 2);

Получалось вот так:

Clip2net_170214004150.png

Вы можете задавать любые параметры и выводить комментарии с постраничной навигацией как вам захочется.

Механика постраничной навигации

Отдельно хочется отметить сам принцип постраничной навигации, механизм которого лежит в основе представления любого типа контента, а не только комментариев. Как известно, все данные в основном хранятся в БД (только если у вас не статичные html) и если записей какого либо контента становится со временем очень много, то в таком случае и используют данное представление, чтобы разбивать большое количество информации на страницы. А сама суть этого разбиения очень проста и кроется в sql строках вида (пример):

SELECT * FROM table LIMIT 0, 10

Здесь нам приходит на помощь LIMIT, именно с помощью него все и делается. Число слева — смещение, то есть, с какой записи в таблице начинать счет строк, число справа — количество, которое нужно отсчитать. В дальнейшем, вместо смещения, подставляем число 10 и также выводим 10 следующих записей:

SELECT * FROM table LIMIT 10, 10

И так далее. А например, зная, сколько строк в БД содержит тот или иной контент, мы можем поделить его на максимальное количество выводимых элементов на одну страницу и узнать количество ссылок pages. И в дальнейшем отталкиваться от этого, передавая в каждую ссылку параметром текущего page, а остальное дело техники. Вышеописанный код можно разобрать, чтобы во всем разобраться самостоятельно. Вот это и будет домашним заданием, удачи! ;)



Похожие заметки:

Прикручиваем Sphinx к своему поиску на сайте

Установка, задание конфигурации и запуск службы на Ubuntu для высокоскоростного поиска. Быстрый гайд

Открыть здесь

Веб-разработка

Займусь вашим проектом, если вам нужен специалист в области веб-разработки

Открыть здесь


Перед тем как писать комментарии, рекомендую ознакомиться:

Markdown синтаксис »

Оформление кода »

Нужна аватарка »

Комментарии


2
avatar

Владимир сказал 20-02-2017 в 01:09


Доброго времени суток!

Пытаюсь настроить такой же вывод, как у вас. Я не очень понимаю как создать страницу этих всех коментариев. А куда прописывать код с функцией?


avatar

Админ

Роман Жариков сказал 20-02-2017 в 05:16


А куда прописывать код с функцией?

В папке с темой создать файл page-comments, вот в нем уже пишете свой хтмл с функцией (передаете ей параметры, которые считаете нужными). По URL http://ваш_сайт.ру/comments будут открываться все комменты с пагинацией. Но перед этим в админке, руками надо создать страницу комментариев