Данная задача встала передо мной не сразу целиком, а по частям. Сначала я искал способ как выводить записи (архив) с помощью произвольного шаблона, поскольку встроенный шаблон виджетов Posts и Portfolio не устраивал.
Вывод записей в произвольном виде
Например виджет Posts имеет конкретную задачу: выводить список постов. А если нам нужно вывести не список постов, а пользовательские типы? Например квартиры. Нам же захочется в списке квартир показать какие-то характерные подробности, например площадь, количество комнат и т.д.
Серьезной находкой для меня стал плагин Ele Custom Skin, с виду простенький, но невероятно крутой. Именно он решает эту задачу. Создаем шаблон в разделе Loop, потом при создании страницы добавляем виджет Posts, а там во вкладке «Макет» выбираем в списке «Обложка» пункт «Custom».

После того, как мы выберем «Custom», то у нас появится ещё один список. Это будет список шаблонов.

Выбираем нужный шаблон и теперь список записей отображается в том виде, в котором мы захотим.
Связанные типы записей
Теперь представим что у нас есть задача чуть сложнее. Мы можем вывести список записей в любом виде, а как вывести связанные записи?
Допустим у нас есть два типа записей «Специалисты» и «Отзывы». У каждого специалиста своя страница, на которой должны отображаться отзывы, которые добавлены для этого конкретного специалиста. Тут мы имеем уже, грубо говоря, вложенность.
С этой задачей нам поможет справится плагин «Advanced Custom Fields». С помощью этого плагина мы добавим к отзывам поле типа «Объект записи».

В поле «Фильтрация по типу записи» выбираем нужный тип записи. В нашем случае выбрать нужно «Специалисты». Возвращаемый формат выбираем ID записи. Таким образом при добавлении отзыва мы будем выбирать специалиста, для которого добавляется отзыв.
Теперь нам нужно на странице шаблона «Специалисты» добавить виджет Posts, там во вкладке
Теперь нам нужно на странице шаблона «Специалисты» добавить виджет Posts, там во вкладке
Теперь нам нужно на странице шаблона «Специалисты» добавить виджет Posts, там во вкладке «Запрос» выбираем тип записи «Отзывы», а в строке «ID запроса» указываем нужный нам ID. Пусть это будет «get_testimonials».
Теперь нам нужно добавить хук, который будет модифицировать наш запрос в зависимости от того, страницу какого специалиста просматривает пользователь. Для этого нужно добавить небольшой PHP-код.
add_action( 'elementor/query/get_testimonials', function( $query ) {
global $post;
$meta_query = $query->get( 'meta_query' );
if ( ! is_array( $meta_query ) ) {
$meta_query = array();
}
$meta_query[] = array(
'key' => 'специалист',//идентификатор поля ACF
'value' => $post->ID
);
$query->set( 'meta_query', $meta_query );
});
Вот и все. Теперь к запросу будет добавляться уточнение в виде идентификатора записи специалиста и запрос вернет отзывы именно для этого специалиста.
Мне это решение кажется вполне изящным и довольно удобным.