Filtrarea rezultatului WP_Query după categorie

14 sept. 2014, 05:58:27
Vizualizări: 33.6K
Voturi: 2

Folosind WP_Query, am nevoie să adun o selecție de postări care sunt atât în Categoria1 cât și în Categoria2. Vreau ca această selecție să includă Categoria1 și toate subcategoriile sale (Categoria3 și Categoria4), atâta timp cât acestea sunt etichetate și cu Categoria2, chiar dacă nu sunt etichetate cu Categoria1.

Categorii:

Nume          ID     Părinte
Categoria1    1
Categoria2    2
Categoria3    3      1
Categoria4    4      1

Postări:

ID     Categorii
1      1,2
2      2,3
3      2,4

Acum, dacă aș folosi WP_Query pentru a găsi postări doar în Categoria1, pare să găsească toate cele trei postări, inclusiv Postarea2 și Postarea3, deoarece Categoria3 și Categoria4 sunt subcategorii ale Categoriei1, chiar dacă postările nu sunt în Categoria1.

new WP_Query(
        array(
            'cat' => 1
        )

Totuși, dacă folosesc 'category__and' pentru a găsi postări care sunt atât în Categoria1 cât și în Categoria2

new WP_Query(
        array(
            'category__and' => array(1, 2)
        )

găsește doar Postarea1 care are atât Categoria1 cât și Categoria2, dar nu va găsi Postarea2 care este în Categoria2 și Categoria3 sau Postarea3, chiar dacă Categoria3 și Categoria4 sunt subcategorii ale Categoriei1.

Există vreo modalitate prin care pot lua rezultatul acestei interogări:

new WP_Query(
        array(
            'cat' => 1
        )

Care găsește postări ce sunt în Categoria1 ȘI subcategorii ale Categoriei1, chiar dacă nu sunt și în Categoria1...

Și apoi să o filtrez pentru a include doar acele postări care sunt și în Categoria2?

Mulțumesc pentru orice sugestii.

3
Comentarii

Am scris greșit 'cat' ca 'cat_id' în întrebarea de mai sus, dar 'cat' este ceea ce folosesc de fapt în codul meu funcțional. Codul din întrebare a fost corectat.

user79283 user79283
14 sept. 2014 17:08:13

am adăugat câteva clarificări suplimentare

user79283 user79283
14 sept. 2014 17:15:10

Bun venit pe WPSE. Dacă nu ai făcut-o deja, te rugăm să consulți [ask] și să vizitezi pagina noastră [tour]. Este important să furnizezi detalii/cod corect pentru ca cineva să te poată ajuta. Acest lucru evită și închiderea întrebării tale din cauza erorilor de sintaxă. :-)

Pieter Goosen Pieter Goosen
14 sept. 2014 19:14:53
Toate răspunsurile la întrebare 2
1

Descrierea de mai jos explică modul în care ar trebui să funcționeze:

  • cat_id nu este un argument valid, așadar veți primi articole din toate categoriile. Folosiți cat pentru a seta un ID de categorie sau un array de ID-uri de categorii. De exemplu:

Obțineți articole din categoria 1:

new WP_Query(
    array(
        'cat' => 1
    )

Obțineți articole din categoria 1 și din categoria 2 (nu neapărat din ambele simultan)

new WP_Query(
    array(
        'cat' => array( 1, 2 )
    )
  • category__and găsește articole care aparțin tuturor categoriilor specificate. De exemplu:

Obțineți articole care se află în ambele categorii, 1 și 2:

new WP_Query(
    array(
        'category__and' => array( 1, 2 )
    )

Mai multe detalii în WP Query, parametrii pentru categorii.

14 sept. 2014 12:59:32
Comentarii

Scuze, am greșit tastând 'cat' ca 'cat_id' în întrebarea de mai sus, dar 'cat' este ceea ce folosesc de fapt în codul meu funcțional. Deci asta nu răspunde încă la întrebarea mea. Vreau să găsesc toate articolele care sunt în Category2 ȘI (Category1 SAU Subcategoriile din Category1). Codul tău cu 'category__and' nu găsește subcategoriile.

user79283 user79283
14 sept. 2014 17:10:36
2

Parametrii de categorie ai WP_Query nu au acest tip de logică. category__and și category__in nu returnează postări din categoriile copil ale categoriilor setate.

Aș sugera să folosești parametrii tax_query în WP_Query, care au logica pe care o cauți. Parametrul relation are două valori posibile, AND și OR

relation (string) - Relația logică între fiecare array de taxonomie internă atunci când există mai multe. Valorile posibile sunt 'AND', 'OR'. Nu utilizați cu un singur array de taxonomie internă.

De asemenea, în mod implicit, termenii copil sunt incluși într-un tax_query, iar asta este ceea ce ai nevoie.

include_children (boolean) - Dacă să includă sau nu copiii pentru taxonomiile ierarhice. Valoarea implicită este true.

Poți face ceva de genul acesta:

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
    'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'term_id',
            'terms'    => 1,
        ),
        array(
            'taxonomy' => 'category',
            'field'    => 'term_id',
            'terms'    => 2,
            'include_children' => false,
        ),
    ),
);
$query = new WP_Query( $args );

Ce face acest cod, caută postări care sunt în categoria 1 și în categoriile sale copil, de asemenea, verifică dacă aceste postări din categoria 1 și categoriile sale copil sunt de asemenea în categoria 2. Lista de postări returnate va fi formată din postările care sunt în categoria 1 sau oricare dintre categoriile sale copil și care sunt de asemenea în categoria 2.

Am exclus categoriile copil din categoria 2, dar poți elimina această opțiune dacă este necesar.

14 sept. 2014 19:11:43
Comentarii

Super - a funcționat. Aș vota răspunsul tău, dar încă nu am suficientă reputație. Mulțumesc pentru ajutor!

user79283 user79283
14 sept. 2014 19:30:00

Nicio problemă. Mă bucur că a funcționat. Distrează-te :-)

Pieter Goosen Pieter Goosen
14 sept. 2014 19:32:53