17
Мар

Произвольные типы записей на архивных страницах

Очень часто возникает ситуация, когда при определенных обстоятельствах, в процессе разработки, приходится создавать пользовательские типы записей WordPress, для самых разных целей. Но, далеко не всегда, тема, установленная на сайте, поддерживает их отображение на страницах поиска, страницах категорий, тегов и тому подобных страниц, которые присутствуют, практически на каждом сайте. Очень часто приходится ссылаться на такие страницы с GET-параметром “post_type” и указанием в нем названия пользовательского типа записей, например:

// HTML CODE

<a href="http://itnyou.xyz/?post_type=my_custom_post_type">Текст ссылки</a>

Но такой вариант далеко не всегда устраивает вас(либо заказчика), т.к. всегда хочется избежать добавления лишних символов в адресную строку, особенно если в них нету особой необходимости, или, в принципе, архивные страницы должны отображать все типы записей, а не только один(по умолчанию всегда отображаются записи типа “post”). Очень просто решить проблему такого рода там, где используется кастомный вывод постов, то есть создается свой запрос WP_Query и уже с ним можно делать все, что захотите, но когда это нужно провернуть с уже созданным, стандартным запросом определенной страницы – не каждый сразу сможет сказать, что нужно делать, особенно если является новичком в разработке под WordPress.

Решение, на самом деле, элементарное. Нужно всего лишь добавить в конец файла functions.php следующий код:

// PHP CODE

add_action('pre_get_posts', function ($query) {
if ($query->is_category) {
$query->set('post_type', 'any');
}
return $query;
});

Если вы хоть немного разбираетесь в программировании и CMS WordPress, вы должны понимать принцип действия этого хука. Все основано на событии “pre_get_posts”, которое выполняется перед каждым запросом WP_Query. Переменная “$query”, которая передается в функцию, является объектом класса WP_Query, который можно легко модифицировать.
Конкретно в том примере, который приведен выше, изменение запроса происходит по условию. Мы сначала проверяем, является ли запрос, запросом со страницы-категории, после чего устанавливаем, используя функцию класса WP_Query “set”, значение “post_type” равным “any”, что, собственно, означает “любой”. То есть на страницах рубрик будут отображаться не только записи типа “post”, но и записи всех других типов записей, принадлежащих этой категории.
Данный пример можно модифицировать самыми различными способами, используя самые разные условия и самые разные модификация запроса WP_Query.