ci4广告位重构核心是解耦与可控:新建ad_positions和ad_assignments独立表替代wp_options,用服务容器注入admanager实现缓存+条件渲染,后台精简为三层管理,前端仅需php钩子调用,支持灰度、回滚与异步同步。

WP广告管理插件臃肿,本质是功能堆砌与后台逻辑耦合过深所致;CI4(CodeIgniter 4)广告位后台重构不是简单迁移,而是借其轻量路由、服务容器和数据库抽象层,重新设计广告位的增删改查、状态控制与渲染策略。核心目标:解耦广告配置与前端展示,避免WordPress插件常见的“一改全崩”问题。
广告位模型需独立建表,不依赖wp_options
传统WP插件常把所有广告位配置塞进wp_options,导致查询慢、更新锁表、难以审计。CI4中应新建ad_positions表,字段包括:slug(唯一标识,如post_after_para_3)、name、status(active/draft/paused)、priority(用于排序)、created_at。再配ad_assignments关联表,定义某广告位在哪些页面类型(post、page、archive)或条件(用户登录态、设备类型)下生效——这比Ad Inserter的“规则引擎”更可控、更易测试。
后台界面用CI4 Admin模块分层实现
不用硬套WordPress仪表盘样式,而是用CI4的AdminController + 视图组件构建干净后台:
- 左侧导航仅保留「广告位列表」「投放管理」「日志审计」三项,砍掉冗余设置页
- 广告位列表页支持按
slug搜索、状态筛选、批量启停,操作响应走AJAX,不整页刷新 - 新增广告位时,用预设模板(如“文章内嵌”“侧边栏固定”“首页横幅”)生成基础字段,避免自由填空导致混乱
- 每个广告位编辑页只暴露必要字段:名称、位置标识、启用开关、最大展示次数(防刷),高级选项(如延迟加载、A/B分组)收进「展开设置」折叠区
前端渲染剥离JS依赖,用原生PHP钩子注入
不引入React/Vue,也不依赖插件自带的JS加载器。CI4控制器中通过service('adManager')->render($positionSlug)调用广告服务:
- 服务内部先查缓存(Redis键为
ad:position:{slug}),命中则直接返回HTML片段 - 未命中则查数据库+校验投放条件(如当前URL是否匹配白名单、用户是否已达曝光上限)
- 最终输出纯HTML,带
data-ad-id属性供后续统计埋点,不绑定任何框架事件 - 页面模板里只需写
<?php echo service('adManager')->render('header_banner'); ?>,清晰、无侵入
缓存与同步机制必须前置设计
WP插件常因缓存失效导致广告不显示。CI4方案中:
- 广告位变更时,自动清除对应Redis缓存,并触发异步任务刷新CDN边缘节点(如Cloudflare Page Rules API)
- 设置
ad_position_updated事件钩子,允许扩展监听(例如同步到Elasticsearch做投放分析) - 提供CLI命令
php spark ad:sync --force手动重载全部广告位配置,方便部署后快速验证
不复杂但容易忽略:CI4重构不是为了炫技,而是让广告系统可测、可灰度、可回滚。每次改动只影响单一广告位,而不是整个插件生态。











