Вывод текущего индекса записи внутри цикла

23 июн. 2011 г., 09:35:15
Просмотры: 59.2K
Голосов: 23

Я работаю с 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++;

?>

/// Здесь идет содержимое записи //

<?php endwhile; endif; ?>

Который выводит записи внутри цикла примерно так...

Здесь идет запись ....

Здесь идет другая запись ....

Здесь идет еще одна запись ....
.....

Я хочу вывести текущий индекс записи внутри цикла. Например:

1. Здесь идет запись ....

2. Здесь идет другая запись ....

3. Здесь идет еще одна запись ....
.....

Как я могу этого добиться? Спасибо.

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

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

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

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

0
Все ответы на вопрос 6
1
21

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

Вот ваш код, который я модифицировал.

<?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; // Получаем текущий индекс поста (начиная с 1)

?>
    <div id="my_post_<?php echo $index; ?>">

        <!-- Содержимое поста будет здесь -->

    </div>

<?php endwhile; endif; ?>
18 июл. 2012 г. 02:44:35
Комментарии

Похоже, этот ответ передал суть решения, которое привело к разрешению проблемы.

New Alexandria New Alexandria
30 мар. 2016 г. 19:38:53
2

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

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

    <ol>

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

            <li> <!-- Содержимое записи помещается здесь --> </li>

        <?php endwhile; ?>

    </ol>

<?php endif; ?>
23 июн. 2011 г. 10:12:10
Комментарии

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

MANnDAaR MANnDAaR
23 июн. 2011 г. 12:09:26

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

mike23 mike23
23 июн. 2011 г. 12:15:43
1

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

<?php echo $count.'.'; ?> /// Содержимое поста здесь // 
23 июн. 2011 г. 14:36:26
Комментарии

Абсолютно верно. Это все, что мне нужно было сделать. Используйте уже имеющуюся переменную $count. Спасибо

anthonyCam anthonyCam
28 июн. 2020 г. 18:23:10
2

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

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

Вот и всё!

18 июл. 2012 г. 01:36:49
Комментарии

Глобальные переменные следует префиксировать, чтобы избежать конфликтов именования.

fuxia fuxia
10 окт. 2012 г. 19:43:53

Это мой любимый ответ — заставьте WordPress работать на вас!

Jillian Hoenig Jillian Hoenig
9 окт. 2024 г. 22:32:59
1

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

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

Поместите это в ваш functions.php

/**
 * Создает глобально доступный счетчик для всех запросов
 * Даже для новых пользовательских WP_Query!
 */

// Инициализация переменных
add_action('init', function(){
    global $cqc;
    $cqc = -1;
});

// В начале цикла всегда убеждаемся, что счетчик равен -1
// Это потому, что WP_Query вызывает "next_post" для каждой записи,
// даже для первой, что увеличивает счетчик на 1
// (что означает, что первая запись будет иметь индекс 0, как и ожидается)
add_action('loop_start', function($q){
    global $cqc;
    $cqc = -1;
}, 100, 1);

// На каждой итерации цикла вызывается этот хук
// Сохраняем счетчик текущего экземпляра в нашей глобальной переменной
add_action('the_post', function($p, $q){
    global $cqc;
    $cqc = $q->current_post;
}, 100, 2);

// В конце каждого запроса очищаем, устанавливая счетчик
// в значение глобального запроса. Это позволяет переменной $cqc
// быть корректно установленной в главной странице, записи или запросе, даже после
// выполнения пользовательского 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; // Выведет 0
    the_title();

    $custom_query = new WP_Query(array('post_type' => 'portfolio'));
    while($custom_query->have_posts()): $custom_query->the_post();
        echo $cqc; // Выведет 0, 1, 2, 34
        the_title();
    endwhile;

    echo $cqc; // Снова выведет 0
endwhile;
25 июл. 2017 г. 16:25:07
Комментарии

Отлично! Возможно, это не самое правильное или лучшее решение для данного вопроса, но код очень полезен.

Corey Corey
11 мар. 2022 г. 23:21:14
0

Я хотел сделать то же самое, но вне цикла. По сути, мне нужно было определить индекс записи по её ID. Вот что у меня получилось:

<?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) ?>.

24 окт. 2016 г. 13:25:26