Imprima el número del índice de la publicación actual dentro del bucle


17

Estoy trabajando en WordPress donde tengo el siguiente código para obtener publicaciones dentro del bucle.

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

Qué salida se publica dentro de bucles algo como esto ...

Post Goes Here ....

Other Post Goes Here ....

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

Lo que quiero es imprimir el número de índice de las publicaciones actuales dentro del bucle. Ejemplo

 1. Post Goes Here ....

 2. Other Post Goes Here ....

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

Cómo puedo conseguir esto ? Gracias.

EDITAR

Ohh! Puedo hacerlo de esta manera ...

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

¿Hay alguna otra / mejor manera?

Respuestas:


16

En realidad, quiero asignar ID's según el índice de publicación.

Aquí está tu código que modifiqué.

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

Parece que esta respuesta proporcionó la esencia de la respuesta que condujo a la solución.
Nueva Alejandría

4

Si solo es algo estético y no necesita usar la variable de conteo para una mayor codificación, puede envolver sus publicaciones en una oletiqueta:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>

En realidad, quiero asignar ID's según el índice de publicación.
MANnDAaR

@MANnDAaR, eso es exactamente lo que hace. Si su ciclo tiene 10 publicaciones, verá una lista ordenada, numerada del 1 al 10. (vea el ejemplo aquí )
mike23

3

por alguna razón, ya tienes una variable de contador en el bucle; Si esto no se utiliza para otros fines, simplemente repítalo:

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

1

Hola, me topé con este hilo, preguntándome cómo hacerlo también. Descubrí que es muy fácil. En el archivo de plantilla principal, por ejemplo index.php, declare una variable $ post_idx antes del ciclo, y dentro del ciclo incremente esa var. Me gusta esto:

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

Luego, en su plantilla de contenido (por ejemplo, content.php) que se ejecuta cada vez dentro del ciclo, simplemente haga que $ post_idx sea global y luego úselo según sus necesidades:

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

¡Eso es!


Debes prefijar las variables globales para evitar nombrar colisiones.
fuxia

0

Estaba buscando hacer lo mismo, pero fuera del circuito. Básicamente, quería poder encontrar el índice de una publicación a partir de su ID. Esto es lo que se me ocurrió:

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

Esto fue puramente por diseño ya que el cliente quería números al lado de las publicaciones, incluso si la publicación estaba sola en un cuadro de "publicación destacada". También he añadido un cero usando: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.


0

Incluso si esta pregunta es antigua, la pondré aquí en caso de que alguien que venga de una Búsqueda de Google necesite una respuesta más flexible.

Con el tiempo, desarrollé una solución para ser WP_Queryindependiente de la consulta global. Cuando usa una costumbre WP_Query, está limitado a usar solo includeo requirepoder usar las variables en su $custom_query, pero en algunos casos (¡lo cual es la mayoría de los casos para mí!), Las partes de la plantilla que creo algunas veces se usan en una consulta global (como plantillas de archivo) o de forma personalizadaWP_Query (como consultar un tipo de publicación personalizada en la página principal). Eso significa que necesito un contador para ser accesible globalmente, independientemente del tipo de consulta. WordPress no hace que esto esté disponible, pero a continuación se explica cómo hacerlo posible gracias a algunos ganchos.

Coloque esto en sus funciones.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 belleza de esta solución es que, cuando ingrese una consulta personalizada y regrese al bucle general, se restablecerá en el contador correcto de cualquier manera. Mientras esté dentro de una consulta (que siempre es el caso en WordPress, poco sabía), su contador será correcto. ¡Esto se debe a que la consulta principal se ejecuta con la misma clase!

Ejemplo:

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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.