web-dev-qa-db-fra.com

Arguments conditionnels pour WP_Query et tax_query selon si $ somevar a une valeur

J'ai créé une nouvelle requête pour un type de post personnalisé de "cours". Ces résultats doivent ensuite être filtrés à l'aide de tax_query, en interrogeant trois taxonomies personnalisées correspondant à un ou plusieurs ID de terme. Ceux-ci sont passés d'une page de recherche.

Voici le code qui fonctionne jusqu'à présent:

// Lets emulate the posted ID's from the course search widget
// with some static term ID's for each custom taxonomy.
$search_course_area = array(65, 62);
$search_course_level = array(117); //52 for further filtering
$search_course_mode = array(54, 56); 


//Begin a new query
$query = new WP_Query(
    array(
        //Retreive ALL course posts
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Filter taxonomies by id's passed from course Finder widget
        'tax_query' => array(
                //Set the relation condition for the filters in 
                //this case we're using AND as it is explicity set 
                //by the user when searching
                'relation' => 'AND',
                //First check retreive course-area's based on ID
                array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),
                //And again for the second taxonomy
                array(
                    'taxonomy' => 'study-levels',
                    'field' => 'id',
                    'terms' => $search_course_level
                ),
                //Finally check retreive course-level's based on ID
                array(
                    'taxonomy' => 'course-mode',
                    'field' => 'id',
                    'terms' => $search_course_mode
                ),
        )
    )
);

La chose sur laquelle je suis un peu coincé, c'est que si un tableau vide est passé, cela briserait évidemment la requête et ne renverrait aucun résultat.

Quel serait le moyen le plus propre de s’y attaquer? Je pourrais faire quelque chose comme:

if (isset($search_course_area)) {
    echo  "array(
                    'taxonomy' => 'course-area',
                    'field' => 'id',
                    'terms' => $search_course_area
                ),";
};

Mais j'ai le sentiment que ce ne serait pas la meilleure façon de l'aborder?

Merci beaucoup pour votre temps et toute aide que vous pouvez donner, je l'apprécie vraiment!

4
Craig Pearson

Vous pouvez définir les arguments en dehors de l'instanciation 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(
        //Retreive ALL course posts
        'post_type' => 'course',
        'posts_per_page' => '-1',
        //Filter taxonomies by id's passed from course Finder widget
        'tax_query' => $tax_query,
    )
);
?>
11
jessica

Juste au cas où quelqu'un verrait cela de nos jours, si vous avez plusieurs cas dans votre instance de requête, vous devriez avoir votre variable encapsulée par un autre tableau .. quelque chose comme:

$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',
    )); 
} 
0
Wesley Andrade