Benutzerdefinierte Post-Schleife im Archiv gibt denselben the_permalink zurück

Ich habe den folgenden Code, der den neuesten Post von jedem der zur Verfügung gestellten benutzerdefinierten Post-Typen ( $customTypes ) aufnehmen soll, er funktioniert auf den meisten Seiten meiner Site, zB hier: http://trulycode.com/ – Beachten Sie auf der rechten Seite die grau / gelb / blau Kästchen mit den neuesten Post aus den 3 Post-Typen.

Auf Archivseiten wird jedoch der gleiche Beitrag auf jeder der 3 Boxen angezeigt, siehe z. B. den Unterschied in der Seitenleiste: http://trulycode.com/php/ – Alle verlinken derzeit mit dem gleichen Apple Watch Review Post.

Ich habe versucht, wp_reset_postdata () und wp_reset_query (), die beide nichts getan haben. Irgendwelche Ideen, warum es das nur für die archive.php Template-Seite tut?

 
$value) { $args = array( 'post_type' => $value, 'posts_per_page' => 1 ); $loop = new WP_Query( $args ); if ($loop->have_posts()) : while ( $loop->have_posts() ) : $loop->the_post(); ?> <a href="https://wordpress.stackexchange.com/questions/187900/custom-post-loop-in-archive-returns-same-the-permalink/" class="blocky-linker"> <?php if ($key == 0) { echo '
'; } elseif ($key == 1) { echo '
'; } else { echo '
'; } ?>

Latest

Solutions Collecting From Web of "Benutzerdefinierte Post-Schleife im Archiv gibt denselben the_permalink zurück"

Dies ist eine Erweiterung Ihrer Antwort. Ihre pre_get_posts Aktion hat ein paar Fehler

 function add_custom_types_to_tax( $query ) { if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) { // Get all your post types $post_types = get_post_types(); $query->set( 'post_type', $post_types ); return $query; } } add_filter( 'pre_get_posts', 'add_custom_types_to_tax' ); 
  • is_category() und is_tag() sollten Eigenschaften von $query

  • Es gibt keinen wirklichen Vorteil bei der Überprüfung, ob suppress_filters wahr oder falsch ist. Die Hauptabfrage wird immer auf “True” gesetzt, wenn sie nicht durch ” pre_get_posts anders pre_get_posts

  • pre_get_posts ist eine Aktion, kein Filter

  • Aktionen müssen nicht zurückgegeben werden.

  • pre_get_posts ändert alle Instanzen von WP_Query (die Hauptabfrage verwendet auch WP_Query ), Frontend und Backend. Sie sollten immer is_main_query() , um nur auf die Hauptabfrage zu zielen, und verwenden Sie auch !is_admin() um nur auf das Frontend !is_admin() (diese Prüfung ist auf der Homepage nicht erforderlich).

Ihr Code sollte etwa so aussehen

 function add_custom_types_to_tax( $query ) { if( !is_admin() && $query->is_main_query() ) { if ( $query->is_category() || $query->is_tag() ) { // Get all your post types $post_types = get_post_types(); $query->set( 'post_type', $post_types ); } } } add_action( 'pre_get_posts', 'add_custom_types_to_tax' ); 

Dies sollte Ihr Problem lösen, ohne dass weiterer Code benötigt wird

ZUSÄTZLICHE BEMERKUNGEN:

  • get_post_types() im aktuellen Zustand, in dem Sie es verwenden, alle registrierten Post-Typen zurück, einschließlich Revisionen und Navigationsmenü-Elemente. Sie build_in Parameter build_in , um alle build_in auszuschließen und nur benutzerdefinierte Beitragstypen zurückzugeben.

  • Verwenden get_posts für nicht paginierte benutzerdefinierte Abfragen get_posts oder fügen Sie get_posts die folgenden beiden Parameter WP_Query

    • 'suppress_filters' => true Dies verhindert, dass alle Filter Ihre benutzerdefinierte Abfrage ändern.

    • no_found_rows' => true' Dies wird die gewünschte Anzahl von Posts erhalten und sofort aus der no_found_rows' => true' . Das Standardverhalten von WP_Query besteht darin, nach allen mit der Abfrage übereinstimmenden WP_Query zu suchen, um die Posts für Paginierungszwecke zu zählen. Das kostet Zeit. Wenn Sie no_found_rows auf ” true , überspringt WP_Query diesen process. Wenn es die gewünschte Anzahl von Posts erreicht, stoppt es sofort die Ausführung der Abfrage und gibt die Posts zurück. Dies spart Ausführungszeit und beschleunigt die Abfrage.

( get_posts() : get_posts() verwendet WP_Query wobei diese beiden Parameter bereits entsprechend eingestellt sind. Deshalb können get_posts nicht sinnvoll ausgelagert werden und warum get_posts nicht von Filtern verändert wird)

Danke dem Kommentar von @Pieter Goosen, dass es wahrscheinlich etwas mit pre_get_posts zu tun pre_get_posts . Ich hatte ein Spiel herum und es scheint das Problem gewesen zu sein. Das war mein alter Code:

Alter Code

 function add_custom_types_to_tax( $query ) { if( is_category() || is_tag() && empty( $query->query_vars['suppress_filters'] ) ) { // Get all your post types $post_types = get_post_types(); $query->set( 'post_type', $post_types ); return $query; } } add_filter( 'pre_get_posts', 'add_custom_types_to_tax' ); 

Und ich ersetzte es durch diesen Code unten, der mein Problem getriggers zu haben scheint. Auf Archivseiten (zB: http://trulycode.com/php/ ) zeigen die Seitenfelder nun den ersten Beitrag von jedem benutzerdefinierten Beitragstyp.

Arbeitscode:

 function custom_post_archive($query) { if ($query->is_archive){ $post_types = get_post_types(); $query->set( 'post_type', $post_types ); } remove_action( 'pre_get_posts', 'custom_post_archive' ); } add_action('pre_get_posts', 'custom_post_archive');