WP DEVELOP

EP047. “修复 Undefined array key 警告(isset() 用法)”

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

📌 验证情况特别说明:这一讲的内容我核对过 sources/Section 10/38-2021/38-end39-2021/39-end40-2021/40-end 三个代码资料夹的 functions.php,发现三个版本里 pageBanner() 都还是维持原来的 !$args['xxx'] 写法,没有一个包含这一讲要教的 isset() 修复。也就是说,官方发的这几个课程代码压缩包本身没跟上这一讲的修改(EP048 的「加防护条件」倒是有反映在 39-end/40-end 里,但那是在没有 isset() 的旧写法基础上加的)。所以跟本项目其它篇不一样,下面的代码块没有 -end 资料夹可以核对,是照着这一讲的 transcript 原文抄的——不过这一讲的 transcript 本身就是一篇写好的图文教程,前后代码都完整贴出来了,不是靠听写重建,可信度还可以,但请知悉这一点。

上一讲写的 pageBanner() 里,三处 if (!$args['title']) 这类判断在现代 PHP 里会报 "Undefined array key" Warning,因为直接访问一个可能不存在的数组键本身就是不被允许的。这一讲把这三处判断全部换成 isset($args['xxx'])用 PHP 专门设计好的工具去「检查键是否存在」,而不是直接硬碰它的值,从而消除警告。

[截图:修复前,前台页面顶部出现的"Undefined array key"PHP Warning 文字(页面 HTML 顶端)]

涉及文件

  • wp-content/themes/fictional-university-theme/functions.php (修改:pageBanner() 函数内 3 处判断条件)

代码实现

// wp-content/themes/fictional-university-theme/functions.php

// 修改:title 判断,! $args['title'] → !isset($args['title'])
if (!isset($args['title'])) {
    $args['title'] = get_the_title();
}

// 修改:subtitle 判断
if (!isset($args['subtitle'])) {
    $args['subtitle'] = get_field('page_banner_subtitle');
}

// 修改:photo 判断
if (!isset($args['photo'])) {
    if (get_field('page_banner_background_image')) {
      $args['photo'] = get_field('page_banner_background_image')['sizes']['pageBanner'];
    } else {
      $args['photo'] = get_theme_file_uri('/images/ocean.jpg');
    }
}

要点:

  • 只改了判断条件本身(!$args['xxx']!isset($args['xxx'])),函数体其余逻辑不变。
  • transcript 原文强调:这是很常见的坑,尤其是接手别人项目、或者把老项目升级到新版 PHP 环境时,经常会撞到这种警告,知道怎么用 isset() 处理是基本功。

Hook / Function 速查

名称类型用途
isset($var)PHP 内建 function检查变量(或数组键)是否存在且不为 null,不会因为键不存在而报警告

常见坑

  • 老版本 PHP 允许直接判断一个可能不存在的数组键(比如 !$args['title'])而不报错,但现代 PHP 会抛 "Undefined array key" Warning
  • 该用 isset() 的地方直接写 !$args['xxx'],就是这个警告的根源;改法就是把整个「获取键值」的动作换成「检查键是否存在」的动作

延伸 / 后续讲座会用到

下一讲 EP048 会在 photo 判断的条件里再加两个防护条件(AND !is_archive() AND !is_home()),避免归档页被第一篇文章的图片污染 banner;EP049 会把 pageBanner() 套用到项目里剩下的所有模板文件。

Sources

Udemy:

  • Become a WordPress Developer: Unlocking Power With Code — Section 10, EP047