Stampa il numero di indice della posta corrente all'interno di Loop


17

Sto lavorando su WordPress, dove ho il seguente codice per ottenere messaggi all'interno del ciclo.

        <?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; ?>

Quali messaggi di output all'interno di loop hanno qualcosa del genere ...

Post Goes Here ....

Other Post Goes Here ....

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

Quello che voglio è stampare il numero indice dei post correnti all'interno del loop. Esempio

 1. Post Goes Here ....

 2. Other Post Goes Here ....

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

Come posso raggiungere questo obiettivo ? Grazie.

MODIFICARE

Ohh! Posso farlo in questo modo ..

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

C'è un altro / modo migliore?

Risposte:


16

In realtà voglio assegnare gli ID secondo l'indice postale!

Ecco il tuo codice che ho modificato.

<?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; ?>

Sembra che questa risposta abbia fornito l'essenza della risposta che ha portato alla soluzione.
Nuova Alessandria,

4

Se è solo una cosa estetica e non è necessario utilizzare la variabile count per ulteriore codifica, puoi semplicemente avvolgere i tuoi post in un oltag:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>

In realtà voglio assegnare gli ID secondo l'indice postale!
MANNDAaR,

@MANnDAaR, è esattamente quello che fa. Se il tuo loop ha 10 post, visualizzerai un elenco ordinato, numerato da 1 a 10. (vedi esempio qui )
mike23

3

per qualche motivo, hai già una variabile counter nel loop; se questo non viene utilizzato per altri scopi, basta fare eco:

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

1

Ciao, mi sono imbattuto in questo thread, chiedendomi come farlo. Ho scoperto che è dannatamente facile. Nel file modello principale, ad esempio index.php, dichiarare una variabile $ post_idx prima del ciclo e all'interno dell'incremento del ciclo quel var. Come questo:

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

Quindi nel tuo modello di contenuto (ad esempio content.php) che viene eseguito ogni volta all'interno del ciclo, rendi $ post_idx globale e poi usalo per le tue esigenze:

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

Questo è tutto!


È necessario aggiungere il prefisso alle variabili globali per evitare di nominare le collisioni.
fuxia

0

Stavo cercando di fare la stessa cosa, ma fuori dal giro. Fondamentalmente volevo essere in grado di scoprire l'indice di un post dal suo ID. Ecco cosa mi è venuto in mente:

<?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;
}

Questo era puramente per la progettazione in quanto il cliente voleva numeri accanto ai post, anche se il post era da solo in una casella "post in primo piano". Ho anche aggiunto uno zero utilizzando: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.


0

Anche se questa domanda è vecchia, la poserò qui nel caso in cui qualcuno proveniente da una Ricerca Google abbia bisogno di una risposta più flessibile.

Nel corso del tempo, ho sviluppato una soluzione WP_Queryo agnostica globale per le query. Quando usi un'abitudine WP_Query, sei limitato a usare solo includeo requirea essere in grado di usare le variabili sul tuo $custom_query, ma in alcuni casi (che sono la maggior parte dei casi per me!), Le parti del modello che creo vengono talvolta utilizzate in una query globale (come i modelli di archivio) o personalizzati WP_Query(come richiedere un tipo di post personalizzato in prima pagina). Ciò significa che ho bisogno di un contatore per essere accessibile a livello globale indipendentemente dal tipo di query. WordPress non lo rende disponibile, ma ecco come farlo accadere grazie ad alcuni hook.

Inseriscilo nel tuo function.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);

Il vantaggio di questa soluzione è che, quando si inserisce una query personalizzata e si ritorna nel ciclo generale, verrà ripristinato sul contatore corretto in entrambi i modi. Finché sei all'interno di una query (che è sempre il caso di WordPress, poco lo sapevi), il tuo contatore sarà corretto. Questo perché la query principale viene eseguita con la stessa classe!

Esempio :

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.