Argomenti condizionali per WP_Query e tax_query in base al valore di $somevar

20 giu 2012, 04:09:11
Visualizzazioni: 27.2K
Voti: 8

Ho creato una nuova query per un custom post type 'courses'. I risultati vengono poi filtrati usando tax_query, interrogando 3 tassonomie personalizzate che corrispondono a uno o più ID di termini. Questi vengono passati da una pagina di ricerca.

Ecco il codice che funziona fino ad ora:

// Simuliamo gli ID inviati dal widget di ricerca dei corsi
// con alcuni ID di termini statici per ogni tassonomia personalizzata
$search_course_area = array(65, 62);
$search_course_level = array(117); //52 per ulteriore filtraggio
$search_course_mode = array(54, 56); 


// Inizia una nuova query
$query = new WP_Query(
    array(
        // Recupera TUTTI i post dei corsi
        'post_type' => 'course',
        'posts_per_page' => '-1',
        // Filtra le tassonomie per gli id passati dal widget del cercatore di corsi
        'tax_query' => array(
                // Imposta la condizione di relazione per i filtri
                // in questo caso usiamo AND poiché è impostato esplicitamente 
                // dall'utente durante la ricerca
                'relation' => 'AND',
                // Prima verifica recupera le aree del corso basate su ID
                array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),
                // E di nuovo per la seconda tassonomia
                array(
                    'taxonomy' => 'study-levels',
                    'field' => 'id',
                    'terms' => $search_course_level
                ),
                // Infine verifica e recupera le modalità del corso basate su ID
                array(
                    'taxonomy' => 'course-mode',
                    'field' => 'id',
                    'terms' => $search_course_mode
                ),
        )
    )
);

La cosa su cui sono un po' bloccato è che se viene passato un array vuoto, questo ovviamente romperebbe la query e non restituirebbe risultati.

Qual è il modo più pulito per affrontare questo problema?

0
Tutte le risposte alla domanda 2
3
23

Puoi definire gli argomenti al di fuori dell'istanziazione di 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(
        //Recupera TUTTI i post di tipo corso
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Filtra le tassonomie dagli id passati dal widget di ricerca corsi
        'tax_query' => $tax_query,
    )
);
?>
20 giu 2012 04:44:55
Commenti

Grazie mille Jessica!

Mi ero perso nel campo minato degli array, davvero apprezzato

Craig Pearson Craig Pearson
20 giu 2012 05:05:45

@CraigPearson Di niente, felice di esserti stato d'aiuto. :)

jessica jessica
20 giu 2012 05:08:07

È fantastico - grazie mille!

klewis klewis
19 ago 2022 18:35:16
0

Nel caso qualcuno stia vedendo questo al giorno d'oggi, se hai multiple condizioni all'interno della tua istanza di query, dovresti avere la tua variabile racchiusa da un altro array... qualcosa come:

$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 ott 2018 23:51:48