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. Außerdem fand ich es etwas zu kompliziert für eine schnelle Adoption.
Ein einfacherer Ansatz, der mir in den Sinn kam, bestand darin, "die Schleife" mit Spalten zu erweitern und kam bisher zu dieser Lösung:
Ein WP_Query_Columns- Objekt "erweitert" jede Standard-WP-Abfrage um Spalten, die leicht 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) : ?>
<ul>
<?php while ($column_count--) : $the_query->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php endforeach; ?>
Um es zu verwenden, fügen Sie einfach die WP_Query_Columns-Klasse aus dieser Liste zu Ihrer Themes function.php hinzu.
Erweiterte Verwendung
Wenn Sie die Spaltennummer benötigen, die Sie gerade anzeigen (z. B. für einige gerade / ungerade CSS-Klassen, können Sie diese auch von foreach abrufen:
<?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) :
?>
<h2>Column <?php echo $column; ?>/<?php echo sizeof($the_columns); ?></h2>
<ul>...
Zehnundzwanzig Beispiel
Ich könnte schnell zehnundzwanzig Themen für einen Test hacken und auf diese Weise Überschriften über jeder Schleife hinzufügen. Es ist in 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() ) : ?>
<div id="post-0" class="post error404 not-found">
<h1 class="entry-title"><?php _e( 'Not Found', 'twentyten' ); ?></h1>
<div class="entry-content">
<p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'twentyten' ); ?></p>
<?php get_search_form(); ?>
</div><!-- .entry-content -->
</div><!-- #post-0 -->
<?php endif; ?>
<!-- WP_Query_Columns -->
<?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 ) : ?>
<ul>
<?php
while ( $column_count-- ) : the_post(); ?>
<li><h2 class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a></h2></li>
<?php endwhile; ?>
</ul>
<?php endforeach; ?>
<?php $wp_query = $query_copy;?>
<?php
/* Start the Loop.
...
Für eine längere Antwort:
(So bin ich im Grunde zu den obigen Dingen gekommen, erkläre aber besser, wie man das Problem tatsächlich mit einfachen mathematischen Operationen löst. Meine neue Lösung besteht darin, über etwas Vorberechnetes zu iterieren.)
Es hängt ein wenig davon ab, wie viel Sie tatsächlich benötigen, 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();?>
<ul>
<li>.. </li>
<ul>
<?php endwhile; wp_reset_query(); ?>
</ul>
Selbst mit diesem einfachen Code kann man sehen, dass mehrere Entscheidungen getroffen werden müssen:
- Wie viele Elemente befinden sich in einer Spalte?
- Wie viele Artikel gibt es insgesamt?
- Gibt es eine neue Spalte zu starten?
- Und gibt es eine Spalte zum Beenden?
Die letzte Frage ist für die HTML-Ausgabe ziemlich interessant, da Sie wahrscheinlich nicht nur Elemente, sondern auch die Spalte mit HTML-Elementen einschließen möchten.
Glücklicherweise können wir mit Code all dies in Variablen festlegen und Code erstellen, der immer unseren Anforderungen entspricht.
Und manchmal können wir sogar nicht jede Frage von Anfang an beantworten. Zum Beispiel die Anzahl der Gesamtelemente: Gibt es einige, mehrere, eine genaue Anzahl, die mit einer ganzzahligen Anzahl von Spalten insgesamt übereinstimmt?
Selbst die Antwort von Jan Fabry funktioniert in einigen Fällen (wie in meinem obigen Beispiel für das Szenario mit einem Element pro Spalte). Möglicherweise interessieren Sie sich für etwas, das für eine beliebige Anzahl von von WP_Query zurückgegebenen Elementen funktioniert.
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 ein einfaches Textbeispiel umwandeln
//
// 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("<start of Column: %d\n", $column);
}
printf(" * item %d\n", $count);
}
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
printf("/End of Column: %d\n", $column);
}
printf("Done. Total Number of Columns: %d.\n", $column);
Dies läuft tatsächlich und gibt bereits einige Ausgaben aus:
<start of Column: 1
* item 0
* item 1
* item 2
* item 3
...
* item 17
* item 18
* item 19
/End of Column: 1
<start of Column: 2
* item 20
* item 21
* item 22
...
* item 37
* item 38
* item 39
/End of Column: 2
<start of Column: 3
* item 40
* item 41
* item 42
...
* item 48
* item 49
* item 50
/End of Column: 3
Done. Total Number of Columns: 3.
Dies simuliert bereits 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('</ul>');
}
if ($isStartOfNewColum) {
printf('<ul class="col-%d">', $column);
}
?>
<li> ... make your day ...
</li>
<?php endwhile; ?>
<?php
if ($count && !$isEndOfColumn && --$count === $itemsTotal) {
print('</ul>');
}
// 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 nicht in einer WP-Umgebung ausgeführt, aber es sollte zumindest syntaktisch korrekt sein.)