Woocommerce: Benutzerdefinierte Schleife in Produkt-Tabs bricht Bewertungen Registerkarte

Ich bin auf ein seltsames Problem gestoßen, nicht sicher, ob es ein Bug ist oder etwas mit meinem Code nicht stimmt.

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

Also habe ich eine benutzerdefinierte Produkt-Registerkarte für die Produktseite erstellt, auf der Cross-Sale-Produkte angezeigt werden (Up-Sales oder verwandte Produkte entsprechen nicht den Anforderungen dafür). Es funktioniert alles gut außer dem Tab Bewertungen. Wenn ich es nach dem Tab mit Cross-Sales platziere, zeigt es falsche Bewertungen (die wie zufällig aussehen). Der Zähler für Rezensionen (der Name, der neben dem Namen des Tabs steht) ist korrekt, aber die Liste der Bewertungen enthält Bewertungen anderer Produkte und nicht der aktuellen. Wenn die Registerkarte Bewertungen vor meiner Cross-Sales-Registerkarte ist, ist es in Ordnung. Also ich denke, etwas in meinem Code bricht es, aber ich kann nicht herausfinden, was …

Hier ist der Code, den ich auf meiner Cross-Sales-Registerkarte verwende:

$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 '
Consumables for
«' . get_the_title($product->id) . '»
'; while ( $crosssell_loop->have_posts() ) { $crosssell_loop->the_post(); wc_get_template_part( 'content', 'product' ); }; echo '
'; }

Ich habe meiner Schleife einen benutzerdefinierten Namen gegeben, um Konflikte zu vermeiden, also sollte sie alle Variablen überschreiben, die von Überprüfungen verwendet werden … Ich habe auch versucht, die Vorlage innerhalb der while loop zu puffern und die gepufferte Variable auszugeben, aber das Problem wurde nicht getriggers .

Das Problem ist, dass ich Bewertungen nach diesem Tab nach Design schreiben muss, damit ich es nicht einfach mit Bewertungen zurücklassen kann (es ist auch, weil der erste Tab mit Produktbeschreibung auch ein paar dieser Cross-Sale-Produkte enthalten sollte) .

Und hier ist meine function zum Hinzufügen von benutzerdefinierten Tabs und 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; } 

Solutions Collecting From Web of "Woocommerce: Benutzerdefinierte Schleife in Produkt-Tabs bricht Bewertungen Registerkarte"

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

Das Problem war, dass die Post-Daten nicht zurückgesetzt wurden, also brauchte ich nur einen functionsaufruf wp_reset_postdata(); nach meiner while-Schleife. 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 '
Consumables for
«' . get_the_title($product->id) . '»
'; while ( $crosssell_loop->have_posts() ) { $crosssell_loop->the_post(); wc_get_template_part( 'content', 'product' ); }; wp_reset_postdata(); echo '
'; }