Utilizzo dei parametri URL per elencare i post da categoria e tassonomia personalizzata

1 lug 2013, 21:02:11
Visualizzazioni: 24.1K
Voti: 4

Ad esempio, http://example.com/?cat=6&tag=books elenca i post che appartengono alla categoria ID 6 e sono taggati come 'books' (cioè i post che soddisfano entrambe le condizioni).

Analogamente, http://example.com/feed/?cat=6&tag=books fa lo stesso per i feed.

Ora, supponiamo che il mio blog abbia una tassonomia personalizzata chiamata 'edition', con termini 'usa', 'uk', 'china', e così via. L'URL http://example.com/?edition=usa,china elenca i post che appartengono a entrambe le edizioni 'usa' e 'china'.

E http://example.com/category/cars/?edition=usa elenca quei post dalla categoria 'Cars' che appartengono anche al termine della tassonomia personalizzata 'usa'.

Il problema

Uso il codice seguente nel mio functions.php:

add_filter('pre_get_posts','better_editions_archive');
function better_editions_archive( $better_editions_query ) {

    /* Sembra che questa riga debba essere modificata, non sono sicuro di come */
    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;
}

Il codice assicura che se un post non è assegnato a nessuna Edition (cioè se un post non è assegnato a nessun termine appartenente alla tassonomia personalizzata 'edition'), il post viene mostrato/elencato in tutti gli archivi/feed dei termini della tassonomia personalizzata 'edition'.

Ora, http://example.com/category/cars/?edition=usa elenca solo i post che appartengono alla categoria 'cars' e specificamente marcati come 'usa' (un termine appartenente alla tassonomia personalizzata 'edition'). Non mostra quei post che non sono assegnati a nessun termine nella tassonomia personalizzata 'edition'. Come posso risolvere questo problema?

(PS: Impostare termini predefiniti per i post non è un'opzione, poiché potremmo aggiungere altre edizioni in seguito.)


Risolto ma...

Ho elaborato una soluzione che potete vedere come risposta a questa domanda. Il bounty è ancora valido, quindi sentitevi liberi. :)

6
Commenti

Sono sicuro che sia possibile (puoi farlo con WP_Query, puoi costruire il tuo WP_Query e puoi persino creare regole di riscrittura personalizzate per costruire questa query). Non sono sicuro che funzioni subito, però.

Krzysiek Dróżdż Krzysiek Dróżdż
1 lug 2013 21:21:40

@KrzysiekDróżdż Finché ho la flessibilità dei parametri URL, sì.

its_me its_me
1 lug 2013 21:24:02

