获取随机广告类文章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
相关产品推荐
相关产品推荐

