it-swarm.com.de

Woocommerce: Benutzerdefinierte Schleife in Produktregistern unterbricht die Registerkarte "Bewertungen"

Ich bin auf ein seltsames Problem gestoßen, nicht sicher, ob es sich um einen Fehler handelt oder ob etwas mit meinem Code nicht stimmt.

Woocommerce erlaubt es, Cross-Sale-Produkte standardmäßig nur im Warenkorb anzuzeigen, daher musste ich eine benutzerdefinierte Schleife erstellen, um sie auf Produktseiten anzuzeigen.

Daher habe ich für die Produktseite eine benutzerdefinierte Produktregisterkarte erstellt, auf der Cross-Sale-Produkte angezeigt werden (Up-Sales- oder verwandte Produkte entsprechen nicht den Anforderungen dafür). Mit Ausnahme der Registerkarte "Bewertungen" funktioniert alles einwandfrei. Wenn ich es nach dem Tab mit Cross-Sales platziere, werden falsche Bewertungen angezeigt (die zufällig erscheinen). Der Bewertungszähler (der neben dem Namen der Registerkarte steht) ist korrekt, aber die Liste der Bewertungen enthält Bewertungen anderer Produkte und nicht die aktuelle. Wenn sich die Registerkarte "Bewertungen" vor meiner Registerkarte "Cross-Sales" befindet, ist dies in Ordnung. Ich denke, etwas in meinem Code bricht es, aber ich kann nicht herausfinden, was ...

Hier ist der Code, den ich in meinem Cross-Sales-Tab ausführe:

$crosssell_ids = get_post_meta( get_the_ID(), '_crosssell_ids' ); 
$crosssell_ids = $crosssell_ids[0];

if(count($crosssell_ids) > 0) {
    $crosssell_args = array( 'post_type' => 'product', 'posts_per_page' => 8, 'post__in' => $crosssell_ids );
    $crosssell_loop = new WP_Query( $crosssell_args );
    echo '<div class="products"><div class="tabs-title">Consumables for <br>&laquo;' . get_the_title($product->id) . '&raquo;</div>';
    while ( $crosssell_loop->have_posts() ) {
        $crosssell_loop->the_post();
        wc_get_template_part( 'content', 'product' );
    };
    echo '</div>';
}

Ich habe meiner Schleife einen benutzerdefinierten Namen gegeben, um Konflikte zu vermeiden. Daher sollte sie alle Variablen überschreiben, die von Überprüfungen verwendet werden. Ich habe auch versucht, die Vorlage in while loop Zu puffern und gepufferte Variablen auszugeben, aber dies war nicht der Fall. t das Problem lösen.

Das Problem ist, dass ich von Natur aus Bewertungen nach diesem Tab einfügen muss, damit ich nicht einfach vorher Bewertungen abgeben kann (dies liegt auch daran, dass der erste Tab mit Produktbeschreibung auch einige dieser Cross-Sale-Produkte enthalten sollte). .

Und hier ist meine Funktion zum Hinzufügen von benutzerdefinierten Registerkarten und zum Festlegen ihrer Priorität:

// Custom tabs for product page
add_filter( 'woocommerce_product_tabs', 'my_product_tabs' );
function my_product_tabs( $tabs ) {
    // Add new product tabs for product page
    $detailed_info = get_post_meta( get_the_ID(), 'detail_info', true );
    if( !empty($detail_info) ) {
        $tabs['detail_info'] = array(
            'title'     => __( 'Detail info', 'woocommerce' ),
            'callback'  => 'my_tabs_detail_info_html'
        );
    }
    $crosssell_ids = get_post_meta( get_the_ID(), '_crosssell_ids' ); 
    $crosssell_ids = $crosssell_ids[0];
    if( !empty($crosssell_ids) ) {
        $tabs['consumables'] = array(
            'title'     => __( 'Consumables', 'woocommerce' ),
            'callback'  => 'my_tabs_consumables_html'
        );
    }
    $tabs['delivery_methods'] = array(
        'title'     => __( 'Delivery Methods', 'woocommerce' ),
        'callback'  => 'my_tabs_delivery_methods_html'
    );

    // Edit default product tabs for product page
    unset( $tabs['additional_information'] );

    // Tabs order
    if ( isset($tabs['description']) ) $tabs['description']['priority'] = 10;
    if ( isset($tabs['detail_info']) ) $tabs['detail_info']['priority'] = 15;
    if ( isset($tabs['consumables']) ) $tabs['consumables']['priority'] = 20;
    $tabs['reviews']['priority'] = 25;
    if ( isset($tabs['delivery_methods']) ) $tabs['delivery_methods']['priority'] = 30;
    return $tabs;
}
1
Dmitriy Gamolin

Ich habe die Lösung gefunden, die für erfahrene WP Entwickler) wahrscheinlich ziemlich einfach ist. Ich werde sie hier posten, anstatt die Frage zu löschen. Ich hoffe, dies könnte irgendwann jemandem helfen ...

Das Problem war, dass die Post-Daten nicht zurückgesetzt wurden. Alles, was ich brauchte, war, nach meiner while-Schleife einen Funktionsaufruf wp_reset_postdata(); hinzuzufügen. Wie so:

$crosssell_ids = get_post_meta( get_the_ID(), '_crosssell_ids' ); 
$crosssell_ids = $crosssell_ids[0];

if(count($crosssell_ids) > 0) {
    $crosssell_args = array( 'post_type' => 'product', 'posts_per_page' => 8, 'post__in' => $crosssell_ids );
    $crosssell_loop = new WP_Query( $crosssell_args );
    echo '<div class="products"><div class="tabs-title">Consumables for <br>&laquo;' . get_the_title($product->id) . '&raquo;</div>';
    while ( $crosssell_loop->have_posts() ) {
        $crosssell_loop->the_post();
        wc_get_template_part( 'content', 'product' );
    };
    wp_reset_postdata();
    echo '</div>';
}
1
Dmitriy Gamolin