Функция для отображения последних комментариев WordPress

# Функция для отображения последних комментариев

Комментарии в WordPress можно извлекать из базы данных с помощью функции get_comments(). Давайте начнем с простого примера, который покажет вам, как получить последние 10 комментариев.

## Получение последних комментариев в списке

Этот код извлекает 10 последних комментариев и выводит их в виде списка. Текст каждого комментария сокращается до 50 символов и ссылается на сам комментарий:

```php
$args = array(
    'number'  => 10, // количество комментариев
    'orderby' => 'comment_date', // сортировка по дате комментария
    'order'   => 'DESC', // порядок (по убыванию)
    'status'  => 'approve', // показывать только одобренные комментарии
    'type'    => 'comment', // только комментарии, без трекбеков и пингов
);

if( $comments = get_comments( $args ) ){
    echo '
    '; foreach( $comments as $comment ){ $comm_link = get_comment_link( $comment->comment_ID ); // ссылка на комментарий $comm_short_txt = mb_substr( strip_tags( $comment->comment_content ), 0, 50 ) .'...'; echo '
  • '. $comment->comment_author .': '. $comm_short_txt .'
  • '; } echo '
'; }

Объект комментария

/*
$comment = stdClass Object
(
    [comment_ID] => 9727
    [comment_post_ID] => 477
    [comment_author] => Andrew
    [comment_author_email] => example@email.com
    [comment_author_url] =>
    [comment_author_IP] => 178.45.177.200
    [comment_date] => 2015-22-01 00:27:04
    [comment_date_gmt] => 2015-22-28 21:27:04
    [comment_content] => текст коммента
    [comment_karma] => 0
    [comment_approved] => 1
    [comment_agent] => Mozilla/5.0
    [comment_type] =>
    [comment_parent] => 9724
    [user_id] => 313
)
*/

Вы можете изменять этот код под свои нужды. Если этот способ вам не подходит, ниже описан другой вариант.

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

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

/**
 * Функция для отображения последних комментариев в WordPress.
 * вер: 0.2
 */
function kama_recent_comments( $args = array() ){
    global $wpdb;

    $def = array(
        'limit'      => 10, // количество комментариев для отображения
        'ex'         => 45, // количество символов. Сокращение текста комментария
        'term'       => '', // ИД категорий/меток для включения или исключения
        'gravatar'   => '', // размер иконки Gravatar в пикселях
        'user'       => '', // ИД пользователей для включения или исключения
        'echo'       => 1,  // выводить на экран (1) или возвращать (0)
        'comm_type'  => 'comment', // тип комментария
        'meta_query' => '', // WP_Meta_Query
        'meta_key'   => '', // WP_Meta_Query
        'meta_value' => '', // WP_Meta_Query
        'url_patt'   => '', // оптимизация ссылок на комментарии
    );

    $args = wp_parse_args( $args, $def );
    extract( $args );

    $AND = '';

    // Обработка категорий
    if( $term ){
        $cats = explode( ',', $term );
        $cats = array_map( 'intval', $cats );

        $CAT_IN = ( $cats[ key($cats) ] > 0 );

        $cats = array_map( 'absint', $cats ); // убираем отрицательные значения
        $AND_term_id = 'AND term_id IN ('. implode(',', $cats) .')';

        $posts_sql = "SELECT object_id FROM $wpdb->term_relationships rel
        LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id) WHERE 1 $AND_term_id ";

        $AND .= ' AND comment_post_ID '. ($CAT_IN ? 'IN' : 'NOT IN') .' ('. $posts_sql .')';
    }

    // Обработка пользователей
    if( $user ){
        $users = explode(',', $user );
        $users = array_map('intval', $users );

        $USER_IN = ( $users[ key($users) ] > 0 );

        $users = array_map('absint', $users );

        $AND .= ' AND user_id '. ($USER_IN ? 'IN' : 'NOT IN') .' ('. implode(',', $users) .')';
    }

    // WP_Meta_Query
    $META_JOIN = '';
    if( $meta_query || $meta_key || $meta_value ){
        $mq = new WP_Meta_Query( $args );
        $mq->parse_query_vars( $args );
        if( $mq->queries ){
            $mq_sql = $mq->get_sql('comment', $wpdb->comments, 'comment_ID' );
            $META_JOIN = $mq_sql['join'];
            $AND .= $mq_sql['where'];
        }
    }

    $sql = $wpdb->prepare("SELECT * FROM $wpdb->comments LEFT JOIN $wpdb->posts ON (ID = comment_post_ID ) $META_JOIN
    WHERE comment_approved = '1' AND comment_type = %s $AND ORDER BY comment_date_gmt DESC LIMIT %d", $comm_type, $limit );

    $results = $wpdb->get_results( $sql );

    if( ! $results )
        return 'Нет комментариев.';

    // Формирование HTML
    $out = $grava = '';
    foreach ( $results as $comm ){
        if( $gravatar )
            $grava = get_avatar( $comm->comment_author_email, $gravatar );

        $comtext = strip_tags( $comm->comment_content );
        $com_url = $url_patt ? sprintf( $url_patt, $comm->guid, $comm->comment_ID ) : get_comment_link( $comm->comment_ID );

        $length = (int) mb_strlen( $comtext );
        if( $length > $ex )
            $comtext = mb_substr( $comtext, 0, $ex ) .' …';

        $out .= '
        
  • '. $grava .' '. strip_tags( $comm->comment_author ) .': '. $comtext .'
  • '; } if( $echo ) return print $out; return $out; }

    Примеры использования

    1. Отображение последних комментариев

    Чтобы отобразить последние комментарии, используйте следующий код:

    • 10 - количество комментариев для отображения.
    • 40 - максимальная длина текста комментария в символах (после удаления HTML-тегов).

    2. Комментарии для постов из указанных категорий/меток

    Вы также можете включать или исключать комментарии для постов из определенных категорий или меток. Для этого используйте параметр term с указанием ИД категорий (их можно найти в разделе "категории" в админке). Для исключения добавьте "-" перед ИД:

    Этот код отобразит 10 ��омментариев с длиной текста до 40 символов для постов из категорий 5, 10 и 34. Чтобы исключить эти категории, вызовите функцию следующим образом:

    Этот код отобразит 10 комментариев для всех постов, кроме тех, что из категорий 5, 10 и 34.

    Важно: Невозможно одновременно включить и исключить категории.

    3. Возврат результата

    Если вы хотите вернуть результат для дальнейшей обработки в PHP (вместо отображения на экране), установите параметр echo в 0:

    4. Аватары

    Если хотите отображать аватары пользователей из сервиса Gravatar, укажите размер аватарки, например, 20 - активирует отображение аватаров размером 20x20 пикселей:

    Leave a Reply

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