Как отфильтровать посты в WordPress по URL? (query_posts)

Год назад задался вопросом, а можно ли отфильтровать посты в WordPress по URL? Указать параметры запроса и получить результат. Мне сказали что можно делать запросы вида:

  • /tag/a+b+c = отбор постов, которые соответствуют всем 3-м меткам
  • /tag/a,b,c = отбор постов, которые соответствуют одной из 3-х меток

Но вопрос был чуть иной, а можно ли делать отбор по нескольким таксономиям, будь то категории или любая другая, или даже по метаполям? Вопрос остался без ответа…

Сегодня разбирались с одним из сайтов, в котором запросы были сделаны криво, через прямые SQL-запросы, минуя API WordPress, с нарушением рекомендаций кодекса.

Изучив еще раз описание функции query_posts (оно же на русском), до меня дошло что все этим параметры мы можем указывать в URL. Лучше поздно, чем никогда 🙂

Мы можем варьировать свой запрос постов как угодно, подставляя параметры в URL.

Рассмотрим на примере этого сайта:

1. Давайте выберем все посты с рубрики Новости. По slug, из инструкции мы видим что это переменная category_name. Получим URL вида https://wpcraft.ru/category/novosti

2. А что если нам нужно получить посты, которые кроме Новости относятся к рубрике «Плагины»? Получим https://wpcraft.ru/category/novosti+plaginyi-wordpress/ — получаем уже меньшее число постов.

3. А что если нам и этого мало? И мы хотим еще добавить отбор по метке «Формы»? Ну чтобы получить все посты, на тему: Как сделать? и метка WooCommerce? Получаем URL https://wpcraft.ru/category/kak-sdelat/?tag=woocommerce — еще меньше записей.

Если в конструкции https://wpcraft.ru/category/novosti+plaginyi-wordpress/ плюс заменить на запятую и сделать https://wpcraft.ru/category/novosti,plaginyi-wordpress/ то результат будет чуть иным. Теперь система отберет посты у которых есть термин novosti или plaginyi-wordpress. В первом случае было условие «и».

Все это прописано в кодексе касательно функции query_posts. Весь фокус в том что почти все этим параметры доступны для передачи в URL.

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *