Usando parâmetros de URL, liste as postagens da categoria e da taxonomia personalizada

4

Por exemplo, http://example.com/?cat=6&tag=books lista as postagens que pertencem ao ID da categoria 6 e as marcadas como "livros" (ou seja, publicações 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 tenha uma taxonomia personalizada chamada 'edição', com os termos 'usa', 'uk', 'china' e assim por diante. O URL http://example.com/?edition=usa,china lista as postagens que pertencem às duas edições "usa" e "china".

E http://example.com/category/cars/?edition=usa lista as postagens da categoria "Carros" que também pertencem a o termo de taxonomia personalizada "usa".

O problema

Eu uso o código abaixo em my functions.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 estiver atribuída a nenhum termo que pertença à taxonomia personalizada 'edição'), a postagem será exibida / listado em todos os arquivos / feeds de termo da 'edição' da taxonomia personalizada.

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' da taxonomia personalizada). Ele não mostra as postagens que não foram atribuídas a nenhum termo na "edição" de taxonomia personalizada. Como faço para corrigir isso?

( PS: Definir os termos padrão para as postagens não é uma opção, já que podemos adicionar mais edições mais tarde.

Resolvido, mas ...

Eu trabalhei uma solução que você pode ver como uma resposta a esta pergunta. A recompensa ainda está de pé, então sinta-se livre. :)

    
por its_me 01.07.2013 / 20:02

2 respostas

3

Em circunstâncias gerais, usando parâmetros de URL, é possível listar postagens que pertencem a uma categoria específica E uma taxonomia personalizada, como esta:

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

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

Se você quiser incluir 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 uma solução 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 estiver atribuída a nenhum termo que pertença à taxonomia personalizada 'edition'), ela será mostrada / listada em todas as publicações. arquivos / feeds de termo da 'edição' da taxonomia personalizada.

    MAS AGORA , removi esse código. Em seguida, criou um novo termo sob a taxonomia personalizada 'edition', chamada 'intl' (internacional). Qualquer postagem que queira ser exibida em todas as Edições será atribuída a 'intl'. Mas como posso garantir que todas as postagens atribuídas a 'intl' apareçam em todos os arquivos / feeds de termo da minha taxonomia personalizada?

    Para isso, eu 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;
    }
    

    Agora, por exemplo, http://example.com/edition/usa/ lista as postagens que pertencem a 'usa' ou 'intl' (que são termos da minha 'edição' de taxonomia personalizada). Seu feed, http://example.com/edition/usa/feed/ faz o mesmo também.

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

    Por exemplo, como listar as postagens que pertencem à categoria 'carros' e a edição 'usa'?

    É assim que o URL deve ficar: http://example.com/category/cars/?edition=usa,intl (pois também queremos as postagens exibidas 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 para @kaiser por sua ajuda.)

Notas

Se você quiser alterar estritamente a consulta / loop principal no modelo, por exemplo, taxonomy-edition.php (no meu caso), aqui está um exemplo de como isso 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 precise ir com pre_get_posts .

    
por its_me 04.07.2013 / 16:18
-2

Você pode ter que olhar para o uso do wp_query. em que você define sua própria consulta para exibir qualquer categoria desejada e, quando terminar, redefine-a para o comportamento padrão.

    
por Greeso 04.07.2013 / 01:37