Utilizarea parametrilor URL pentru listarea articolelor din categorie și taxonomie personalizată

1 iul. 2013, 21:02:11
Vizualizări: 24.1K
Voturi: 4

De exemplu, http://example.com/?cat=6&tag=books listează articolele care aparțin categoriei cu ID-ul 6 și sunt etichetate cu 'books' (adică articolele care îndeplinesc ambele condiții).

În mod similar, http://example.com/feed/?cat=6&tag=books face același lucru pentru feed-uri.

Să zicem că blogul meu are o taxonomie personalizată numită 'edition', cu termenii 'usa', 'uk', 'china' și așa mai departe. URL-ul http://example.com/?edition=usa,china listează articolele care aparțin ambelor ediții 'usa' și 'china'.

Iar http://example.com/category/cars/?edition=usa listează acele articole din categoria 'Cars' care aparțin și termenului 'usa' din taxonomia personalizată.

Problema

Folosesc codul de mai jos în functions.php:

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

    /* Se pare că această linie trebuie modificată, nu sunt sigur cum */
    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;
}

Codul se asigură că dacă un articol nu este atribuit niciunei Ediții (adică dacă un articol nu este atribuit niciunui termen care aparține taxonomiei personalizate 'edition'), articolul este afișat/listat în toate arhivele/feed-urile termenilor taxonomiei personalizate 'edition'.

Acum, http://example.com/category/cars/?edition=usa listează doar articolele care aparțin categoriei 'cars' și sunt marcate specific cu 'usa' (un termen aparținând taxonomiei personalizate 'edition'). Nu afișează acele articole care nu sunt atribuite niciunui termen din taxonomia personalizată 'edition'. Cum pot repara acest lucru?

(PS: Setarea termenilor impliciți pentru articole nu este o opțiune, deoarece s-ar putea să adăugăm mai multe ediții ulterior.)


Rezolvat dar...

Am elaborat o soluție pe care o puteți vedea ca răspuns la această întrebare. Recompensa încă este valabilă, așa că simțiți-vă liberi să contribuiți. :)

6
Comentarii

Sunt sigur că este posibil (poți face asta cu WP_Query, poți construi propriul tău WP_Query și poți chiar să creezi reguli personalizate de rescriere pentru a construi această interogare). Nu sunt sigur că va funcționa direct, însă.

Krzysiek Dróżdż Krzysiek Dróżdż
1 iul. 2013 21:21:40

@KrzysiekDróżdż Atât timp cât am flexibilitatea parametrilor din URL, da.

its_me its_me
1 iul. 2013 21:24:02

