Вывод текущего индекса записи внутри цикла
Я работаю с 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;
?>
Есть ли другой / лучший способ?
На самом деле я хочу назначать 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; ?>

Если это только вопрос эстетики и вам не нужно использовать переменную счетчика в дальнейшем коде, вы можете просто обернуть записи в тег ol
:
<?php if ( have_posts() ) : ?>
<ol>
<?php while ( have_posts() ) : the_post(); ?>
<li> <!-- Содержимое записи помещается здесь --> </li>
<?php endwhile; ?>
</ol>
<?php endif; ?>

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

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

Привет, я наткнулся на эту ветку, тоже интересовался, как это сделать. Оказалось, чертовски просто. В главном файле шаблона, например 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>";
Вот и всё!

Даже если этот вопрос старый, я оставлю это здесь на случай, если кому-то из поиска 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;

Я хотел сделать то же самое, но вне цикла. По сути, мне нужно было определить индекс записи по её 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) ?>
.
