You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress循环中$iNew自增输出为空及$i++输出方法咨询

嘿,我来帮你搞定这两个技术问题!

问题1:如何在循环中输出$i++?

既然第二个问题是PHP/WordPress场景,咱们默认说PHP里的写法哈。$i++是后置自增运算符,逻辑是「先使用变量当前值,再把变量加1」,所以在循环里用它输出序号,分两种常见场景:

  • 从0开始输出序号:
    先初始化$i为0,循环里直接输出$i++,第一次输出0,之后每次自动加1:

    $i = 0;
    while (/* 你的循环条件,比如 $i < 5 */) {
        echo $i++; // 输出0 → 1 → 2...
    }
    
  • 从1开始输出序号:
    要么初始化$i为1,用$i++;要么初始化$i为0,用前置自增++$i(先加1再输出):

    // 写法1
    $i = 1;
    while (/* 循环条件 */) {
        echo $i++; // 输出1 → 2 → 3...
    }
    
    // 写法2
    $i = 0;
    while (/* 循环条件 */) {
        echo ++$i; // 先把$i变成1再输出,结果也是1 → 2 → 3...
    }
    

注意:一定要在循环外面初始化$i,不然每次循环都会重置变量,输出的永远是初始值。

问题2:WordPress中$iNew输出为空的问题

你这是踩了变量作用域的坑!咱们一步步拆解:

问题根源

你在主循环里定义的$iNew是局部变量,但get_template_part()函数会在一个独立的作用域里加载模板文件——也就是说,模板里根本访问不到主循环里的$iNew,所以输出的就是空span。

解决方法(按WordPress规范排序)

方法1:用set_query_var()传递变量(最推荐)

这是WordPress官方推荐的变量传递方式,避免全局变量污染:

  • 主循环里,调用get_template_part()之前把$iNew传进去,然后再自增:
    <?php 
    $count = 0; 
    $iNew = 0; 
    $query = new WP_query('posts_per_page=3'); 
    while( ($count < 3) && ($query->have_posts()) ) : 
        $query->the_post(); 
        if (!in_array($post->ID, $ids)){ 
            $ids[] = $post->ID; 
            $count++; 
            // 传递变量到模板
            set_query_var('iNew', $iNew);
            get_template_part( 'template-parts/content', 'art-small-new' ); 
            // 传递后再自增,保证下一篇文章编号+1
            $iNew++;
        } 
    endwhile; 
    ?>
    
  • 模板文件里用get_query_var()获取变量:
    <span class="iNew"><?php echo get_query_var('iNew'); ?></span>
    

方法2:用全局变量(简单直接)

把$iNew声明为全局变量,让模板能访问到:

  • 主循环里声明全局:
    <?php 
    global $iNew; // 声明为全局变量
    $count = 0; 
    $iNew = 0; 
    $query = new WP_query('posts_per_page=3'); 
    while( ($count < 3) && ($query->have_posts()) ) : 
        $query->the_post(); 
        if (!in_array($post->ID, $ids)){ 
            $ids[] = $post->ID; 
            $count++; 
            get_template_part( 'template-parts/content', 'art-small-new' ); 
        } 
    endwhile; 
    ?>
    
  • 模板文件里也要声明全局再输出:
    <span class="iNew"><?php global $iNew; echo $iNew++; ?></span>
    

方法3:用include代替get_template_part()(不推荐但简单)

include会继承当前作用域,所以模板能直接访问$iNew:

  • 主循环里替换:
    // 把 get_template_part(...) 换成下面这行
    include(locate_template('template-parts/content-art-small-new.php'));
    
  • 模板里直接用原来的代码就行:
    <span class="iNew"><?php echo $iNew++; ?></span>
    

额外检查点

如果上面的方法都没用,看看是不是PHP短标签没开启:把模板里的<? echo ... ?>改成完整的<?php echo ... ?>,避免因为短标签禁用导致代码不执行。


内容的提问来源于stack exchange,提问作者Patryk LL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:23:14