Aici sunt informații despre wp_query și interogări de taxonomie: http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters Apoi verifică query_vars înregistrați (dacă este înregistrat, folosește-l, iar dacă nu, adaugă-l pe al tău cu global $wp; $wp->add_query_var('author_more');

Krzysiek Dróżdż Krzysiek Dróżdż
1 iul. 2013 21:44:39

@its_me, problema este că filtrul tău suprascrie interogările de taxonomie existente? Sau nu are niciun efect asupra rezultatelor?

Eric Holmes Eric Holmes
3 iul. 2013 22:12:09

@EricHolmes Nu are niciun efect asupra rezultatelor când folosesc parametrii din URL, ca în http://example.com/category/cars/?edition=usa

its_me its_me
3 iul. 2013 22:14:34

@Milo 1. Cred că is_tax( 'edition' ) funcționează corect. Codul din întrebarea mea nu funcționează doar când folosesc parametrii URL category_name/edition. Deci, cred că ar trebui să includă și categorii în condiție, cumva. 2. Nu am găsit suficiente exemple pe internet pentru a înțelege cum să folosesc posts_where. :-/

its_me its_me
4 iul. 2013 11:17:41
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 2
2

În circumstanțe obișnuite, folosind parametrii URL, poți lista articole care aparțin unei anumite categorii ȘI unei taxonomii personalizate, astfel:

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

Unde, category este baza categoriei pe care o folosești pentru categorii pe site (WordPress Dashboard > Settings > Permalinks > Category base); edition este baza/slug-ul taxonomiei personalizate; și usa este un termen sub taxonomia personalizată.

Dacă dorești să incluzi mai multe categorii/taxonomii personalizate, acestea ar putea ajuta:

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

Și fluxuri RSS:

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

Lectură suplimentară:


DAR...

Așa cum am explicat în întrebarea mea, cazul meu este mai complex, așa că am dezvoltat o soluție simplă. Iată cum...

  1. Blocul de cod din întrebare asigură că, dacă un articol nu este atribuit niciunei ediții (adică dacă un articol nu este atribuit niciunui termen din taxonomia personalizată 'edition'), articolul este afișat/listat sub toate arhivele/fluxurile termenilor din taxonomia personalizată 'edition'.

    DAR ACUM, am eliminat acel cod. Apoi am creat un nou termen sub taxonomia personalizată 'edition', numit 'intl' (International). Orice articol care dorește să fie afișat sub toate Edițiile va fi atribuit termenului 'intl'. Dar cum asigur că toate articolele atribuite lui 'intl' apar în toate arhivele/fluxurile termenilor din taxonomia mea personalizată?

    Pentru asta, acum folosesc acest cod (se adaugă în 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;
    }
    

    Deci acum, de exemplu, http://example.com/edition/usa/ listează articole care aparțin fie 'usa', fie 'intl' (care sunt termeni din taxonomia mea personalizată 'edition'). Fluxul său, http://example.com/edition/usa/feed/, face același lucru.

  2. Înapoi la problema principală a întrebării. Cum listez articole care aparțin unei categorii specifice ȘI unei ediții, folosind parametrii URL?

    De exemplu, cum listez articole care aparțin categoriei 'cars' ȘI ediției 'usa'?

    URL-ul ar trebui să arate astfel: http://example.com/category/cars/?edition=usa,intl (deoarece vrem și acele articole care sunt afișate sub toate edițiile, adică acele articole atribuite termenului 'intl'). În cazul fluxurilor: http://example.com/category/cars/feed/?edition=india,intl

Cam asta e tot!

(Mulțumiri speciale lui @kaiser pentru ajutor.)


Note

Dacă dorești strict să modifici interogarea principală/bucla direct în șablon, de ex. taxonomy-edition.php (în cazul meu), iată un exemplu despre cum se poate face:

<?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 /* Bla, Bla, Bla! */ ?>

<?php if ( $better_editions->have_posts() ) : ?>

    <?php /* Începe bucla */ ?>
    <?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 /* Bla, Bla, Bla! */ ?>

<?php endif; ?>

Cu toate acestea, dacă nu este strict necesar, folosește pre_get_posts.

4 iul. 2013 17:18:24
Comentarii

Sunt confuz în legătură cu ce anume vă creează dificultăți. Spuneți în răspunsul dumneavoastră: "folosind parametrii URL, puteți lista postări care aparțin unei anumite categorii ȘI unei taxonomii personalizate, astfel...", apoi mai târziu: "Înapoi la problema principală a întrebării. Cum pot lista postări care aparțin unei anumite categorii ȘI unei ediții, folosind parametrii URL?" Puteți să explicați (pe scurt, deoarece capacitatea mea de concentrare este una juvenilă, cel mult) cu ce anume aveți nevoie de ajutor?

Matthew Boynes Matthew Boynes
6 iul. 2013 20:13:04

@MatthewBoynes Am menționat clar la începutul celei de-a doua părți a răspunsului meu: "Așa cum am explicat în întrebarea mea, cazul meu este unul complex..." adică foloseam un cod (vezi Întrebarea) care "asigură că dacă o postare nu este atribuită niciunei Ediții (adică dacă o postare nu este atribuită niciunui termen care aparține taxonomiei personalizate 'edition'), postarea este afișată/listată sub toate arhivele/fluxurile de termeni ale taxonomiei personalizate 'edition'." E mai clar acum? :)

its_me its_me
10 iul. 2013 16:38:35
2
-3

Poate fi necesar să utilizați wp_query, unde puteți seta propria interogare pentru a afișa orice categorie doriți, iar apoi, când ați terminat, să o resetați la comportamentul implicit.

4 iul. 2013 02:37:03
Comentarii

Codul în cauză funcționează deja cu interogarea principală. Cum ar rezolva crearea unei interogări secundare problema?

Rarst Rarst
6 iul. 2013 15:24:22

Ceea ce mă gândeam eu este să creez o nouă interogare, care să acopere atât interogarea principală în discuție, cât și orice altceva care nu este afișat. Nu am furnizat cod pentru că am presupus că răspunsul meu oferă suficiente indicații pentru persoana care a pus întrebarea. Evident, nu multor oameni le place această abordare, însă eu am folosit-o și funcționează perfect.

Greeso Greeso
6 iul. 2013 21:31:54