web-dev-qa-db-fra.com

Relation tax_query multiple et imbriquée

Cela fait un moment que je suis coincé dans un problème particulier et je n'ai pas encore trouvé le moyen de le contourner. J'ai des widgets personnalisés et pour chaque widget, j'ai ajouté la possibilité de filtrer les publications en fonction des tags de catégories ET/OU (cette fonctionnalité fonctionne). J'essaie maintenant de développer cela en incluant dans chaque widget un champ personnalisé dans lequel vous pouvez entrer l'ID d'une catégorie que vous souhaitez exclure (le champ personnalisé est déjà dans le widget et stocke les entrées utilisateur).

Permettez-moi de vous montrer ce que j'ai jusqu'à présent pour vous aider à comprendre:

        $args = array(
            'post_type'         => 'post',
            'post_status'       => 'publish',
            'posts_per_page'    => $num_posts,
            'cat'               => -5,
            'tax_query'         => array(
                'relation'      => 'OR',
                array(
                    'taxonomy'  => 'category',
                    'field'     => 'id',
                    'terms'     => $category,
                ),
                array(
                    'taxonomy'  => 'post_tag',
                    'field'     => 'id',
                    'terms'     => $tags
                ),
            ),
            'offset'            => 1,
        );

Comme vous pouvez le constater, je prends deux tableaux d’entrées pour les balises $ category et $ (cela fonctionne très bien), mais ce qui ne semble pas fonctionner est le suivant:

'cat'               => -5,

Si je supprime complètement le tableau tax_query, la catégorie exclude fonctionne parfaitement, il apparaît donc que tax_query annule le paramètre exclude?

Si quelqu'un pouvait m'indiquer le bon direct, ce serait génial :)

Merci!

1
Shane

Le paramètre cat- n'est pas écrasé par tax_query. Au lieu de cela, il est ajouté à tax_query. Ainsi, en utilisant 'cat' => -5, le tableau suivant est ajouté à tax_query:

(
    [taxonomy] => category
    [terms] => Array
        (
            [0] => 5
        )

    [include_children] => 1
    [field] => term_id
    [operator] => NOT IN
)

La requête taxonomique résultante est constituée de trois clauses différentes avec l'opérateur OR. Ainsi, dans votre cas, l'ajout de 'cat' => -5 ajoute simplement le tableau décrit ci-dessus à tax_query, de sorte que la requête renvoie les publications qui sont:

  • pas dans la catégorie 5,
  • dans l'une des catégories de $category, ou
  • dans l'une des balises dans $tags

Tax_query imbriqué

Il n'y a aucun moyen d'utiliser des conditions imbriquées dans tax_query. Pour obtenir le conditionnel recherché (messages dans une catégorie de $category ou ayant une balise de tags, mais dans tous les cas ne faisant pas partie de la catégorie 5), vous devez accrocher au posts_where et éventuellement posts_join .

Pour ceux que cela intéresse, il en va de même pour meta_query: cela ne prend pas non plus en charge les requêtes imbriquées.

MODIFIER

Utiliser posts_where

En réponse à votre commentaire: pour ce faire, utilisez posts_where, vous souhaiterez appliquer le filtre à la requête pour laquelle vous souhaitez exclure une catégorie. Pour ce faire, ajoutez le filtre avant de créer votre requête, puis supprimez-le:

add_filter( 'posts_where', 'myplugin_posts_where' );
$query = new WP_Query( $args );
remove_filter( 'posts_where', 'myplugin_posts_where' );

MODIFIER

Construction de la clause WHERE- supplémentaire

Utiliser get_tax_sql pour construire la clause WHERE- supplémentaire est utile car vous n'avez pas besoin de construire votre code SQL manuellement, et les identifiants de terme sont automatiquement convertis en term- identifiants de taxonomie.

$clauses = get_tax_sql( array(
    array(
        'taxonomy' => 'category',
        'field' => 'id',
        'terms' => 2,
        'operator' => 'NOT IN'
    )
), $wpdb->posts, 'ID' );

$where .= $clauses['where'];
3
engelen

Il suffit de fournir une réponse à jour sur les taxonomies imbriquées car elles sont effectivement prises en charge. La réponse sélectionnée ci-dessus est dépassée/un peu trompeuse. WordPress Core a supporté les taxonomies imbriquées depuis la v4.1

extrait du codex WordPress

Les clauses 'tax_query' peuvent être imbriquées pour créer des requêtes plus complexes. Exemple: Affichez les publications qui appartiennent à la catégorie citations OR les deux ont le format de publication de citations ET se trouvent dans la catégorie sagesse:

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => array( 'quotes' ),
        ),
        array(
                        'relation' => 'AND',
                        array(
                    'taxonomy' => 'post_format',
                    'field'    => 'slug',
                    'terms'    => array( 'post-format-quote' ),
                        ),
                        array(
                                'taxonomy' => 'category',
                                'field'    => 'slug',
                                'terms'    => array( 'wisdom' ),
                        ),
        ),
    ),
);
$query = new WP_Query( $args );

https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters

4
italiansoda