# Функция для отображения последних комментариев
Комментарии в 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 пикселей: