EP048. “Page Banner 加两个防护条件(避免 Archive 页错误抓图)”
🔒 登录后可标记已读pageBanner() 在归档类页面(比如 All Events 归档)上会出问题:如果归档列表里第一篇 event 的 ACF 背景图字段有值,pageBanner() 会把它误当成整个归档页的背景图。这一讲在 photo 判断的条件里追加 AND !is_archive() AND !is_home(),确保只有单篇文章/页面才会去读 ACF 自定义背景图,归档页和博客首页一律用默认的 ocean.jpg。
涉及文件
wp-content/themes/fictional-university-theme/functions.php(修改:pageBanner()函数内photo判断的条件)
代码实现
代码以 sources/Section 10/39-2021/39-end 里实际的 functions.php 为准:
// wp-content/themes/fictional-university-theme/functions.php
if (!$args['photo']) {
// 修改:条件里追加 AND !is_archive() AND !is_home(),避免归档页/博客首页误用第一篇文章的图
if (get_field('page_banner_background_image') AND !is_archive() AND !is_home()) {
$args['photo'] = get_field('page_banner_background_image')['sizes']['pageBanner'];
} else {
$args['photo'] = get_theme_file_uri('/images/ocean.jpg');
}
}
📌 核对时发现的一个出入,如实记录:这一讲书面材料(Brad 发的文字稿)里贴出的「修改后」代码,条件判断用的是 if (!isset($args['photo']))(也就是接着 EP047 的 isset() 修复往上加这个防护条件)。但我核对 39-2021/39-end 实际的 functions.php,发现这个文件里 photo 判断依然是 EP047 之前的写法 if (!$args['photo'])——isset() 的修复没有真的出现在这个代码包里,只有这一讲的防护条件 (AND !is_archive() AND !is_home()) 确实加进去了。换句话说:EP047 讲的 isset() 修复,从 EP047 一直到 EP049(即 38-end / 39-end / 40-end 三个代码快照)都没有真正体现在官方发的代码包里;只有 EP048 这个防护条件确实落地了。上面代码块用的是 39-end 里验证过的实际写法(!$args['photo'] + 新增防护条件),不是书面材料里假设已经用了 isset() 的版本。
Hook / Function 速查
| 名称 | 类型 | 用途 |
|---|---|---|
is_archive() | WP 内建 conditional tag | 判断当前是否在任何一种归档页(分类、作者、自定义文章类型归档等) |
is_home() | WP 内建 conditional tag | 判断当前是否是博客首页(未设置静态首页时的 posts 列表页,这里对应 index.php) |
常见坑
- All Events 归档页(或任何归档页)如果第一篇文章/事件有自定义背景图,
pageBanner()在修复前会把这张图错误地当成整个归档页的背景——这是这一讲原文明确提到、要在下一讲之前先修掉的坑。
延伸 / 后续讲座会用到
下一讲 EP049 会把 pageBanner() 套用到 archive-event.php 等项目里剩下的所有模板文件上,这个防护条件会在归档页大量生效。
Sources
Udemy:
- Become a WordPress Developer: Unlocking Power With Code — Section 10, EP048