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

获取随机广告类文章ID并跟踪已遍历项,解决数组被覆盖问题

问题分析与解决方案:避免随机广告文章重复展示且跟踪已遍历ID

为什么数组每次都会被覆盖?

你定义的$allPosts = array();是请求级变量——每次刷新页面或发起新请求时,PHP都会重新创建这个空数组,之前存储的已遍历ID会被完全清空,自然无法跟踪历史记录。

解决方案:用Session持久化已遍历ID

要跨请求保存已展示的文章ID,需要用PHP的Session来存储数据,Session会在用户会话周期内保留数据。下面是修改后的代码:

// 启动Session(WordPress环境下确保在输出前调用,可放在主题functions.php或当前代码开头)
if (!session_id()) {
    session_start();
}

// 初始化Session中的已遍历ID数组,不存在则设为空数组
if (!isset($_SESSION['allPosts'])) {
    $_SESSION['allPosts'] = array();
}

// 获取所有未展示过的广告文章总数,判断是否还有剩余
$remaining_args = array(
    'post_type' => 'Advertisement',
    'posts_per_page' => -1,
    'post__not_in' => $_SESSION['allPosts'],
    'fields' => 'ids' // 只获取ID,提升性能
);
$remaining_posts = new WP_Query($remaining_args);

if ($remaining_posts->have_posts()) {
    // 查询随机一篇未展示的广告文章
    $args = array(
        'post_type' => 'Advertisement',
        'posts_per_page' => 1,
        'orderby' => 'rand',
        'post__not_in' => $_SESSION['allPosts'] // 排除已展示的ID
    );

    $loop = new WP_Query($args); 

    while ($loop->have_posts()) : $loop->the_post();
        $current_id = get_the_ID();
        // 将当前ID加入Session数组
        $_SESSION['allPosts'][] = $current_id;
        echo $current_id; // 输出当前文章ID
    endwhile;

    // 重置查询
    wp_reset_postdata();
} else {
    // 所有广告文章都已展示过,可重置Session数组或提示信息
    echo "所有广告文章已展示完毕";
    // 如需重新开始,可取消下面的注释
    // unset($_SESSION['allPosts']);
}

代码说明

  • Session初始化:确保在每次请求时都能获取到之前存储的已遍历ID,不会每次都清空数组。
  • post__not_in参数:告诉WP_Query不要查询已经在Session数组里的文章,保证每篇只展示一次。
  • 剩余文章判断:先检查是否还有未展示的文章,避免查询空结果。
  • wp_reset_postdata():恢复WordPress的全局文章数据,避免影响后续查询。

内容的提问来源于stack exchange,提问作者B.Harrison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:01