Créez des colonnes pour votre requête et un affichage facile
Dans les thèmes, il est probablement plus utile d'avoir quelque chose qui s'intègre bien dans les balises de modèle et la boucle. Ma première réponse ne s'est pas concentrée sur tant de choses. De plus, je pensais que c'était un peu trop compliqué pour une adoption rapide.
Une approche plus facile qui m'est venue à l' esprit était d'étendre "la boucle" avec des colonnes et est arrivée à cette solution jusqu'à présent:
Un objet WP_Query_Columns "étend" toute requête WP standard avec des colonnes qui peuvent être facilement itérées. Le premier paramètre est la variable de requête et le second paramètre est le nombre d'éléments à afficher par colonne:
<?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; ?>
Pour l'utiliser, il vous suffit d'ajouter la classe WP_Query_Columns de cet essentiel à vos thèmes function.php.
Utilisation avancée
Si vous avez besoin du numéro de colonne que vous affichez actuellement (par exemple pour certaines classes CSS paires / impaires, vous pouvez également l'obtenir auprès de foreach:
<?php foreach(new WP_Query_Columns($the_query, 10) as $column => $column_count) : ?>
Et le nombre total de colonnes est également 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>...
Vingt-dix exemple
Je pourrais rapidement pirater vingt-dix thèmes pour un test et ajouter des titres au-dessus de n'importe quelle boucle de cette façon. Il est inséré dans loop.php, le début est le code du thème:
<?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.
...
Pour une réponse plus longue:
(c'est essentiellement comme cela que je suis arrivé aux choses ci-dessus, mais explique mieux comment résoudre réellement le problème avec des opérations mathématiques simples. Ma nouvelle solution est d'itérer sur quelque chose de pré-calculé.)
Cela dépend un peu de ce dont vous avez réellement besoin pour résoudre le problème.
Par exemple, si le nombre d'éléments par colonne est égal à un, c'est très 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>
Même avec ce code simple, on peut voir qu'il y a plusieurs décisions à prendre:
- Combien d'articles sont dans une colonne?
- Combien d'articles y a-t-il au total?
- Y a-t-il une nouvelle colonne pour commencer?
- Et y a-t-il une colonne à terminer?
La dernière question est assez intéressante pour la sortie HTML car vous voulez probablement inclure non seulement des éléments mais aussi la colonne avec des éléments html.
Heureusement avec le code, nous pouvons définir tout cela dans des variables et créer du code qui calcule toujours selon nos besoins.
Et parfois même, nous ne pouvons même pas répondre à toutes les questions depuis le début. Par exemple, le nombre total d'éléments: y a-t-il, certains, plusieurs, un nombre exact qui correspond à un nombre entier de colonnes au total?
Même la réponse de Jan Fabry peut fonctionner dans certains cas (comme mon exemple ci-dessus pour le scénario d'un élément par colonne), vous pourriez être intéressé par quelque chose qui fonctionne pour n'importe quel nombre d'éléments retournés par WP_Query.
D'abord pour les mathématiques:
//
// 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
Ce code ne s'exécute pas, nous allons donc mettre cela dans un exemple de texte 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);
Cela fonctionne et fait déjà une sortie:
<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.
Cela simule déjà assez bien à quoi cela pourrait ressembler dans un modèle 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();
?>
(Je n'ai pas exécuté le dernier exemple dans un environnement WP, mais il devrait être au moins syntaxiquement correct.)