У 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».
Далі йде запит, який складається з двох частин:
- Основний запит — вибірка даних з таблиці постів.
- Підзапит з обмеженням «INNER JOIN», який дозволяє виводити лише ті пости, які мають коментарі. У підзапиті ми обираємо пости з останнім (найновішим) коментарем. Для цього використовується функція «MAX()». А для з’єднання підзапиту з основним — у вибірку додається поле «comment_post_ID».
За допомогою «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() та багато інших.
