web-dev-qa-db-fra.com

Imprimer le numéro de poste actuel dans la boucle

Je travaille sur WordPress où j'ai le code suivant pour obtenir des publications dans la boucle.

        <?php
                $posts = $woo_options['woo_latest_entries'];
                query_posts('post_type=post&category_name=company');
                if ( have_posts() ) : while ( have_posts() ) : the_post(); $count++;

        ?>

        /// Post Content Goes Here //

        <?php endwhile; endif; ?>

Quelle sortie affiche dans Loops quelque chose comme ça ...

Post Goes Here ....

Other Post Goes Here ....

Another Post Goes Here ....
.....

Ce que je veux, c'est imprimer le numéro d'index des publications actuelles dans la boucle. Exemple

 1. Post Goes Here ....

 2. Other Post Goes Here ....

 3. Another Post Goes Here ....
 .....

Comment puis-je atteindre cet objectif ? Merci.

MODIFIER

Ohh! Je peux le faire de cette façon ..

<?php 
echo $wp_query->current_post +1; 
?>

Y a-t-il une autre/meilleure façon?

16
MANnDAaR

En fait, je souhaite attribuer des identifiants selon l’index de publication!

Voici votre code que j'ai modifié.

<?php

global $wp_query;

$posts = $woo_options['woo_latest_entries'];
query_posts('post_type=post&category_name=company');

if ( have_posts() ) : while ( have_posts() ) : the_post();  $count++;
    $index = $wp_query->current_post + 1;

?>
    <div id="my_post_<?php echo $index; ?>">

        <!-- Post Content Goes Here -->

    </div>

<?php endwhile; endif; ?>
14
Evan Mattson

S'il ne s'agit que d'une question esthétique et que vous n'avez pas besoin d'utiliser la variable count pour un codage ultérieur, vous pouvez simplement envelopper vos publications dans une balise ol:

<?php if ( have_posts() ) : ?>

    <ol>

        <?php while ( have_posts() ) : the_post(); ?>

            <li> <!-- Post Content Goes Here --> </li>

        <?php endwhile; ?>

    </ol>

<?php endif; ?>
4
mike23

pour une raison quelconque, vous avez déjà une variable de compteur dans la boucle; si cela n'est pas utilisé à d'autres fins, faites simplement écho:

<?php echo $count.'.'; ?> /// Post Content Goes Here // 
3
Michael

Salut, je suis tombé sur ce fil, me demandant comment faire cela aussi. J'ai découvert que c'était trop facile. Dans le fichier de modèle principal, par exemple index.php, déclarez une variable $ post_idx avant la boucle et incrémentez cette variable dans la boucle. Comme ça:

<?php $post_idx = 0; while ( have_posts() ) : the_post(); ?>
  <?php
    get_template_part( 'content', get_post_format() );
    $post_idx++;
  ?>
<?php endwhile; ?>

Ensuite, dans votre modèle de contenu (par exemple, content.php) qui est exécuté à chaque fois dans la boucle, créez simplement $ post_idx et utilisez-le ensuite selon vos besoins:

global $post_idx;
print "<p>{$post_idx}</p>";

C'est tout!

1
Jerry303

Je cherchais à faire la même chose, mais en dehors de la boucle. En gros, je voulais être capable de trouver l'index d'un article à partir de son identifiant. Voici ce que je suis venu avec:

<?php
function sleek_get_post_index ($post) {
    $allPosts = get_posts([
        'post_type' => $post->post_type,
        'numberposts' => -1
    ]);

    $index = 0;

    foreach ($allPosts as $p) {
        $index++;

        if ($p->ID == $post->ID) {
            break;
        }
    }

    return $index;
}

C’était purement à des fins de conception, car le client souhaitait avoir des numéros à côté des messages, même si ce dernier figurait lui-même dans une boîte "En vedette". J'ai également ajouté un zéro non significatif en utilisant: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.

0
powerbuoy

Même si cette question est ancienne, je vais la poser ici au cas où quelqu'un venant d'une recherche Google aurait besoin d'une réponse plus souple.

Au fil du temps, j'ai développé une solution qui s'appelle WP_Query ou est agnostique aux requêtes globales. Lorsque vous utilisez un WP_Query personnalisé, vous ne pouvez utiliser que include ou require pour pouvoir utiliser les variables de votre $custom_query, mais dans certains cas (qui sont la plupart du temps pour moi!), Les parties de modèle que je crée sont parfois utilisées dans une requête globale (telle que des modèles d'archive) ou dans un WP_Query personnalisé (comme interroger un type de publication personnalisé sur la page de couverture). Cela signifie que j'ai besoin d'un compteur pour être globalement accessible, quel que soit le type de requête. WordPress ne le rend pas disponible, mais voici comment y arriver grâce à quelques points d'ancrage.

Placez ceci dans votre functions.php

/**
 * Create a globally accessible counter for all queries
 * Even custom new WP_Query!
 */

// Initialize your variables
add_action('init', function(){
    global $cqc;
    $cqc = -1;
});

// At loop start, always make sure the counter is -1
// This is because WP_Query calls "next_post" for each post,
// even for the first one, which increments by 1
// (meaning the first post is going to be 0 as expected)
add_action('loop_start', function($q){
    global $cqc;
    $cqc = -1;
}, 100, 1);

// At each iteration of a loop, this hook is called
// We store the current instance's counter in our global variable
add_action('the_post', function($p, $q){
    global $cqc;
    $cqc = $q->current_post;
}, 100, 2);

// At each end of the query, we clean up by setting the counter to
// the global query's counter. This allows the custom $cqc variable
// to be set correctly in the main page, post or query, even after
// having executed a custom WP_Query.
add_action( 'loop_end', function($q){
    global $wp_query, $cqc;
    $cqc = $wp_query->current_post;
}, 100, 1);

La beauté de cette solution réside dans le fait que, lorsque vous entrez dans une requête personnalisée et que vous revenez dans la boucle générale, elle sera réinitialisée dans le bon sens. Tant que vous êtes à l'intérieur d'une requête (ce qui est toujours le cas dans WordPress, vous le saviez peu), votre compteur sera correct. En effet, la requête principale est exécutée avec la même classe!

Exemple :

global $cqc;
while(have_posts()): the_post();
    echo $cqc; // Will output 0
    the_title();

    $custom_query = new WP_Query(array('post_type' => 'portfolio'));
    while($custom_query->have_posts()): $custom_query->the_post();
        echo $cqc; // Will output 0, 1, 2, 34
        the_title();
    endwhile;

    echo $cqc; // Will output 0 again
endwhile;
0