Argomenti condizionali per WP_Query e tax_query in base al valore di $somevar
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?
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,
)
);
?>

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',
));
}
