Использование URL параметров для вывода записей из категории и пользовательской таксономии
Например, http://example.com/?cat=6&tag=books
выводит записи, которые принадлежат категории с ID 6 и имеют тег 'books' (т.е. записи, удовлетворяющие обоим условиям).
Аналогично, http://example.com/feed/?cat=6&tag=books
делает то же самое для лент.
Допустим, в моем блоге есть пользовательская таксономия под названием 'edition' с терминами 'usa', 'uk', 'china' и так далее. URL http://example.com/?edition=usa,china
выводит записи, которые принадлежат обоим изданиям 'usa' и 'china'.
А http://example.com/category/cars/?edition=usa
выводит те записи из категории 'Cars', которые также принадлежат термину 'usa' пользовательской таксономии.
Проблема
Я использую следующий код в моем functions.php:
add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {
/* Похоже, эту строку нужно изменить, но не уверен как */
if ( $better_editions_query->is_tax( 'edition' ) && $better_editions_query->is_main_query() ) {
$better_editions_terms = get_terms( 'edition', array( 'fields' => 'ids' ) );
$better_editions_query->set( 'post_type', array( 'post' ) );
$better_editions_query->set( 'tax_query',
array(
'relation' => 'OR',
array(
'taxonomy' => 'edition',
'field' => 'id',
'terms' => $better_editions_terms,
'operator' => 'NOT IN'
)
)
);
}
return $better_editions_query;
}
Код гарантирует, что если запись не назначена ни одному Изданию (т.е. если запись не назначена ни одному термину, принадлежащему пользовательской таксономии 'edition'), запись отображается/перечисляется во всех архивах терминов/лентах пользовательской таксономии 'edition'.
Сейчас http://example.com/category/cars/?edition=usa
выводит только записи, которые принадлежат категории 'cars' и специально помечены как 'usa' (термин, принадлежащий пользовательской таксономии 'edition'). Он не показывает те записи, которые не назначены ни одному термину в пользовательской таксономии 'edition'. Как это исправить?
(PS: Установка терминов по умолчанию для записей не является вариантом, так как мы можем добавить больше изданий позже.)
Решено, но...
Я разработал решение, которое вы можете увидеть в ответе на этот вопрос. Вознаграждение все еще действует, так что не стесняйтесь. :)

В обычных случаях, используя параметры URL, вы можете вывести записи, которые принадлежат определенной категории И пользовательской таксономии, например так:
http://example.com/category/cars/?edition=usa
Где category
— это база категорий, используемая на вашем сайте (WordPress Dashboard → Настройки → Постоянные ссылки → Префикс рубрик); edition
— это база/ярлык пользовательской таксономии; а usa
— термин внутри этой таксономии.
Если нужно включить несколько категорий или пользовательских таксономий, могут помочь такие варианты:
http://example.com/category/cars/?edition=usa,india
http://example.com/?category_name=cars,books&edition=usa,india
И фиды:
http://example.com/category/cars/?edition=usa,india&feed=rss2
http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2
Дополнительные материалы:
НО...
Как объяснено в моем вопросе, мой случай сложный, поэтому я разработал простое обходное решение. Вот оно...
Код из вопроса гарантирует, что если запись не назначена ни к одному изданию (т.е. если запись не привязана ни к одному термину таксономии 'edition'), она будет отображаться во всех архивах/фидах таксономии 'edition'.
НО ТЕПЕРЬ я убрал этот код. Затем создал новый термин в таксономии 'edition' под названием 'intl' (International). Любая запись, которую нужно отображать во всех изданиях, будет привязана к 'intl'. Но как гарантировать, что записи с 'intl' появятся во всех архивах/фидах моей таксономии?
Для этого я использую такой код (добавляется в functions.php):
add_filter('pre_get_posts','better_editions_archive'); function better_editions_archive( $query ) { if ( $query->is_tax( 'edition' ) && $query->is_main_query() ) { $query->set( 'post_type', array( 'post' ) ); $query->set( 'tax_query', array( 'relation' => 'OR', array( 'taxonomy' => 'edition', 'field' => 'slug', 'terms' => 'intl', 'operator' => 'IN' ) ) ); } return $query; }
Теперь, например,
http://example.com/edition/usa/
выводит записи, принадлежащие либо 'usa', либо 'intl' (терминам таксономии 'edition'). Его фид,http://example.com/edition/usa/feed/
, делает то же самое.Вернемся к основной проблеме вопроса. Как вывести записи, принадлежащие определенной категории И изданию, используя параметры URL?
Например, как вывести записи категории 'cars' И издания 'usa'?
Вот как должен выглядеть URL:
http://example.com/category/cars/?edition=usa,intl
(поскольку мы также хотим записи, отображаемые во всех изданиях, т.е. привязанные к термину 'intl'). Для фидов:http://example.com/category/cars/feed/?edition=india,intl
Вот и всё!
(Особая благодарность @kaiser за помощь.)
Примечания
Если нужно строго модифицировать основной запрос/цикл прямо в шаблоне, например, taxonomy-edition.php (в моем случае), вот пример, как это можно сделать:
<?php
$edition_term = get_term( get_queried_object(), 'edition' )->slug;
$better_editions = new WP_Query(
array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'edition',
'field' => 'slug',
'terms' => array( $edition_term, 'intl' )
)
)
)
);
?>
<?php /* Бла-бла-бла! */ ?>
<?php if ( $better_editions->have_posts() ) : ?>
<?php /* Начало цикла */ ?>
<?php while ( $better_editions->have_posts() ) : $better_editions->the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; wp_reset_postdata(); ?>
<?php else : ?>
<?php /* Бла-бла-бла! */ ?>
<?php endif; ?>
Тем не менее, если нет крайней необходимости, лучше использовать pre_get_posts
.

Я не совсем понимаю, в чем именно у вас трудности. Вы говорите в своем ответе: "используя параметры URL, вы можете выводить записи, принадлежащие к определенной категории И пользовательской таксономии, вот так...", а затем: "Вернемся к основной проблеме вопроса. Как мне вывести записи, принадлежащие к определенной категории И изданию, используя параметры URL?" Не могли бы вы объяснить (кратко, моя способность концентрироваться оставляет желать лучшего), с чем именно вам нужна помощь?

@MatthewBoynes Я четко указал в начале второй части своего ответа: "Как объяснено в моем вопросе, у меня сложный случай..." То есть я использовал код (см. вопрос), который "гарантирует, что если запись не назначена ни к одному Изданию (т.е. если запись не привязана ни к одному термину из пользовательской таксономии 'edition'), запись будет отображаться/выводиться во всех архивах/лентах терминов пользовательской таксономии 'edition'". Теперь понятнее? :)

Данный код уже работает с основным запросом. Как создание дополнительного запроса поможет решить вопрос?

Я думал о создании нового запроса, который будет учитывать как основной запрос из вопроса, так и всё, что не отображается. Я не предоставил код, потому что предполагал, что мой ответ даст достаточное руководство для человека, задавшего вопрос. Очевидно, что такой подход понравился не всем, однако я сам его использовал, и он работает отлично.
