Imprimer le numéro d'index de poste actuel dans la boucle

17

Je travaille sur WordPress où j'ai le code suivant pour obtenir des messages 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; ?>

Quels messages de sortie 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 articles actuels 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.

ÉDITER

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

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

Existe-t-il un autre moyen / meilleur?

MANnDAaR
la source

Réponses:

16

En fait, je veux attribuer des ID selon l'index des messages!

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; ?>
Evan Mattson
la source
Il semble que cette réponse ait fourni l'essence de la réponse qui a conduit à la solution.
New Alexandria
4

Si c'est juste une chose esthétique et que vous n'avez pas besoin d'utiliser la variable count pour un codage supplémentaire, vous pouvez simplement envelopper vos messages dans une olbalise:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>
mike23
la source
En fait, je veux attribuer des ID selon l'index des messages!
MANnDAaR
@MANnDAaR, c'est exactement ce qu'il fait. Si votre boucle a 10 messages, vous verrez une liste ordonnée, numérotée de 1 à 10. (voir l'exemple ici )
mike23
3

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-le simplement écho:

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

Salut, je suis tombé sur ce fil, me demandant comment faire cela aussi. J'ai découvert que c'était vraiment facile. Dans le fichier modèle principal, par exemple index.php, déclarez une variable $ post_idx avant la boucle, et dans l'incrément de boucle var. 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 global et utilisez-le selon vos besoins:

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

C'est ça!

Jerry303
la source
Vous devez préfixer les variables globales pour éviter de nommer les collisions.
fuxia
0

Je cherchais à faire la même chose, mais en dehors de la boucle. Fondamentalement, je voulais pouvoir trouver l'index d'une publication à partir de son ID. Voici ce que j'ai trouvé:

<?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 pour la conception car le client voulait des numéros à côté des articles, même si l'article était seul dans une boîte "article vedette". J'ai aussi ajouté un zéro en utilisant: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.

bouée
la source
0

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

Au fil du temps, j'ai développé une solution WP_Queryagnostique pour être ou requête globale. Lorsque vous utilisez une personnalisation WP_Query, vous êtes limité à utiliser uniquement includeou requireà pouvoir utiliser les variables sur votre $custom_query, mais dans certains cas (ce qui est le plus souvent le cas pour moi!), Les parties de modèle que je crée sont parfois utilisées dans une requête globale (tels que les modèles d'archives) ou dans un format personnalisé WP_Query(comme interroger un type de message personnalisé sur la première page). 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 à certains crochets.

Placez ceci dans vos fonctions.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 est que, lorsque vous entrez dans une requête personnalisée et revenez dans la boucle générale, elle va être réinitialisée sur le bon compteur de toute façon. Tant que vous êtes dans une requête (ce qui est toujours le cas dans WordPress, vous ne le saviez pas), votre compteur va être correct. C'est parce que 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;
David Lapointe Gilbert
la source