Argumentos condicionales para WP_Query y tax_query dependiendo si $somevar tiene un valor

20 jun 2012, 04:09:11
Vistas: 27.2K
Votos: 8

He creado una nueva consulta para un tipo de publicación personalizada 'courses'. Esos resultados luego se filtran usando tax_query, consultando 3 taxonomías personalizadas que coinciden con 1 o varios ID de términos. Estos se pasan desde una página de búsqueda.

Aquí está el código funcionando hasta ahora:

// Vamos a emular los ID publicados desde el widget de búsqueda de cursos
// con algunos ID de términos estáticos para cada taxonomía personalizada.
$search_course_area = array(65, 62);
$search_course_level = array(117); //52 para filtrado adicional
$search_course_mode = array(54, 56); 


//Comenzar una nueva consulta
$query = new WP_Query(
    array(
        //Recuperar TODOS los posts de cursos
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Filtrar taxonomías por ids pasados desde el widget buscador de cursos
        'tax_query' => array(
                //Establecer la condición de relación para los filtros
                //en este caso estamos usando AND ya que está explícitamente 
                //establecido por el usuario al buscar
                'relation' => 'AND',
                //Primero verificar y recuperar course-area basado en ID
                array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),
                //Y de nuevo para la segunda taxonomía
                array(
                    'taxonomy' => 'study-levels',
                    'field' => 'id',
                    'terms' => $search_course_level
                ),
                //Finalmente verificar y recuperar course-level basado en ID
                array(
                    'taxonomy' => 'course-mode',
                    'field' => 'id',
                    'terms' => $search_course_mode
                ),
        )
    )
);

Lo que me tiene un poco atascado es que si se pasa un array que está vacío, esto obviamente rompería la consulta y no devolvería resultados.

¿Cuál sería la forma más limpia de abordar esto?

0
Todas las respuestas a la pregunta 2
3
23

Puedes definir los argumentos fuera de la instanciación de 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(
        // Recuperar TODAS las publicaciones de cursos
        'post_type' => 'course',
        'posts_per_page' => '-1',
        // Filtrar taxonomías por IDs pasados desde el widget de buscador de cursos
        'tax_query' => $tax_query,
    )
);
?>
20 jun 2012 04:44:55
Comentarios

¡Muchas gracias Jessica!

Me perdí en el campo minado de los arrays, realmente lo agradezco

Craig Pearson Craig Pearson
20 jun 2012 05:05:45

@CraigPearson No hay problema, me alegra poder ayudar. :)

jessica jessica
20 jun 2012 05:08:07

¡Esto es increíble - muchísimas gracias!

klewis klewis
19 ago 2022 18:35:16
0

Por si alguien está viendo esto actualmente, si tienes múltiples casos dentro de tu instancia de consulta, deberías envolver tu variable dentro de otro arreglo... algo como:

$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