Печать текущего номера индекса в цикле


17

Я работаю над WordPress, где у меня есть следующий код для получения сообщений в цикле.

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

Какой вывод сообщений внутри Loops примерно так ...

Post Goes Here ....

Other Post Goes Here ....

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

То, что я хочу, это напечатать текущий номер индекса в цикле. пример

 1. Post Goes Here ....

 2. Other Post Goes Here ....

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

Как я могу достичь этого? Благодарю.

РЕДАКТИРОВАТЬ

Ооо! Я могу сделать это таким образом ..

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

Есть ли другой / лучший способ?

Ответы:


16

На самом деле я хочу назначить идентификаторы по почтовому индексу!

Вот ваш код, который я изменил.

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

Кажется, что этот ответ обеспечил суть ответа, который приводит к решению.
Новая Александрия

4

Если это просто эстетика, и вам не нужно использовать переменную count для дальнейшего кодирования, вы можете просто обернуть свои сообщения в olтег:

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

    <ol>

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

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

        <?php endwhile; ?>

    </ol>

<?php endif; ?>

На самом деле я хочу назначить идентификаторы по почтовому индексу!
MANnDAaR

@MannDAaR, это именно то, что он делает. Если ваш цикл содержит 10 сообщений, вы увидите упорядоченный список, пронумерованный от 1 до 10. (см. Пример здесь )
mike23

3

по какой-то причине у вас уже есть переменная counter в цикле; если это не используется для других целей, просто повторите это:

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

1

Привет, я наткнулся на эту тему, интересно, как это сделать тоже. Выяснилось, что это чертовски легко. В главном файле шаблона, например index.php, объявите переменную $ post_idx перед циклом, а внутри приращения цикла - var. Как это:

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

Затем в вашем шаблоне контента (например, content.php), который выполняется каждый раз внутри цикла, просто сделайте $ post_idx глобальным и затем используйте его для своих нужд:

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

Это оно!


Вы должны использовать префикс глобальных переменных, чтобы избежать конфликтов имен.
fuxia

0

Я хотел сделать то же самое, но за пределами цикла. По сути, я хотел узнать индекс поста по его идентификатору. Вот что я придумал:

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

Это было сделано исключительно для дизайна, так как клиент хотел иметь номера рядом с сообщениями, даже если сообщение находилось само по себе в поле «Избранные сообщения». Я также добавил ведущий нуль с помощью: <?php echo str_pad(sleek_get_post_index($post), 2, '0', STR_PAD_LEFT) ?>.


0

Даже если этот вопрос старый, я уложу его здесь на тот случай, если кому-то из поиска Google понадобится более гибкий ответ.

Со временем я разработал решение, которое будет WP_Queryнезависимым от глобальных запросов. Когда вы используете кастом WP_Query, вы ограничены в использовании только includeили requireв возможности использовать переменные в вашем $custom_query, но в некоторых случаях (которые в большинстве случаев для меня!) Части шаблона, которые я создаю, иногда используются в глобальном запросе. (например, шаблоны архивов) или в пользовательском режиме WP_Query(например, запрос пользовательского типа сообщения на главной странице). Это означает, что мне нужен счетчик, который будет доступен глобально, независимо от типа запроса. WordPress не делает это доступным, но вот как это сделать, благодаря некоторым хукам.

Поместите это в ваши 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);

Прелесть этого решения в том, что когда вы входите в пользовательский запрос и возвращаетесь в общий цикл, он в любом случае будет сброшен на правильный счетчик. Пока вы находитесь внутри запроса (который всегда имеет место в WordPress, мало что вы знали), ваш счетчик будет правильным. Это потому, что основной запрос выполняется с тем же классом!

Пример :

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.