web-dev-qa-db-fra.com

requête wp avec taxonomies et termes dynamiques?

J'ai besoin de wp_query avec plus d'une taxonomie et de termes dynamiques. Plusieurs termes pour une taxonomie chacun. Comme si une taxonomie est Couleur elle comporte des termes bleu, vert, rouge La deuxième taxonomie est Taille et termes 7,8,9 cette taxonomie est Price et ses termes sont 500 $, 600 $ et ainsi de suite.

J'ai besoin de filtrer les résultats en fonction des cases à cocher, comme cela arrive sur tous les sites de commerce électronique. Disons d'abord que je sélectionne la couleur bleue , puis les produits appartiennent à bleu alors si je sélectionne vert , les produits sont ceux qui appartiennent aux deux bleu et vert mais maintenant, si je sélectionne 7 alors le produit sera celui qui appartient à bleu, vert de taille 7 .

J'espère que vous obtenez ce dont j'ai besoin.J'ai vu codex pour la taxonomie multiple, mais il n'y a que 2 taxonomies statiques mais dans mon cas, il est dynamique et peut être supérieur à 5.

En codex c'est le code ..

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_genre',
            'field' => 'slug',
            'terms' => array( 'action', 'comedy' )
        ),
        array(
            'taxonomy' => 'actor',
            'field' => 'id',
            'terms' => array( 103, 115, 206 ),
            'operator' => 'NOT IN'
        )
    )
);
$query = new WP_Query( $args );$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_genre',
            'field' => 'slug',
            'terms' => array( 'action', 'comedy' )
        ),
        array(
            'taxonomy' => 'actor',
            'field' => 'id',
            'terms' => array( 103, 115, 206 ),
            'operator' => 'NOT IN'
        )
    )
);
$query = new WP_Query( $args );

mais que se passe-t-il si j'ai plus de 2 par exemple 5 (dynamique).

S'il vous plaît donnez-moi une solution.

J'écris aussi une requête au lieu de Wp-Query mais ne fonctionne pas, elle ajoute le résultat bleu, vert de taille 7 au lieu du filtrage.

Voici la requête.

$taxonomy_name = "'" . implode("','", $taxonomy_name_ar) . "'";
$term_name = "'" . implode("','", $term_name_ar) . "'";

$querystr = "
    SELECT * 
    FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
    LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
    WHERE $wpdb->posts.post_type = 'product' 
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->term_taxonomy.taxonomy in (".$taxonomy_name.")
    AND $wpdb->terms.slug in (".$term_name.")
    ORDER BY $wpdb->posts.post_date DESC
    LIMIT 10
    ";
echo $querystr;
$pageposts = $wpdb->get_results($querystr, OBJECT); 

Remarque $ tanomy_name correspond au nombre de taxonomies telles que la couleur, la taille, le prix et le nombre de termes comportant le nombre de termes tels que 7,8, bleu, vert

UPDATE: APRES REPONSE

$tax_query = array( 'relation' => 'AND' );


foreach($taxonomy_array as $taxonomy_array_value){

$term_value_array = array();

foreach($term_array[$taxonomy_array_value] as $term_value){

        array_Push($term_value_array,$term_value);
    }

$term_name = "'" . implode("','", $term_value_array) . "'";

        $tax_query[] = array(
        'taxonomy' => $taxonomy_array_value,
        'field'    => 'slug',
        'terms'    => array($term_name)

    );


}
    $args = array(
    'post_type' => 'product',
    'tax_query' => $tax_query
    );
1
Bhuvnesh Gupta

Voici une idée pour une requête dynamique à taxonomie multiple:

// construct the tax-query: 
$tax_query = array( 'relation' => 'AND' );

// check if movie_genre taxonomy is to be included
if( $bMovieGenre ){
    $tax_query[] = array(
        'taxonomy' => 'movie_genre',
        'field'    => 'slug',
        'terms'    => array( 'action', 'comedy' )
    );
 }

// check if actor taxonomy is to be included
if( $bActor ){
    $tax_query[] = array(
        'taxonomy' => 'actor',
        'field'    => 'id',
        'terms'    => array( 103, 115, 206 ),
        'operator' => 'NOT IN'
    );
 }

$args = array(
    'post_type' => 'post',
    'tax_query' => $tax_query,
);

$query = new WP_Query( $args );

$bActor et $bMovieGenre sont construits à partir de la saisie de l'utilisateur.

En général, si votre tableau d'entrées utilisateur est comme:

$selected = array( 
    array( 'taxonomy' => 'movie_genre' , 
           'terms'    => array( 'action' , 'comedy') ,
           'field'    => 'slug' ,
           'operator' => 'IN' ,
    ),
    array( 'taxonomy' => 'actor' , 
           'terms'    => array( 103, 115, 206 ) ,
           'field'    => 'slug' ,
           'operator' => 'NOT IN' ,
    ),
);

alors vous pouvez essayer ceci pour construire la requête de taxonomie dynamique:

$tax_query = array( 'relation' => 'AND' );

foreach( $selected as $sel ){

    $tax_query[] = array( 
                      'taxonomy' => $sel['taxonomy'] , 
                      'terms'    => $sel['terms'] , 
                      'field'    => $sel['field'] ,
                      'operator' => $sel['operator'] ,
                   );
}

ou juste

$tax_query = array( 'relation' => 'AND' );

foreach( $selected as $sel ){

    $tax_query[] = $sel; 

}
5
birgire