在循环中打印当前帖子索引号


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

里面的哪个Output循环这样的内容...

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

还有其他/更好的方法吗?

Answers:


16

实际上,我想根据帖子索引分配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;

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

        <!-- Post Content Goes Here -->

    </div>

<?php endwhile; endif; ?>

看来此答案提供了导致解决方案的答案的实质。
新亚历山大(Alexandria)

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

实际上,我想根据帖子索引分配ID!
曼德勒2011年

@MANnDAaR,这就是它的作用。如果您的循环中有10条帖子,您会看到一个有序列表,编号从1到10。(请参见此处的示例)
mike23 2011年

3

由于某种原因,您已经在循环中有了一个计数器变量;如果不将其用于其他目的,只需将其回显:

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

1

嗨,我碰到了这个线程,也想知道该怎么做。发现这很容易。在主模板文件中,例如index.php,在循环之前和循环内以var为增量声明变量$ 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>";

而已!


您应该为全局变量加上前缀,以避免命名冲突。
fuxia

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


0

即使这个问题很旧,我也会在这里提出,以防来自Google搜索的人需要更灵活的答案。

随着时间的推移,我开发了一个与WP_Query全局查询无关的解决方案。使用custom时WP_Query,您只能使用includerequire能够使用上的变量$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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.