Beiträge ohne Begriff anzeigen

7

Ich arbeite an einer Produktseite, auf der ich Bewertungen aus meinem Beitragstyp "Bewertungen" anzeige, wenn der Titel der Produktseite mit meinem Begriff aus der Taxonomie "Bewertungsprodukt" übereinstimmt.

Beispiel.

Titel der Produktseite: Kühlschrank

Beiträge (Rezensionen) anzeigen mit:

  • Beitragstyp: 'Bewertungen'
  • Taxonomie: 'Bewertungsprodukt'
  • Begriff: Kühlschrank

Das funktioniert völlig gut. Aber manchmal habe ich keine Bewertungen für ein Produkt (weil es keine Übereinstimmung zwischen Produkttitel und Begriff gibt) und dann möchte ich "Allgemeine" Bewertungen anzeigen. Auf meiner Website sind dies Beiträge mit:

  • Beitragstyp: 'Bewertungen'
  • Taxonomie: 'Bewertungsprodukt'
  • Laufzeit: Keine Laufzeit (!!!)

Diese Beiträge haben keinen Begriff aus der Taxonomie 'Review-Produkt'.

Meine Frage:

Wie kann ich Bewertungsbeiträge ohne Begriff anzeigen, wenn keine Bewertungsbeiträge vorhanden sind, die dem Produkttitel entsprechen?

Das habe ich jetzt:

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();
}
Robbert
quelle
Dies wird eine teure NOT IN-Abfrage sein. Sie sollten immer nach dem fragen, was Sie wollen, nicht nach dem, was Sie nicht wollen
Tom J Nowell

Antworten:

7

Sie können nicht dasselbe Objekt WP_Queryzweimal verwenden. Daher müssen Sie einen weiteren mit einem tax_queryParameter erstellen , um Beiträge abzurufen, die keinem Begriff zugeordnet sind.

//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 );

Die Idee ist, eine Liste aller Begriffe Ihrer Taxonomie abzurufen und sie als Argument an Ihre Steuerabfrage mit dem NOT INOperator zu übergeben.

Die zweite Schleife in Ihrem Beispiel sollte über das neue WP_QueryObjekt laufen .

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

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

Geminorum
quelle