web-dev-qa-db-fra.com

Afficher les messages sans terme

Je travaille sur une page de produit sur laquelle je montre des critiques de mon type de publication "critiques", si le titre de la page du produit correspond à mon terme de la taxonomie "produit de révision".

Exemple.

Titre de la page du produit: Refrigerator

Afficher les (commentaires) messages avec:

  • Type de message: 'critiques'
  • Taxonomie: 'review-product'
  • Terme: Réfrigérateur

Cela fonctionne totalement bien. Mais parfois, je n'ai pas d'avis sur un produit (car il n'y a pas de correspondance entre le titre et le terme du produit), puis je souhaite afficher les avis "Général". Sur mon site, ce sont des posts avec:

  • Type de message: 'critiques'
  • Taxonomie: 'review-product'
  • Terme: Pas de terme (!!!)

Ces publications n'ont pas de terme de la taxonomie 'review-product'.

Ma question:

Comment puis-je afficher les commentaires sans terme, s'il n'y a pas de commentaire correspondant au titre du produit?.

C'est ce que j'ai maintenant:

function gtp_show_reviews( $number = 100, $term = null ) {
    $reviews = new WP_Query( array( 
        'post_type'         => 'reviews',
        'review-product'    => $term, // Fill this with product page slug (refrigerator)
    ));
    if( $reviews->have_posts() ) { 
        while( $reviews->have_posts() ) {
            $reviews->the_post();
            // The review
        }
    } 
    else {
        // Here I try to unset the 'review-product' term
        unset($reviews->query_vars['review-product']);
        unset($reviews->query_vars['term']);

        while( $reviews->have_posts() ) {
            $reviews->the_post();
            // Check if review has no term
            if( $reviews->has_term() == false ) {
               // The review
            }
        }   
    }

    wp_reset_postdata();
}
7
Robbert

Vous ne pouvez pas utiliser le même objet de WP_Query deux fois. Par conséquent, vous devez en créer un autre avec un paramètre tax_query pour récupérer les publications qui ne sont affectées à aucun terme.

//fetch all reviews which have no assigned term in 'review-product'
$taxonomy  = 'review-product';
$post_type = 'reviews';
$args = [
    'post_type' => $post_type,
    'tax_query' => [
        [
            'taxonomy' => $taxonomy,
            'terms'    => get_terms( $taxonomy, [ 'fields' => 'ids'  ] ),
            'operator' => 'NOT IN'
        ]
    ]
];

$query = new \WP_Query( $args );

L'idée est de récupérer une liste de tous les termes de votre taxonomie et de les transmettre en tant qu'argument à votre requête de taxe avec l'opérateur NOT IN.

La deuxième boucle de votre exemple doit parcourir le nouvel objet WP_Query.

7
David
$posts_query = new WP_Query( array(
    'tax_query' => array(
        array(
            'taxonomy' => 'foo',
            'operator' => 'NOT EXISTS', // or 'EXISTS'
        ),
    ),
) );

voir: https://core.trac.wordpress.org/ticket/29181

3
geminorum