Argumente condiționale pentru WP_Query și tax_query în funcție de valoarea variabilei $somevar

20 iun. 2012, 04:09:11
Vizualizări: 27.2K
Voturi: 8

Am creat o nouă interogare pentru un tip de postare personalizat 'courses'. Aceste rezultate urmează să fie filtrate folosind tax_query, interogând 3 taxonomii personalizate care se potrivesc cu unul sau mai multe ID-uri de termeni. Acestea sunt transmise de pe o pagină de căutare.

Iată codul care funcționează până acum:

// Să emulăm ID-urile transmise din widget-ul de căutare cursuri
// cu câteva ID-uri statice de termeni pentru fiecare taxonomie personalizată.
$search_course_area = array(65, 62);
$search_course_level = array(117); //52 pentru filtrare suplimentară
$search_course_mode = array(54, 56); 

//Începem o nouă interogare
$query = new WP_Query(
    array(
        //Preluăm TOATE postările de tip curs
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Filtrăm taxonomiile după id-urile transmise din widget-ul de căutare cursuri
        'tax_query' => array(
                //Setăm condiția de relație pentru filtre
                //în acest caz folosim AND deoarece este setat explicit 
                //de către utilizator în timpul căutării
                'relation' => 'AND',
                //Prima verificare preia course-area pe bază de ID
                array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),
                //Și din nou pentru a doua taxonomie
                array(
                    'taxonomy' => 'study-levels',
                    'field' => 'id',
                    'terms' => $search_course_level
                ),
                //În final verificăm și preluăm course-mode pe bază de ID
                array(
                    'taxonomy' => 'course-mode',
                    'field' => 'id',
                    'terms' => $search_course_mode
                ),
        )
    )
);

Problema la care m-am blocat este că dacă se transmite un array gol, acest lucru ar strica evident interogarea și nu ar returna niciun rezultat.

Care ar fi cea mai elegantă modalitate de a aborda această situație?

0
Toate răspunsurile la întrebare 2
3
23

Puteți defini argumentele în afara instanțierii WP_Query:

<?php
$tax_query = array('relation' => 'AND');
    if (isset($search_course_area))
    {
        $tax_query[] =  array(
                'taxonomy' => 'course-area',
                'field' => 'id',
                'terms' => $search_course_area
            );
    }
    if (isset($search_course_level))
    {
        $tax_query[] =  array(
                'taxonomy' => 'study-levels',
                'field' => 'id',
                'terms' => $search_course_level
            );
    }
    if (isset($search_course_mode))
    {
        $tax_query[] =  array(
                'taxonomy' => 'course-mode',
                'field' => 'id',
                'terms' => $search_course_mode
            );
    }

$query = new WP_Query(
    array(
        // Preluăm TOATE postările de tip 'course'
        'post_type' => 'course',
        'posts_per_page' => '-1',
        // Filtrăm taxonomiile după ID-urile trimise de widget-ul course finder
        'tax_query' => $tax_query,
    )
);
?>
20 iun. 2012 04:44:55
Comentarii

Mulțumesc mult, Jessica!

M-am pierdut în câmpul minat al array-urilor, apreciez enorm ajutorul.

Craig Pearson Craig Pearson
20 iun. 2012 05:05:45

@CraigPearson Nicio problemă, mă bucur că am putut ajuta. :)

jessica jessica
20 iun. 2012 05:08:07

Asta este grozav - îți mulțumesc foarte mult!

klewis klewis
19 aug. 2022 18:35:16
0

Doar în cazul în care cineva vede asta în zilele noastre, dacă aveți mai multe cazuri în cadrul instanței dumneavoastră de interogare, ar trebui să aveți variabila înfășurată într-un alt array... ceva de genul:

$meta_query = array();

if ( 0 == $current_user->ID ) {
    $meta_query[] = array(array(
        'key'     => 'restrito_para_visualizar',
        'value'   => '1',
        'compare' => '!=',
        'type'    => 'CHAR',
    ),
    array(
        'key'     => 'ativo',
        'value'   => '1',
        'compare' => '=',
        'type'    => 'NUMERIC',
    ));
} else {
    $meta_query[] = array(
    array(
        'key'     => 'ativo',
        'value'   => '1',
        'compare' => '=',
        'type'    => 'NUMERIC',
    )); 
} 
3 oct. 2018 23:51:48