Как в WordPress выводить комментарии в обратном порядке?

Стандартно в WordPress комментарии выводятся следующим образом: сначала перый, а уже затем все остальные. Это не всегда удобно. Если вы хотите, чтобы сначала выводились более свежие комментарии, то вы попали по адресу и ниже найдёте подробную инструкцию по настройке.

К сожалению, этого функционала нет в личном кабинете сайта. Придётся вносить изменения непосредственно в файлы сайта.

Вывод комментариев в обратном порядке

Но не спешите расстраиваться, всё достаточно просто. Находим файл functions.php, который размещён в папке wp-content/themes/ВАША_ТЕМА. Открываем его и в его конце перед ?> добавляем строчку:

1
2
3
add_filter ('comments_array', function ($comments) {
	return array_reverse($comments);
});

Обратите внимание, что функция анонимная, соответствует PHP версии выше 5.2.

Если настройки обсуждения оставлены стандартные и на первой страницы выводятся более ранние комментарии, то этого фильтра выше будет достаточно для вывода комментов в обратном порядке.

Но если у вас включена пагинация (группировка комментариев по 10 штук на странице и нумерование страниц комментариев), то сразу вылезет проблема. После отправки комментария автор комментария будет переадресовываться на неправильную страницу. На первую вместо последней и наоборот.

Исправляем функцию get_page_of_comment

Виной всему функция get_comment_link. Она генерирует ссылку на комментарий по его ID. А если включена пагинация комментариев, то используется функция get_page_of_comment, для генерации номера страницы комментариев. Эти функции не используют фильтр comments_array, который использовали мы для вывода комментариев, поэтому и ссылка генерируется неверная. Все функции WP (в т.ч. редирект на страницу нового комментария), все плагины (recent comments and etc.), все хуки (крюки), которые используют get_comment_link для получения ссылки на комментарий будут работать неправильно.

Функция get_comment_link находятся в файле wp-includes/comment-template.php. У неё есть свой фильтр

1
apply_filters( 'get_comment_link', $link, $comment, $args );

и самым правильным решением было бы использование этого фильтра для переделки ссылки на комментарий, но это также бы означало дублирование функции get_page_of_comment. То есть как минимум один лишний запрос к базе на каждый вызов get_comment_link. А это создаёт дополнительную нагрузку, что может сказаться на скорости загрузки страницы.

У get_page_of_comment сейчас фильтров нет. В версиях WP выше 4.4 get_page_of_comment также обзаведётся своим фильтром, и всё можно будет сделать рациональнее. Но если версия более старая, то придётся лезть в код wp-includes/comment.php, где лежит get_page_of_comment. В конец функции вносим следующие изменения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	/**
	 * Azz
	 * Все это из-за реверсных комментов
	 *
	 */
	// Count comments older than this one
//	$oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt < '%s'" . $comtypewhere, $comment->comment_post_ID, $comment->comment_date_gmt ) );
	$oldercoms = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = 0 AND comment_approved = '1' AND comment_date_gmt > '%s'" . $comtypewhere, $comment->comment_post_ID, $comment->comment_date_gmt ) );
 
	// No older comments? Then it's page #1.
//	if ( 0 == $oldercoms)
	if ( 0 == $oldercoms || ($oldercoms - 1) < 1)
		return 1;
 
	// Divide comments older than this one by comments per page to get this comment's page number
//	return ceil( ( $oldercoms + 1 ) / $args['per_page'] );
	return ceil( ( $oldercoms - 1 ) / $args['per_page'] );
 
	/**
	 * - Azz
	 */

В код добавлены комментарии к строкам кода. С таким костылем все прекрасно работает.

Но имейте ввиду, что при обновлении WP настройки вернуться к стандратному виду.

 

Tags:

Всего отзывов: 1

Оставить отзыв »

 
  • Допустим, вы владелец нового сайта, который имеет приятный современный дизайн, удобную навигацию и полезную для участников информацию. Но на сайт ни кто не заходит. Что делать? Если у вас есть собственный бизнес мы поможем вам создать продающийся сайт. Ясное дело, ни одно реальное или виртуальное предприятие не может продвигаться независимо. Всякой любой компании надлежит подмога в приобретении известности, а во Мировой компьюторной паутине без нее категорически не обойтись из-за бурной конкурентной борьбы.Мы занимаемся разработкой электронной коммерцией.

    Мы всегда готовы запустить полноценный интернет сайт в течение пяти рабочих дней. Не беря в расчет предоставления полных web-сайтов, мы оказываем служба технической поддержки: своевременное продление хостинга и доменного имени, добавление контента на веб-сайт, публикация новостей. Наши услуги дадут возможность вам стать лидером на горизонтах всемирной паутины.

    продвижение сайта в гугл цена. — seo продвижение сайтов в сша

     
     
     
Добавить отзыв