Fügen Sie verschiedene Schleifenvorlagen in die Suchabfrage ein

Ich habe verschiedene benutzerdefinierte Post-Typen in meinem Blog.
Ich habe auch benutzerdefinierte Vorlagen für jede von ihnen wie Schleife – {$ cpt-name} .php
Ich möchte verschiedene cpt-Vorlagen dynamisch in den Suchergebnissen einbeziehen, je nachdem, welcher benutzerdefinierte Post-Typ im Moment in der Schleife post ist. Ich versuche es so zu machen (search.php):

ID ) == 'teams' ) { get_template_part( 'loop', 'teams' ); } elseif ( get_post_type ( $post->ID ) == 'players' ) { get_template_part( 'loop', 'players' ); } else { get_template_part( 'loop', 'search' ); } endwhile; ?> 

Das Problem ist jedoch, dass ich eine Infinitivschleife in einer Abfrage habe, wenn ich versuche, es so zu machen. Weil ich in der search.php- Datei den Post-Typ in der while-Schleife überprüfe und die Vorlage einschließe, wo ich auch while-statement habe (ich muss sie dort haben). Beispiel für meine CPT-Vorlage (Anfang):

 <?php /** * The loop that displays teams * */ if ( have_posts() ) while ( have_posts() ) : the_post(); 

Ich kam auf die Idee, für jeden gefundenen Beitrag in der Schleife eine zusätzliche Abfrage zu machen, so:

 while ( have_posts() ) : the_post(); if ( get_post_type ( $post->ID ) == 'teams' ) { query_posts('p='.$post->ID); get_template_part( 'loop', 'teams' ); wp_reset_query(); 

Aber ich nehme an, das würde die Suche in Zeiten verlangsamen. (habe noch nicht getestet)
Irgendwelche Vorschläge werden geschätzt.

Solutions Collecting From Web of "Fügen Sie verschiedene Schleifenvorlagen in die Suchabfrage ein"

Ich würde empfehlen, die Methode content- {posttype} .php zu verwenden, bei der Sie nur HTML-Markup, Vorlagen-Tags für Posts oder benutzerdefinierte Post-Typen haben und Loops außerhalb dieser Dateien lassen. Ein ausführlicheres Beispiel finden Sie in Twenty Eleven.

Nach dieser Änderung können Sie die search.php leicht ändern und spezifische Inhaltsmarkierungen basierend auf dem Post-Typ einfügen.

 if ( have_posts() ) : while ( have_posts() ) : the_post(); /** * Would include CPT content template (content-teams.php) if it exists * or content.php otherwise. */ get_template_part( 'content', get_post_type( $post ) ); endwhile; endif; 

Sie sind definitiv besser dran, wenn Sie nur eine Abfrage durchführen, aber es erfordert ein wenig Re-Architecture Ihrer benutzerdefinierten Post-Typ-Schleifen. Im Grunde würden Sie den Präsentationscode aus den Schleifen in neue Dateien verschieben (die wir “Partials” nennen). Anstelle von loop – {$ cpt-name} .php hätten Sie eine Datei partial – {$ cpt-name} .php .

Anstatt den Post-Typ aus der search.php zu checken, überprüfen Sie ihn in der loop-search.php, wo Sie die entsprechenden Partials enthalten, wenn sie existieren:

 < ?php while ( have_posts() ) : the_post(); $cpt = $post->post_type; $partial = "partial-{$cpt}.php"; if ( locate_template( $partial ) { include( locate_template( $partial ) ); } else { ?> 
Default Search loop output here for non-CPT posts
< ?php } endwhile; ?>

Sie würden dasselbe in Ihrer regulären Schleife tun, anstatt für jeden benutzerdefinierten Posttyp separate Schleifen zu verwenden. Wenn Sie weiterhin separate Schleifen verwenden möchten, importieren Sie die Teiltöne in diese CPT-Schleifen, anstatt den Präsentationscode anzugeben.