Wydrukuj bieżący numer indeksu postu w pętli

17

Pracuję nad WordPress, gdzie mam następujący kod, aby uzyskać posty w pętli.

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

Które posty wyjściowe wewnątrz pętli coś takiego ...

Post Goes Here ....

Other Post Goes Here ....

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

Chcę wydrukować bieżący numer indeksu postów w pętli. Przykład

 1. Post Goes Here ....

 2. Other Post Goes Here ....

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

Jak mogę to osiągnąć? Dzięki.

EDYTOWAĆ

Och! Mogę to zrobić w ten sposób ...

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

Czy jest jakiś inny / lepszy sposób?

MANNDAaR
źródło

Odpowiedzi:

16

Właściwie chcę przypisać identyfikatory według indeksu postów!

Oto twój kod, który zmodyfikowałem.

<?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
źródło
Wygląda na to, że ta odpowiedź stanowi istotę odpowiedzi prowadzącej do rozwiązania.
Nowa Aleksandria,
4

Jeśli jest to tylko kwestia estetyczna i nie musisz używać zmiennej count do dalszego kodowania, możesz po prostu owinąć swoje posty oltagiem:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>
mike23
źródło
Właściwie chcę przypisać identyfikatory zgodnie z indeksem postu!
MANnDAaR
@MANnDAaR, właśnie to robi. Jeśli twoja pętla ma 10 postów, zobaczysz uporządkowaną listę, ponumerowaną od 1 do 10. (patrz przykład tutaj )
mike23
3

z jakiegoś powodu masz już zmienną licznika w pętli; jeśli nie jest to wykorzystywane do innych celów, po prostu powtórz:

<?php echo $count.'.'; ?> /// Post Content Goes Here // 
Michael
źródło
1

Cześć, wpadłem na ten wątek, zastanawiając się, jak to zrobić. Odkryłem, że to cholernie łatwe. W głównym pliku szablonu, na przykład index.php, zadeklaruj zmienną $ post_idx przed pętlą i wewnątrz przyrostu pętli, który var. Lubię to:

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

Następnie w szablonie treści (na przykład content.php), który jest wykonywany za każdym razem w pętli, po prostu ustaw $ post_idx globalnie, a następnie użyj go do swoich potrzeb:

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

Otóż ​​to!

Jerry303
źródło
Powinieneś poprzedzać zmienne globalne, aby uniknąć kolizji nazw.
fuxia
0

Chciałem zrobić to samo, ale poza pętlą. Zasadniczo chciałem być w stanie znaleźć indeks posta na podstawie jego identyfikatora. Oto, co wymyśliłem:

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

Było to wyłącznie do zaprojektowania, ponieważ klient chciał numery obok postów, nawet jeśli post sam był w polu „polecany post”. Dodałem też zero przy użyciu: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.

powerbuoy
źródło
0

Nawet jeśli to pytanie jest stare, położę je tutaj na wypadek, gdyby ktoś pochodzący z wyszukiwarki Google potrzebował bardziej elastycznej odpowiedzi.

Z biegiem czasu opracowałem rozwiązanie WP_Queryglobalne lub agnostyczne. Kiedy korzystasz z niestandardowego WP_Query, jesteś ograniczony do używania includelub requiremożliwości używania zmiennych na twoim $custom_query, ale w niektórych przypadkach (które są w większości przypadków dla mnie!), Części szablonu, które tworzę, są czasami używane w zapytaniu globalnym (np. szablony archiwum) lub niestandardowy WP_Query(np. zapytanie o niestandardowy typ postu na stronie głównej). Oznacza to, że potrzebuję licznika, aby był globalnie dostępny, niezależnie od rodzaju zapytania. WordPress nie udostępnia tego, ale oto, jak to zrobić, dzięki niektórym hakom.

Umieść to w pliku 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);

Zaletą tego rozwiązania jest to, że po wprowadzeniu niestandardowego zapytania i powrocie do ogólnej pętli zostanie ono zresetowane do odpowiedniego licznika w obu kierunkach. Tak długo, jak jesteś w zapytaniu (co zawsze dzieje się w WordPressie, niewiele wiedziałeś), twój licznik będzie poprawny. To dlatego, że główne zapytanie jest wykonywane z tą samą klasą!

Przykład:

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
źródło