Crea colonne per la tua query e una facile visualizzazione
Nei temi è probabilmente più utile avere qualcosa che si adatta bene ai tag modello e al ciclo. La mia prima risposta non si è concentrata così tanto. Inoltre, ho pensato che fosse un po 'troppo complicato per una rapida adozione.
Un approccio più semplice che mi è venuto in mente è stato quello di estendere "il ciclo" con le colonne e finora è arrivato a questa soluzione:
Un oggetto WP_Query_Columns "estende" qualsiasi query WP standard con colonne che possono essere facilmente ripetute. Il primo parametro è la variabile di query e il secondo parametro è il numero di elementi da visualizzare per colonna:
<?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; ?>
Per usarlo, aggiungi semplicemente la classe WP_Query_Columns da questa sintesi al tuo function.php.
Uso avanzato
Se hai bisogno del numero di colonna che stai visualizzando (ad esempio per alcune classi CSS pari / dispari, puoi ottenerlo anche dal foreach:
<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>
E anche il numero totale di colonne è disponibile:
<?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>...
Venti dieci esempi
Potrei rapidamente hackare il tema ventitre per un test e aggiungere titoli sopra qualsiasi ciclo in questo modo. È inserito in loop.php, l'inizio è il codice del tema:
<?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.
...
Per una risposta più lunga:
(questo è fondamentalmente il modo in cui sono arrivato alla roba sopra, ma spiega meglio come risolvere effettivamente il problema con semplici operazioni matematiche. La mia nuova soluzione è quella di iterare su qualcosa di pre-calcolato.)
Dipende un po 'da quanto è effettivamente necessario per risolvere il problema.
Ad esempio, se il numero di elementi per colonna è uguale a uno, questo è molto semplice:
<?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>
Anche con quel semplice codice, si può vedere che ci sono più decisioni da prendere:
- Quanti elementi ci sono in una colonna?
- Quanti articoli ci sono in totale?
- C'è una nuova colonna da iniziare?
- E c'è una colonna da finire?
L'ultima domanda è piuttosto interessante per l'output HTML in quanto probabilmente si desidera racchiudere non solo gli elementi ma anche la colonna con elementi html.
Fortunatamente con il codice, possiamo impostare tutto ciò in variabili e creare codice che calcola sempre in base alle nostre esigenze.
E a volte anche, non possiamo nemmeno rispondere a tutte le domande dall'inizio. Per esempio, il conteggio degli elementi totali: esiste un conteggio multiplo esatto che corrisponde a un numero intero di colonne in totale?
Anche la risposta di Jan Fabry potrebbe funzionare in alcuni casi (come il mio esempio sopra fa per lo scenario di un articolo per colonna), potresti essere interessato a qualcosa che funziona per qualsiasi numero di articoli restituiti da WP_Query.
Primo per la matematica:
//
// 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
Quel codice non viene eseguito, quindi inseriamolo in un semplice esempio di testo
//
// 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);
Questo effettivamente funziona e fa già qualche output:
<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.
Questo simula già abbastanza bene come potrebbe apparire in un modello di wordpress:
//
// 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();
?>
(Non ho eseguito l'ultimo esempio in un ambiente WP, ma dovrebbe essere almeno sintatticamente corretto.)