Публикация в группе: Полезное для WordPress

Как понял из последних комментов на этом сайте, люди хотят вывести все комментарии пользователя, но как это сделать они не знают. Всвязи с этим, решил написать сей пост который решит данный вопрос.

Решать данную проблему будет по следующей схеме:

  1. Получим все комментарии пользователя из БД
  2. Выведем комментарии пользователя, обработав результат выборки через цикл

Таков примерный план.

Сразу будем оформлять все это дело в функцию, чтобы потом мы могли удобно ее использовать:

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();

Вот в общем то и все)

61

Автор публикации

не в сети 15 часов

Андрей CS

12K
рассматриваю задания
Комментарии: 2744Публикации: 481Регистрация: 30-11--0001Продаж/Покупок: 0/0