WP DEVELOP

EP048. “Page Banner 加两个防护条件(避免 Archive 页错误抓图)”

首页 WordPress 开发课程 自定义字段与 PHP WARNING · EP048
约 6 分钟· #EP048#自定义字段与 PHP WARNING
🔒 登录后可标记已读

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