Использование URL параметров для вывода записей из категории и пользовательской таксономии

1 июл. 2013 г., 21:02:11
Просмотры: 24.1K
Голосов: 4

Например, 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: Установка терминов по умолчанию для записей не является вариантом, так как мы можем добавить больше изданий позже.)


Решено, но...

Я разработал решение, которое вы можете увидеть в ответе на этот вопрос. Вознаграждение все еще действует, так что не стесняйтесь. :)

6
Комментарии

Я уверен, что это возможно (можно сделать через WP_Query, можно создать свой собственный WP_Query и даже можно создать пользовательские правила перезаписи для построения этого запроса). Однако я не уверен, что это будет работать "из коробки".

Krzysiek Dróżdż Krzysiek Dróżdż
1 июл. 2013 г. 21:21:40

@KrzysiekDróżdż Пока у меня есть гибкость с URL-параметрами, да.

its_me its_me
1 июл. 2013 г. 21:24:02

Вот информация о wp_query и таксономических запросах: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters Затем проверьте зарегистрированные query_vars (если параметр зарегистрирован - используйте его, если нет - добавьте свой собственный с помощью global $wp; $wp->add_query_var('author_more');

Krzysiek Dróżdż Krzysiek Dróżdż
1 июл. 2013 г. 21:44:39

@its_me, проблема в том, что ваш фильтр перезаписывает текущие таксономические запросы? Или он вообще не влияет на результаты?

Eric Holmes Eric Holmes
3 июл. 2013 г. 22:12:09

@EricHolmes Он вообще не влияет на результаты при использовании параметров URL, например, http://example.com/category/cars/?edition=usa

its_me its_me
3 июл. 2013 г. 22:14:34

@Milo 1. Думаю, is_tax( 'edition' ) работает нормально. Код в моем вопросе не работает только при использовании параметров URL category_name/edition. Так что, вероятно, условное выражение должно каким-то образом учитывать и категории. 2. Я не смог найти достаточно примеров в интернете, чтобы понять, как использовать posts_where. :-/

its_me its_me
4 июл. 2013 г. 11:17:41
Показать остальные 1 комментариев
Все ответы на вопрос 2
2

В обычных случаях, используя параметры 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

Дополнительные материалы:


НО...

Как объяснено в моем вопросе, мой случай сложный, поэтому я разработал простое обходное решение. Вот оно...

  1. Код из вопроса гарантирует, что если запись не назначена ни к одному изданию (т.е. если запись не привязана ни к одному термину таксономии '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/, делает то же самое.

  2. Вернемся к основной проблеме вопроса. Как вывести записи, принадлежащие определенной категории И изданию, используя параметры 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.

4 июл. 2013 г. 17:18:24
Комментарии

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

Matthew Boynes Matthew Boynes
6 июл. 2013 г. 20:13:04

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

its_me its_me
10 июл. 2013 г. 16:38:35
2
-3

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

4 июл. 2013 г. 02:37:03
Комментарии

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

Rarst Rarst
6 июл. 2013 г. 15:24:22

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

Greeso Greeso
6 июл. 2013 г. 21:31:54