Crie colunas para sua consulta e exibição fácil
Nos temas é provavelmente mais útil ter algo que se encaixe bem nas tags de modelo e no loop. Minha primeira resposta não se concentrou muito nisso. Além disso, achei um pouco complicado demais para uma adoção rápida.
Uma abordagem mais fácil que me veio à mente foi estender o "loop" com colunas e chegar a esta solução até agora:
Um objeto WP_Query_Columns "estende" qualquer consulta WP padrão com colunas que podem ser facilmente iteradas. O primeiro parâmetro é a variável de consulta e o segundo parâmetro é o número de itens a serem exibidos por coluna:
<?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 usá-lo, basta adicionar a classe WP_Query_Columns desta lista aos seus temas function.php.
Uso Avançado
Se você precisar do número da coluna que está exibindo no momento (por exemplo, para algumas classes CSS pares / ímpares, também é possível obtê-lo no foreach:
<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>
E o número total de colunas também está disponível:
<?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>...
Exemplo de vinte e dez
Eu poderia rapidamente invadir o tema vinte e dez para um teste e adicionar títulos acima de qualquer loop dessa maneira. Ele está inserido no loop.php, o começo é o código do 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 uma resposta mais longa:
(foi basicamente como cheguei ao assunto acima, mas explica melhor como realmente resolver o problema com operações matemáticas simples. Minha nova solução é iterar sobre algo pré-calculado.)
Depende um pouco do quanto você realmente precisa para resolver o problema.
Por exemplo, se o número de itens por coluna for igual a um, isso é muito simples:
<?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>
Mesmo com esse código simples, pode-se ver que há várias decisões a serem tomadas:
- Quantos itens estão em uma coluna?
- Quantos itens existem no total?
- Existe uma nova coluna para começar?
- E existe uma coluna para terminar?
A última pergunta é bastante interessante para a saída HTML, pois você provavelmente deseja incluir não apenas itens, mas também a coluna com elementos html.
Felizmente, com o código, podemos definir tudo isso em variáveis e criar código que sempre calcula nossas necessidades.
E, às vezes, nem podemos responder a todas as perguntas desde o início. Por exemplo, a contagem do total de itens: existe alguma, múltipla, uma contagem exata que corresponda a um número inteiro de colunas no total?
Mesmo a resposta de Jan Fabry pode funcionar em alguns casos (como meu exemplo acima funciona no cenário de um item por coluna), você pode estar interessado em algo que funcione para qualquer número de itens retornados pelo WP_Query.
Primeiro para a matemática:
//
// 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
Esse código não é executado, então vamos colocar isso em um exemplo de texto simples
//
// 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);
Isso realmente é executado e já produz alguma saída:
<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.
Isso já simula muito bem como poderia ser um modelo 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();
?>
(Não executei o último exemplo em um ambiente WP, mas deve estar pelo menos sintaticamente correto.)