Как понял из последних комментов на этом сайте, люди хотят вывести все комментарии пользователя, но как это сделать они не знают. Всвязи с этим, решил написать сей пост который решит данный вопрос.
Решать данную проблему будет по следующей схеме:
- Получим все комментарии пользователя из БД
- Выведем комментарии пользователя, обработав результат выборки через цикл
Таков примерный план.
Сразу будем оформлять все это дело в функцию, чтобы потом мы могли удобно ее использовать:
function all_comments_user(){ }
Итак, для того чтобы выбрать из БД все комментарии пользователя сделаем такой запрос:
function all_comments_user(){ global $wpdb; $curauth = (get_query_var('author_name')) ? get_user_by('slug', get_query_var('author_name')) : get_userdata(get_query_var('author')); $author_lk = $curauth->ID; $comments_user = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' ORDER BY comment_date DESC"); }
Так как мы будем использовать данный код на странице пользователя, то получаем данные об этом пользователе и выводим его ID в переменную $author_lk. Далее с помощью запроса к БД получаем все комментарии пользователя, используя эту переменную в качестве фильтра.
Ок, комментарии получили, теперь полученный результат надо прогнать через цикл и вывести таким образом комментарий за комментарием. Добавляем в нашу функцию вывод комментариев:
function all_comments_user(){ global $wpdb; $curauth = (get_query_var('author_name')) ? get_user_by('slug', get_query_var('author_name')) : get_userdata(get_query_var('author')); $author_lk = $curauth->ID; $comments_user = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' ORDER BY comment_date DESC"); if($comments_user){ $commentlist = '<div id="commentlist">'; $commentlist .= '<h3>Комментарии пользователя</h3>'; foreach($comments_user as $comment){ $commentlist .= '<div id="feed-comment-'.$comment->comment_post_ID.'" class="feedcomment">'; $commentlist .= '<h2 class="feed-title">к записи: <a href="'.get_permalink( $comment->comment_post_ID ).'">'.get_the_title($comment->comment_post_ID).'</a></h2> <small>'.mysql2date('j F Y G:i:s', $comment->comment_date).'</small>'; $commentlist .= '<div class="feed-content">'.$comment->comment_content.'</div>'; $commentlist .= '<p align="right"><a target="_blank" href="'.get_permalink( $comment->comment_post_ID ).'#comment-'.$comment->comment_ID.'">Ответить</a></p>'; $commentlist .= '</div>'; } $commentlist .= '</div>'; echo $commentlist; } }
Данный код уже рабочий и его можно использовать, но если остановиться тут, то на вашем сайте может возникнуть одна проблема и связана она будет с тем, что каждый раз когда будет загружаться страница этого пользователя из БД будут запрашиваться все его комментарии. А если у этого пользователя 100 тыс. комментариев?! Представьте какая нагрузка ляжет на ваш сервер. Ничего хорошего. Поэтому нам надо предусмотреть ограничение в количестве вывода комментариев пользователя. Я говорю о разбиении общего количества комментариев на несколько страниц. Если мы решим это реализовать, то нам надо будет подумать еще и о постраничной навигации между страницами комментариев пользователя.
Ну что ж, для начала нам надо решить сколько комментариев будет выводится на странице. Для этого введем переменную $inpage, в которой будем лежать максимально количество комментариев на одной странице.
Затем мы должны получить общее количество комментариев в БД этого пользователя. Для этого через запрос к БД посчитаем комментарии пользователя, а в запросе на выборку комментариев установим лимит на количество выборки:
$count_comments = $wpdb->get_var("SELECT COUNT(comment_ID) FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk'"); $comments_user = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' ORDER BY comment_date DESC LIMIT $start,$inpage");
В переменной $start будет находится количество комментариев которое надо пропустить перед выборкой, таким образом мы указываем с какого значения начинать выборку.
Потом считаем количество страниц, которое у нас получится с текущим значением переменной $inpage и общим количеством комментариев которое мы получили в переменную $count_comments.
$num_page = ceil($count_comments/$inpage);
И наконец, вставляем код постраничной навигации, который я написал ранее для использования в шорткодах плагина Wp-Recall:
if($inpage&&$count_comments>$inpage){ $url = get_author_posts_url($author_lk); $url = explode('?',$url); if($url[1]){ $redirect_url = get_author_posts_url($author_lk).'&'; }else{ $redirect_url = get_author_posts_url($author_lk).'?'; } $page_navi .= '<div class="user-navi">'; $next = $navi + 3; $prev = $navi - 4; if($prev==1) $page_navi .= '<a href="'.$redirect_url.'navi=1">1</a>'; for($a=1;$a<=$num_page;$a++){ if($a==1&&$a<=$prev&&$prev!=1) $page_navi .= '<a href="'.$redirect_url.'navi=1">1</a> ... '; if($prev<$a&&$a<=$next){ if($navi==$a) $page_navi .= '<span>'.$a.'</span>'; else $page_navi .= '<a href="'.$redirect_url.'navi='.$a.'">'.$a.'</a>'; } } if($next<$num_page&&$num_page!=$next+1) $page_navi .= ' ... <a href="'.$redirect_url.'navi='.$num_page.'">'.$num_page.'</a>'; if($num_page==$next+1) $page_navi .= '<a href="'.$redirect_url.'navi='.$num_page.'">'.$num_page.'</a>'; $page_navi .= '</div>'; } echo $page_navi;
Полный код нашей рабочей функции будет выглядеть так:
<?php function all_comments_user(){ global $wpdb; $curauth = (get_query_var('author_name')) ? get_user_by('slug', get_query_var('author_name')) : get_userdata(get_query_var('author')); $author_lk = $curauth->ID; $inpage = 5; if($_GET['navi']) $navi = $_GET['navi']; else $navi=1; $start = ($navi-1)*$inpage; $count_comments = $wpdb->get_var("SELECT COUNT(comment_ID) FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk'"); $comments_user = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' ORDER BY comment_date DESC LIMIT $start,$inpage"); $num_page = ceil($count_comments/$inpage); if($comments_user){ $commentlist = '<div id="commentlist">'; $commentlist .= '<h3>Комментарии пользователя</h3>'; foreach($comments_user as $comment){ $commentlist .= '<div id="feed-comment-'.$comment->comment_post_ID.'" class="feedcomment">'; $commentlist .= '<h2 class="feed-title">к записи: <a href="'.get_permalink( $comment->comment_post_ID ).'">'.get_the_title($comment->comment_post_ID).'</a></h2> <small>'.mysql2date('j F Y G:i:s', $comment->comment_date).'</small>'; $commentlist .= '<div class="feed-content">'.$comment->comment_content.'</div>'; $commentlist .= '<p align="right"><a target="_blank" href="'.get_permalink( $comment->comment_post_ID ).'#comment-'.$comment->comment_ID.'">Ответить</a></p>'; $commentlist .= '</div>'; } $commentlist .= '</div>'; echo $commentlist; if($inpage&&$count_comments>$inpage){ $url = get_author_posts_url($author_lk); $url = explode('?',$url); if($url[1]){ $redirect_url = get_author_posts_url($author_lk).'&'; }else{ $redirect_url = get_author_posts_url($author_lk).'?'; } $page_navi .= '<div class="user-navi">'; $next = $navi + 3; $prev = $navi - 4; if($prev==1) $page_navi .= '<a href="'.$redirect_url.'navi=1">1</a>'; for($a=1;$a<=$num_page;$a++){ if($a==1&&$a<=$prev&&$prev!=1) $page_navi .= '<a href="'.$redirect_url.'navi=1">1</a> ... '; if($prev<$a&&$a<=$next){ if($navi==$a) $page_navi .= '<span>'.$a.'</span>'; else $page_navi .= '<a href="'.$redirect_url.'navi='.$a.'">'.$a.'</a>'; } } if($next<$num_page&&$num_page!=$next+1) $page_navi .= ' ... <a href="'.$redirect_url.'navi='.$num_page.'">'.$num_page.'</a>'; if($num_page==$next+1) $page_navi .= '<a href="'.$redirect_url.'navi='.$num_page.'">'.$num_page.'</a>'; $page_navi .= '</div>'; } echo $page_navi; } } ?>
Вставляем данный код в файл functions.php используемого шаблона.
Теперь чтобы вывести комментарии пользователя на его странице нам надо просто удалить в файле author.php цикл вывода записей пользователя и вставить вместо него нашу функцию:
all_comments_user();
Вот в общем то и все)
Спасибо за статью, написали хорошо, но не все программисты. Я так понял что просто можно взять "Полный код нашей рабочей функции" и вставить в конец файла functions.php, а вот за файл author.php немного не знаю у меня там только это и все,
?php get_header(); ?
?php if(function_exists('wp_recall')) wp_recall(); ?
?php get_sidebar('top'); ?
?php get_sidebar('bottom'); ?
<?php get_footer();
И больше не чего нет, поясните, пожалуйста, как туда можно прописать all_comments_user(); ?
Все, кажись понял, просто нужно добавить так
поставить и добавить в author.php. Только он отображается не красиво, по левому краю прямо в крайней линии...
Спасибо Андрею, работает!
Для вас Иван, самое простое решение оторвать от края линии, это просто добавить код тот что в author.php, в таблицу по центру, в процентах по ширине допустим 98%, а остальное редактируйте в файле functions.php, допустим шрифт, размер или цвет текста...
значит не совсем верно выбрали место.
Круто) было бы неплохо замутить подобное во вкладке личного кабинета) помимо сообщений и отзывов отобразить и комментарии это было бы шикарно)
Спасибо за функцию. Работает замечательно. Искал именно с пагинацией (и вышел на нее из гуглопоиска "комментарии пользователя wordpress"), теперь встанет на замену моим 15-ти фиксированным комментариям 🙂
Андрей, измени только 2 строчки в sql запросе, чтобы он не выбирал из корзины комментарии.
Я добавил AND comment_approved = 1
В итоге:
$count_comments = $wpdb->get_var("SELECT COUNT(comment_ID) FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' AND comment_approved = 1");
$comments_user = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE user_id = '$author_lk' AND comment_approved = 1 ORDER BY comment_date DESC LIMIT $start,$inpage");
И еще дополнение: сейчас комментарии выводятся без учета параграфов и форматирования.
я заменил эту строку
echo $commentlist;
наecho nl2br($commentlist);
- текст комментария теперь выводится по параграфам.Прописывая дизайн списку комментариев, я обратил внимание что не переводит смайлы в картинки.
Решение - добавить следующий код код:
$commentlist = convert_smilies($commentlist);
например перед выводом:
echo nl2br($commentlist);
convert_smilies - стандартная вордпресс функция отвечающая как раз за конвертацию тестовых смайлов в картинки.
1. Если комментарий заканчивается картинкой - то произойдет наползание комментариев.
Чтобы исключить это найдите:
$commentlist .= '';
и замените на:
$commentlist .= '';
То-есть этим стилем вы запретите обтекание картинки.
2. У кого стоит плагин навигации wp-pagenavi предлагаю использовать его стили для навигации.
Находим участок кода:
$page_navi .= '';
$next = $navi + 3;
$prev = $navi - 4;
if($prev==1) $page_navi .= '1';
for($a=1;$a<=$num_page;$a++){
if($a==1&&$a<=$prev&&$prev!=1) $page_navi .= '1 ... ';
if($prev<$a&&$a<=$next){
if($navi==$a) $page_navi .= ''.$a.'';
else $page_navi .= ''.$a.'';
}
}
if($next<$num_page&&$num_page!=$next+1) $page_navi .= ' ... '.$num_page.'';
if($num_page==$next+1) $page_navi .= ''.$num_page.'';
$page_navi .= '';
и заменяем на мой вариант со стилями от плагина:
$page_navi .= '';
$next = $navi + 3;
$prev = $navi - 4;
if($prev==1) $page_navi .= '1';
for($a=1;$a<=$num_page;$a++){
if($a==1&&$a<=$prev&&$prev!=1) $page_navi .= '1...';
if($prev<$a&&$a<=$next){
if($navi==$a) $page_navi .= ''.$a.'';
else $page_navi .= ''.$a.'';
}
}
if($next<$num_page&&$num_page!=$next+1) $page_navi .= '...'.$num_page.'';
if($num_page==$next+1) $page_navi .= ''.$num_page.'';
$page_navi .= '';
А у кого нету этого плагина - вот и сами стили (нужно скопировать в style.css):
/* wp-pagenavi-start */
.wp-pagenavi {font-family:Sans-Serif;}
.wp-pagenavi a,.wp-pagenavi a:link,.wp-pagenavi a:visited {
border-top:1px solid #000;
color:#FFF;
background-color:#262626;
font-weight:700;
margin:2px 0;
padding:5px 8px;
}
.wp-pagenavi a:hover {
border-top:1px solid #000;
color:#000;
background-color:#dbcfae;
font-weight:700;
}
.wp-pagenavi span.pages {
color:#FFF;
border-top:1px solid #000;
background-color:#262626;
font-weight:700;
margin:2px 0;
padding:5px 8px;
}
.wp-pagenavi span.current {
border-top:1px solid #000;
color:#000;
background-color:#C1B799;
font-weight:700;
margin:2px 0;
padding:5px 8px;
}
.wp-pagenavi span.extend {
border-top:1px solid #000;
color:#FFF;
background-color:#262626;
font-weight:700;
margin:2px 0;
padding:5px 0;
}
.wp-pagenavi span.pages2 {
color:#FFF;
border-top:4px solid #262626;
background-color:#262626;
font-weight:700;
margin:2px 0;
padding:5px 8px;
}
/* wp-pagenavi-end */
текущая страница ещё и подсвечивается.
Картинку бы показал с дизайном навигации, да и вообще получившиеся комментарии, но не уверен что парсер пропустит ссылку.
В итоге, на основе функции от Андрея, я сделал симпатичную форму комментариев автора. Всем советую!
Мой ночной 3й комментарий не прошел, застрял видимо где-то в спаме. Хотя там без ссылок было...
Небольшой дополнение. Мне потребовалось вывести нумерацию у комментариев в обратном порядке. Например - всего автор имеет 191 комментарий. На первой странице верхний комментарий имеет номер 191, второй комментарий 190 и т.д. Естественно с работающей пагинацией.
Вам нужно вставить перед выводом заголовка записи, где-то здесь:
$commentlist .= 'к записи: comment_post_ID ).'">'.get_the_title($comment->comment_post_ID).'
следующий код:
if ($navi==1) {
$commentlist .= ''.$count_comments.''; $count_comments--;
}
else {
$commentlist .= ''.($count_comments-(($navi-1)*$inpage)).''; $count_comments--;
}
если вы на первой странице - количество комментариев просто вычитается, а если на последующих, то в помощь приходит математика 5-го класса.
а почему данная возможность не была реализована как часть плагина WP Recall? Действительно может быть весьма полезно выводить в личном кабинете все комментарии.
Пользователь Кос делал похожий аддон: http://codeseller.ru/products/vkladka-kommentarii-add-on/
Это я помню, но там какие-то проблемы были. Просто если все прописано, почему бы его не реализовать?
Столкнулся с необходимостью в чем-то подобном, но не совсем: нужно на странице Профиля либо рядом с логином юзера в дереве комментариев выводить счетчик комментариев конкретного юзера, может есть какое то готовое решение? перелопатил уже половину гугла, так и не смог разобраться, и плагинов, выполняющих эту функцию, тоже найти не получилось...
Счетчик комментариев пользователя - это не общее количество комментариев пользователя? А именно счетчик? По типу: 15 комментарий Васи, 16-й комментарий Васи? Такой счетчик?
А можно как-то сделать так, чтобы на отдельной странице выводились все последние комментарии пользователей, с пагинацией?
Возникла потребность в этом функционале. Данный код у меня не работал. Долго мучил чат GPT, в итоге всё получилось.
В файл functions.php добавляем
Затем в настройках плагина WP-Recall во вкладке "Менеджер вкладок" добавляем поле и вставляем туда шорткод [user_comments] и сохраняем.
Данный код у меня работает. В личном кабинете профиля, в новой вкладке, отображаются комментарии (отзывы), оставленные данным пользователем к посту или...
Гуру, не пинайте сильно, если есть идеи как этот код оптимизировать, предлагайте.
Просто не нашел решения, поэтому GPT!