В WordPress есть штатные средства получения записей из конкретной рубрики. Но, как поступить, если они по каким либо причинам не устраивают разработчика и необходимо реализовать собственные?
Для этого требуется, прежде всего, получить записи конкретной рубрики из базы данных WordPress (БД).
В старых версиях WordPress данная задача решалась предельно просто, так как записи и рубрики были связаны напрямую через поле category. В новых версиях всё иначе.
Полное описание структуры БД приведено в документации. Для решения данной задачи потребуются только 4 из них
- wp_posts – в ней, собственно, и хранятся записи;
- wp_terms – в ней хранятся рубрики и метки (теги);
- wp_term_taxonomy – В ней находится таксономия записей из таблицы terms;
- wp_term_relationships – хранит данные о связях записей из term_taxonomy и posts.
Для того чтобы упростить написание и без того громоздкого и сложного запроса, на первых стадиях решения задачи не будем выбирать из результирующего набора данных конкретные поля. Это будет сделано позднее, когда будет написан уже готовый запрос. Цель данной статьи проиллюстрировать, в первую очередь, саму логику получения необходимых данных.
В начале, необходимо получить те записи из таблицы wp_terms, которые являются категориями. Для этого напишем запрос, который будет на основе данных из двух таблиц wp_terms и wp_term_taxonomy отбирать только те записи, которые имеют соответствующую таксономию.
1 2 3 |
SELECT * FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id WHERE t2.taxonomy='category'; |
В результате выполнения этого запроса у нас останутся только категории. Теперь необходимо связать полученные данные с таблицей wp_term_relationships. Это делается довольно просто.
1 2 3 4 |
SELECT * FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id WHERE t2.taxonomy='category'; |
После этого аналогичным образом осуществляется связь с таблицей wp_posts.
1 2 3 4 5 |
SELECT * FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id WHERE t2.taxonomy='category'; |
Таким образом, получен набор данных, в котором присутствуют как сведения о самих записях, так и информация о рубриках, к которым они относятся.
Всё, что осталось сделать, это отобрать записи, принадлежащие к определённой конкретной рубрике (например, по id) и вывести необходимые поля. В данном случае, для примера, выведем поля, которые содержат название, дату и непосредственно содержание записи для рубрики с id=1.
1 2 3 4 5 |
SELECT `post_title`,`post_date`, `post_content` FROM `wp_terms` AS `t1` INNER JOIN `wp_term_taxonomy` AS `t2` ON t1.term_id=t2.term_id INNER JOIN `wp_term_relationships`AS t3 ON t2.term_taxonomy_id=t3.term_taxonomy_id INNER JOIN `wp_posts` AS t4 ON t4.ID=t3.object_id WHERE t2.taxonomy='category' AND t1.term_id=1; |
Как вывести посты предыдущий и следующий относящийся к определенной категории которая прописана в url поста «домен.ру/новости/какая-то-новость» вот «какая-то-новость» может принадлежать еще к нескольким категориям и как получить следующую новость чтобы у нее в url была категория «новости»?
Данный вопрос, к сожалению, не совсем соотносится с темой данной статьи, т.к. решается при помощи стандартных функций WordPress API. А, именно: next_post_link и previous_post_link. Просто в параметре $excluded_terms перечисляете id категорий, которые не нужно учитывать при поиске.