Ecco informazioni su wp_query e query di tassonomia: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters Poi controlla i query_vars registrati (se è registrato usalo, e se non lo è, aggiungi il tuo con global $wp; $wp->add_query_var('author_more');

Krzysiek Dróżdż Krzysiek Dróżdż
1 lug 2013 21:44:39

@its_me, il problema è che il tuo filtro sopra sta sovrascrivendo le query di tassonomia attualmente presenti? Oppure non ha alcun effetto sui risultati?

Eric Holmes Eric Holmes
3 lug 2013 22:12:09

@EricHolmes Non ha alcun effetto sui risultati quando si utilizzano i parametri URL, come in http://example.com/category/cars/?edition=usa

its_me its_me
3 lug 2013 22:14:34

@Milo 1. Penso che is_tax( 'edition' ) funzioni correttamente. Il codice nella mia domanda non funziona solo quando si utilizzano i parametri URL category_name/edition. Quindi, penso che l'istruzione condizionale dovrebbe includere in qualche modo anche le categorie. 2. Non ho trovato abbastanza esempi sul web per capire come utilizzare posts_where. :-/

its_me its_me
4 lug 2013 11:17:41
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 2
2

In circostanze generali, utilizzando i parametri URL, puoi elencare i post che appartengono a una specifica categoria E a una tassonomia personalizzata, in questo modo:

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

Dove, category è la base delle categorie che stai utilizzando sul tuo sito (Dashboard WordPress > Impostazioni > Permalinks > Base categoria); edition è la base/slug della tassonomia personalizzata; e usa è un termine sotto la tassonomia personalizzata.

Se vuoi includere più di una categoria/tassonomia personalizzata, questi esempi potrebbero aiutarti:

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

E i Feed:

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

Letture aggiuntive:


MA...

Come spiegato nella mia domanda, il mio è un caso complesso, quindi ho sviluppato una semplice soluzione alternativa. Ecco come...

  1. Il blocco di codice nella domanda assicura che se un post non è assegnato a nessuna Edizione (cioè se un post non è assegnato a nessun termine che appartiene alla tassonomia personalizzata 'edition'), il post viene mostrato/elencato sotto tutti gli archivi/feed dei termini della tassonomia personalizzata 'edition'.

    MA ORA, ho rimosso quel codice. Poi ho creato un nuovo termine sotto la tassonomia personalizzata 'edition', chiamato 'intl' (Internazionale). Qualsiasi post che voglio venga visualizzato sotto tutte le Edizioni sarà assegnato a 'intl'. Ma come faccio a garantire che tutti i post assegnati a 'intl' appaiano in tutti gli archivi/feed dei termini della mia tassonomia personalizzata?

    Per questo, ora uso questo codice (va inserito in 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;
    }
    

    Quindi ora, ad esempio, http://example.com/edition/usa/ elenca i post che appartengono a 'usa' o 'intl' (che sono termini sotto la mia tassonomia personalizzata 'edition'). Il suo feed, http://example.com/edition/usa/feed/ fa lo stesso.

  2. Tornando al problema principale della domanda. Come elenco i post che appartengono a una categoria specifica E a un'edizione, utilizzando i parametri URL?

    Ad esempio, come elenco i post che appartengono alla categoria 'cars' E all'edizione 'usa'?

    Questo è come dovrebbe essere l'URL: http://example.com/category/cars/?edition=usa,intl (poiché vogliamo anche quei post che sono mostrati sotto tutte le edizioni, cioè quelli assegnati al termine 'intl'). Per i feed: http://example.com/category/cars/feed/?edition=india,intl

Ecco fatto!

(Un ringraziamento speciale a @kaiser per il suo aiuto.)


Note

Se vuoi modificare la query principale/loop direttamente all'interno del template, ad esempio taxonomy-edition.php (nel mio caso), ecco un esempio su come può essere fatto:

<?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 /* Inizio del 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; ?>

Tuttavia, a meno che non sia strettamente necessario, usa pre_get_posts.

4 lug 2013 17:18:24
Commenti

Sono confuso su ciò con cui hai difficoltà. Nella tua risposta dici: "utilizzando i parametri URL, puoi elencare i post che appartengono a una categoria specifica E a una tassonomia personalizzata, in questo modo...", e poi più avanti: "Tornando al problema principale della domanda. Come faccio a elencare i post che appartengono a una categoria specifica E a un'edizione, utilizzando i parametri URL?" Puoi spiegare (brevemente, dato che la mia capacità di attenzione è piuttosto limitata) con cosa hai bisogno di aiuto?

Matthew Boynes Matthew Boynes
6 lug 2013 20:13:04

@MatthewBoynes Ho chiaramente affermato all'inizio della seconda parte della mia risposta: "Come spiegato nella mia domanda, il mio è un caso complesso..." cioè stavo usando un codice (vedi domanda) che "assicura che se un post non è assegnato a nessuna Edizione (cioè se un post non è assegnato a nessun termine che appartiene alla tassonomia personalizzata 'edizione'), il post viene mostrato/elencato in tutti gli archivi/feed dei termini della tassonomia personalizzata 'edizione'." Chiaro ora? :)

its_me its_me
10 lug 2013 16:38:35
2
-3

Potresti dover considerare l'utilizzo di wp_query. In questo modo puoi impostare una tua query personalizzata per visualizzare qualsiasi categoria desideri, e una volta terminato, ripristinare il comportamento predefinito.

4 lug 2013 02:37:03
Commenti

Il codice in questione sta già funzionando con la query principale. In che modo la creazione di una query secondaria risolverebbe il problema?

Rarst Rarst
6 lug 2013 15:24:22

Quello che pensavo era creare una nuova query, che includesse sia la query principale in questione sia ciò che non viene visualizzato. Non ho fornito codice perché presupponevo che la mia risposta potesse essere una guida sufficiente per chi ha posto la domanda. Ovviamente non a molti piace questo approccio, tuttavia l'ho usato personalmente e funziona perfettamente.

Greeso Greeso
6 lug 2013 21:31:54