Wie man eine Schleife in mehrere Spalten aufteilt

Wenn ich eine Schleife habe, die von einer Kategorie-Abfrage wie folgt ausgeführt wird:

 
    have_posts()) : $the_query->the_post();?>
  • ..

Wie würde ich eine if-Klausel erstellen, die die Liste in einem bestimmten Intervall unterbricht und eine neue beginnt. Also zum Beispiel am 10. post, gib ein

und fange ein neues an

    um 11.

    Das ist falsch, aber um mein Ziel zu veranschaulichen:

     <?php $count =0; while($count <=50){ if ($count == 9){ echo "
  • <a href='https://wordpress.stackexchange.com/questions/9308/how-to-split-a-loop-into-multiple-columns/'>
"; } elseif ($count == 10){ echo "
  • <a href='https://wordpress.stackexchange.com/questions/9308/how-to-split-a-loop-into-multiple-columns/'>
  • "; } else { echo "
  • <a href='https://wordpress.stackexchange.com/questions/9308/how-to-split-a-loop-into-multiple-columns/'>
  • "; }

    Was ist der richtige Weg, diese Logik in die Schleife zu integrieren?

    Solutions Collecting From Web of "Wie man eine Schleife in mehrere Spalten aufteilt"

    Erstellen Sie Spalten für Ihre Abfrage und einfache Anzeige

    In Themen ist es wahrscheinlich nützlicher, etwas zu haben, das gut in Vorlagen-Tags und die Schleife passt. Meine erste Antwort konzentrierte sich nicht so sehr darauf. Außerdem dachte ich, dass es für eine schnelle Adoption etwas zu kompliziert ist.

    Ein einfacherer Ansatz, der mir in den Sinn kam, war die “Schleife” mit Spalten zu erweitern und zu dieser Lösung zu kommen:

    Ein WP_Query_Columns- Objekt “erweitert” jede Standard-WP-Abfrage um Spalten, die einfach durchlaufen werden können. Der erste Parameter ist die Abfragevariable und der zweite Parameter ist die Anzahl der Elemente, die pro Spalte angezeigt werden sollen:

     < ?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?> < ?php foreach(new WP_Query_Columns($the_query, 10) as $column_count) : ?>  < ?php endforeach; ?> 

    Um es zu verwenden, fügen Sie einfach die WP_Query_Columns-class aus diesem Gist zu Ihren Themes function.php hinzu.

    Erweiterte Verwendung

    Wenn Sie die Spaltennummer benötigen, die Sie gerade anzeigen (zB für einige gerade / ungerade CSS-classn, können Sie das auch von der foreach bekommen:

     < ?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?> 

    Und die Gesamtzahl der Spalten ist ebenfalls verfügbar:

     < ?php $the_columns = new WP_Query_Columns($the_query, 10); foreach($the_columns as $column => $column_count) : ?> 

    Column < ?php echo $column; ?>/< ?php echo sizeof($the_columns); ?>

      ...

    Zwanzig Zehn Beispiel

    Ich konnte schnell zehnundzwanzig Theme für einen Test hacken und auf diese Weise Schlagzeilen über jeder Schleife hinzufügen. Es ist in die Datei “loop.php” eingefügt, der Anfang ist der Code des Themas:

     < ?php /* If there are no posts to display, such as an empty archive page */ ?> < ?php if ( ! have_posts() ) : ?> 

    < ?php _e( 'Not Found', 'twentyten' ); ?>

    < ?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'twentyten' ); ?>

    < ?php get_search_form(); ?>
    < ?php endif; ?> < ?php ### Needs WP_Query_Columns --- see http://wordpress.stackexchange.com/q/9308/178 $query_copy = clone $wp_query; // save to restore later foreach( new WP_Query_Columns($wp_query, 3) as $columns_index => $column_count ) : ?> < ?php endforeach; ?> < ?php $wp_query = $query_copy;?> < ?php /* Start the Loop. ...

    Für eine längere Antwort:

    (Das ist im Grunde genommen, wie ich zu den obigen Dingen gekommen bin, aber erklärt besser, wie man das Problem mit einfachen mathematischen Operationen lösen kann. Meine neue Lösung besteht darin, über etwas vorberechnetes zu iterieren.)

    Es hängt ein bisschen davon ab, wie viel Sie tatsächlich brauchen, um das Problem zu lösen.

    Wenn beispielsweise die Anzahl der Elemente pro Spalte gleich eins ist, ist dies sehr einfach:

     < ?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?> < ?php while ($the_query->have_posts()) : $the_query->the_post();?> 
    • ..
      < ?php endwhile; wp_reset_query(); ?>

    Selbst mit diesem einfachen Code kann man sehen, dass mehrere Entscheidungen zu treffen sind:

    • Wie viele Artikel befinden sich in einer Spalte?
    • Wie viele Artikel gibt es insgesamt?
    • Gibt es eine neue Spalte zum Starten?
    • Und gibt es eine Spalte zu Ende?

    Die letzte Frage ist ziemlich interessant für HTML-Ausgabe, da Sie wahrscheinlich nicht nur Elemente, sondern auch die Spalte mit HTML-Elementen einschließen möchten.

    Zum Glück können wir mit Code alles in Variablen setzen und Code erstellen, der immer auf unsere Bedürfnisse zugeschnitten ist.

    Und manchmal können wir nicht einmal jede Frage von Anfang an beantworten. Zum Beispiel die Anzahl der gesamten Elemente: Gibt es irgendwelche, einige, mehrere, eine genaue Anzahl, die mit einer ganzzahligen Anzahl von Spalten zusammenpasst?

    Selbst die Antwort von Jan Fabry könnte in einigen Fällen funktionieren (wie in meinem obigen Beispiel für das Szenario mit einem einzelnen Element pro Spalte), könnten Sie an etwas interessiert sein, das für eine beliebige Anzahl von Elementen funktioniert, die von WP_Query zurückgegeben werden.

    Zuerst für die Mathematik:

     // // arithmetical example: // # configuration: $colSize = 20; // number of items in a column $itemsTotal = 50; // number of items (total) # calculation: $count = 0; // a zero-based counter variable $isStartOfNewColum = 0 === ($count % $colSize); // modulo operation $isEndOfColumn = ($count && $isStartOfNewColum) || $count === $itemsTotal; // encapsulation 

    Dieser Code wird nicht ausgeführt. Lassen Sie uns dies in einem einfachen Beispiel erläutern

     // // simple-text example: // $column = 0; // init a column counter for($count=0; $count< = $itemsTotal; $count++) { $isStartOfNewColum = 0 === ($count % $colSize); // modulo $isEndOfColumn = ($count && $isStartOfNewColum); $isStartOfNewColum && $column++; // update column counter if ($isEndOfColumn) { printf("/End of Column: %d\n", $column-1); } if ($isStartOfNewColum) { printf(" 

    Dies wird tatsächlich ausgeführt und gibt bereits eine Ausgabe aus:

      

    Dies simuliert schon ziemlich gut, wie es in einer WordPress-Vorlage aussehen könnte :

     // // wordpress example: // $count = 0; // init item counter $column = 0; // init column counter $colSize = 10; // column size of ten this time $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc'); $itemsTotal = $the_query->post_count; ?> < ?php while ($the_query->have_posts()) : $the_query->the_post();?> < ?php # columns display variables $isStartOfNewColum = 0 === ($count % $colSize); // modulo $isEndOfColumn = ($count && $isStartOfNewColum); $isStartOfNewColum && $column++; // update column counter if ($isEndOfColumn) { print('
'); } if ($isStartOfNewColum) { printf('
    ', $column); } ?>
  • ... make your day ...
  • < ?php endwhile; ?> < ?php if ($count && !$isEndOfColumn && --$count === $itemsTotal) { print('
'); } // You don't have to do this in every loop, just once at the end should be enough wp_reset_query(); ?>

(Ich habe das letzte Beispiel in einer WP-Umgebung nicht ausgeführt, aber es sollte mindestens syntaktisch korrekt sein.)

Dies ist eher eine allgemeine Programmierfrage, aber hier ist die Grundidee:

 < ?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?> 
    < ?php $post_counter = 0; while ($the_query->have_posts()) : $the_query->the_post(); $post_counter++; ?>
  • ..
  • < ?php if ( 0 == $post_counter % 10 ) { echo '
    '; } endwhile; ?>
< ?php // You don't have to do this in every loop, just once at the end should be enough wp_reset_query(); ?>

Es ist nicht notwendig, eine separate $wp_query->current_post zum Zählen zu erstellen, da die Abfrage var sie bereits zählt: $wp_query->current_post . Außerdem müssen Sie den endgültigen Eintrag in der Liste berücksichtigen, damit in Ihrem Markup kein leeres

    .

     < ?php $the_query = new WP_Query('showposts=21&orderby=title&order=asc'); echo "
      "; while ($the_query->have_posts()) : $the_query->the_post(); echo "
    • {$the_query->current_post}
    • "; // Note that the post is already counted in the $the_query->current_post variable when in the loop. Add one to translate array counting to real counts. // Jan's example didn't account for the final entry in the list. Don't want empty
        's hanging around if ((($the_query->current_post+1) % 10 == 0) && ($the_query->current_post+1 !== count($the_query->posts))): echo "
        "; endif; endwhile; echo "
      "; ?>

    Fügen Sie die function get_columns_array() zu Ihrer function.php hinzu. Sie können dann leicht über Ihre Spalten iterieren:

    In deinem Theme fährst du dann über die Spalten:

     < ?php $the_query = new WP_Query('cat=1&showposts=50&orderby=title&order=asc');?> < ?php foreach(get_columns_array($post_count) as $column_count) : ?>  < ?php endforeach; wp_reset_postdata(); ?> 

    Ich setze die Standardgröße einer Spalte auf 10. Mit dem zweiten Parameter kann man die Größe einer Spalte selbst bestimmen. Wie 7: get_columns_array($post_count, 7); .

    Hier ist ein weiterer Ansatz, den Sie ergreifen können:

     $article = 0; < ?php if (have_posts()) : ?> < ?php while (have_posts()) : the_post(); ?> < ?php $article = $article + 1; ?> < ?php if ($article % 3 == 1) echo '
    '; ?> < ?php if ($article % 3 == 0) echo '
    '; ?> < ?php endwhile;?> < ?php else: ?>

    ...

    < ?php endif; ?>