Cree columnas para su consulta y visualización fácil
En los temas, probablemente sea más útil tener algo que se ajuste bien a las etiquetas de plantilla y al bucle. Mi primera respuesta no se centró tanto en eso. Además, pensé que es un poco demasiado complicado para una adopción rápida.
Un enfoque más fácil que se me ocurrió fue extender "el bucle" con columnas y llegar a esta solución hasta ahora:
Un objeto WP_Query_Columns "extiende" cualquier consulta WP estándar con columnas que se puedan iterar fácilmente. El primer parámetro es la variable de consulta y el segundo parámetro es el número de elementos que se mostrarán por columna:
<?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; ?>
Para usarlo, simplemente agregue la clase WP_Query_Columns de esta esencia a sus temas function.php.
Uso avanzado
Si necesita el número de columna que está mostrando actualmente (por ejemplo, para algunas clases CSS pares / impares, también puede obtenerlo desde el foreach:
<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>
Y el número total de columnas también está disponible:
<?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>...
Vigésimo ejemplo
Podría hackear rápidamente el tema de veinte diez para una prueba y agregar encabezados sobre cualquier bucle de esta manera. Se inserta en loop.php, el comienzo es el código 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.
...
Para una respuesta más larga:
(así es básicamente como llegué a las cosas anteriores, pero explica mejor cómo realmente resolver el problema con operaciones matemáticas simples. Mi nueva solución es iterar sobre algo precalculado).
Depende un poco de cuánto necesites realmente para resolver el problema.
Por ejemplo, si el número de elementos por columna es igual a uno, esto es muy simple:
<?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>
Incluso con ese código simple, se puede ver que hay que tomar múltiples decisiones:
- ¿Cuántos artículos hay en una columna?
- ¿Cuántos artículos hay en total?
- ¿Hay una nueva columna para comenzar?
- ¿Y hay una columna para terminar?
La última pregunta es bastante interesante para la salida HTML, ya que probablemente desee incluir no solo elementos sino también la columna con elementos html.
Afortunadamente con el código, podemos establecer todo esto en variables y crear código que siempre calcule según nuestras necesidades.
Y a veces incluso, ni siquiera podemos responder todas las preguntas desde el principio. Por ejemplo, el recuento del total de elementos: ¿hay alguno, algunos, múltiples, un recuento exacto que coincida con un número entero de columnas en total?
Incluso la respuesta de Jan Fabry podría funcionar en algunos casos (como lo hace mi ejemplo anterior para el escenario de un elemento por columna), es posible que le interese algo que funcione para cualquier cantidad de elementos devueltos por WP_Query.
Primero para las matemáticas:
//
// 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
Ese código no se ejecuta, así que pongámoslo en un ejemplo de texto simple
//
// 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);
Esto realmente se ejecuta y ya produce algunos resultados:
<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.
Esto ya simula bastante bien cómo podría verse en una plantilla de 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();
?>
(No he ejecutado el último ejemplo en un entorno WP, pero debería ser al menos sintácticamente correcto).