Usando parâmetros de URL, lista de postagens de categoria e taxonomia personalizada

Por exemplo, http://example.com/?cat=6&tag=books lista as postagens que pertencem à categoria ID 6 e os “livros” marcados (ou seja, postagens que satisfazem as duas condições).

Da mesma forma, http://example.com/feed/?cat=6&tag=books faz o mesmo para feeds.

Agora, digamos que meu blog tem uma taxonomia personalizada chamada ‘edição’, com termos ‘eua’, ‘Reino Unido’, ‘china’, e assim por diante, por baixo disso. O URL http://example.com/?edition=usa,china lista as postagens que pertencem às edições “EUA” e “China”.

E http://example.com/category/cars/?edition=usa lista as postagens da categoria ‘Carros’ que também pertencem ao termo de taxonomia personalizado ‘EUA’.

O problema

Eu uso o código abaixo em minhas funções.php:

 add_filter('pre_get_posts','better_editions_archive'); function better_editions_archive( $better_editions_query ) { /* Looks like this line needs to be changed, not sure how */ 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; } 

O código garante que, se uma postagem não for atribuída a qualquer edição (ou seja, se uma postagem não for atribuída a qualquer termo que pertence à “edição de taxonomia personalizada”), a publicação é mostrada / listada em todos os arquivos / feeds de termo do costume taxonomia ‘edição’.

Agora, http://example.com/category/cars/?edition=usa apenas lista as postagens que pertencem à categoria ‘carros’ e especificamente marcados ‘EUA’ (um termo que pertence à “edição de taxonomia personalizada”). Não mostra as postagens que não são atribuídas a qualquer termo na “edição” de taxonomia personalizada. Como faço para corrigir isso?

( PS: Definir termos padrão para postagens não é uma opção, pois podemos adicionar mais edições mais tarde.)


Resolvido, mas …

Eu resolvi uma solução que você pode ver como uma resposta a esta pergunta. A recompensa ainda permanece, então sinta-se livre. 🙂

Solutions Collecting From Web of "Usando parâmetros de URL, lista de postagens de categoria e taxonomia personalizada"

Em circunstâncias gerais, usando parâmetros de URL, você pode listar postagens que pertencem a uma categoria específica E uma taxonomia personalizada, assim:

 http://example.com/category/cars/?edition=usa 

Onde, category é a base de categoria que você está usando para categorias em seu site (Painel de WordPress> Configurações> Permalinks> Categoria base); edition é a base / slug da taxonomia personalizada; e os usa são um termo sob a taxonomia personalizada.

Se você quiser include mais de uma categoria / taxonomia personalizada, isso pode ajudar:

 http://example.com/category/cars/?edition=usa,india http://example.com/?category_name=cars,books&edition=usa,india 

E Feeds:

 http://example.com/category/cars/?edition=usa,india&feed=rss2 http://example.com/?category_name=cars,books&edition=usa,india&feed=rss2 

Leitura adicional:


MAS…

Como explicado na minha pergunta, o meu é um caso complexo, então desenvolvi um trabalho simples. Aqui vai …

  1. O bloco de código na pergunta garante que, se uma postagem não for atribuída a qualquer edição (ou seja, se uma postagem não for atribuída a qualquer termo que pertença à “edição de taxonomia personalizada”), a publicação é mostrada / listada em todos os arquivos / feeds da “edição” de taxonomia personalizada.

    MAS AGORA , eu removi esse código. Em seguida, criou um novo termo sob a “edição” de taxonomia personalizada, chamada ‘intl’ (Internacional). Qualquer postagem que queira ser exibida em todas as Edições será atribuída a ‘intl’. Mas como faço para ter certeza de que todas as postagens atribuídas a ‘intl’ aparecem em todos os arquivos / feeds de minha taxonomia personalizada?

    Para isso, agora uso este código (vai em 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; } 

    Então, agora, por exemplo, http://example.com/edition/usa/ lista as postagens que pertencem a “EUA” ou “intl” (que são termos na minha edição de taxonomia personalizada). Seu feed, http://example.com/edition/usa/feed/ faz o mesmo.

  2. Voltar ao problema principal da questão. Como faço para listar posts que pertencem a uma categoria específica E uma edição usando parâmetros de URL?

    Por exemplo, como faço para listar posts pertencentes à categoria ‘carros’ E edição ‘EUA’?

    Este é o aspecto do URL: http://example.com/category/cars/?edition=usa,intl (uma vez que também queremos as postagens que são mostradas em todas as edições, ou seja, as postagens atribuídas ao termo ‘intl’) . Quanto aos feeds: http://example.com/category/cars/feed/?edition=india,intl

É isso aí!

(Agradecimentos especiais a @kaiser por sua ajuda.)


Notas

Se você deseja estritamente modificar a consulta / loop principal dentro do modelo, por exemplo, taxonomy-edition.php (no meu caso), aqui está um exemplo sobre como ele pode ser feito:

 < ?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 /* Blah, Blah, Blah! */ ?> < ?php if ( $better_editions->have_posts() ) : ?> < ?php /* Start the Loop */ ?> < ?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 /* Blah, Blah, Blah! */ ?> < ?php endif; ?> 

No entanto, a menos que você realmente, realmente precisa, vá com pre_get_posts .

Você pode ter que procurar usando wp_query. no qual você configura sua própria consulta para exibir qualquer categoria que você gosta e, quando terminar, reajuste-a para o comportamento padrão.