Як у WordPress вивести пости відсортовані за останніми коментарями

Як у WordPress вивести пости відсортовані за останніми коментарями

У WordPress є універсальна функція «get_posts», але, на жаль, вона не підходить у 100% випадків. Іноді, щоб отримати потрібний результат, доводиться формувати SQL-запит вручну. Я не дуже люблю це робити, оскільки мені невідомі всі тонкощі та нюанси внутрішньої роботи WP (де і в яких випадках краще застосовувати фільтри). Але задачу потрібно реалізувати — отже, доводиться писати власний SQL.

Цього разу потрібно було вивести список постів, відсортувавши їх так, щоб пост із останнім доданим і схваленим коментарем відображався першим. Чим свіжіший коментар — тим вище пост у списку.

Для цього пишемо наступний SQL-запит та PHP-код:

global $wpdb;

$sql = "SELECT `p`.ID, `cl`.`comment_date_last`
FROM {$wpdb -> posts} `p`
INNER JOIN (
	SELECT `comment_post_ID`, MAX(comment_date) `comment_date_last`
	FROM {$wpdb -> comments} `c`
	WHERE `comment_approved` = 1
	GROUP BY `comment_post_ID`
) `cl`
ON (`cl`.`comment_post_ID`=`p`.`ID`)
WHERE `p`.post_type = 'post'
AND `p`.post_status = 'publish'
ORDER BY `comment_date_last` DESC";
$posts_ar = $wpdb -> get_results($sql, ARRAY_A);

foreach($posts_ar as $post_ar):
	echo $post_ar['ID'];
	/* … */
endforeach;

Перше, що нам потрібно — викликати глобальний об'єкт для роботи з БД у WordPress — «$wpdb».

Далі йде запит, який складається з двох частин:

  1. Основний запит — вибірка даних з таблиці постів.
  2. Підзапит з обмеженням «INNER JOIN», який дозволяє виводити лише ті пости, які мають коментарі. У підзапиті ми обираємо пости з останнім (найновішим) коментарем. Для цього використовується функція «MAX()». А для з’єднання підзапиту з основним — у вибірку додається поле «comment_post_ID».
Порада
Зверніть увагу: ми можемо використовувати функцію «COUNT()», якщо потрібно відсортувати пости за кількістю коментарів.

За допомогою «WHERE» ми обмежуємо вибірку в основному запиті лише постами (`p`.post_type = 'post') зі статусом «publish» (`p`.post_status = 'publish'). І, звісно ж, сортуємо все за датами коментарів: «ORDER BY `comment_date_last` DESC».

Список постів виводимо через PHP-цикл «foreach»:

foreach($posts_ar as $post_ar):
	echo $post_ar['ID'];
	/* … */
endforeach;

У коді вище ми лише виводимо на екран ID поста. Але цей ID можна передавати у будь-які WP-функції, такі як — get_the_title(), get_permalink() та багато інших.

Пости на схожі теми

З вашим WordPress сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *