WordPress菜单获取文章类型时触发致命错误的排查与解决
错误原因及解决方法
错误原因
- 数组索引未加引号(核心触发点):错误提示明确指向
slug是未定义常量,说明实际代码中你大概率把数组索引写成了$current_post_type->rewrite[slug](未用单/双引号包裹slug)。PHP 7.4及之前会默认将无引号索引当作字符串常量处理并抛出警告,但PHP 8.0+会直接触发致命错误。 - 缺少容错判断:代码直接调用
$post->ID和$current_post_type->rewrite,但在404页面、后台页面、自定义文章类型未正确注册等场景下,$post可能为null,$current_post_type可能为false,直接访问属性会引发额外错误。
解决方法
修改代码,补全引号并增加完整的容错判断:
add_action('nav_menu_css_class', 'add_current_nav_class', 10, 2 ); function add_current_nav_class($classes, $item) { global $post; // 先检查全局$post是否有效 if (empty($post) || !isset($post->ID)) { return $classes; } // 获取当前文章类型对象并校验有效性 $current_post_type = get_post_type_object(get_post_type($post->ID)); if (empty($current_post_type) || empty($current_post_type->rewrite) || !isset($current_post_type->rewrite['slug'])) { return $classes; } $current_post_type_slug = $current_post_type->rewrite['slug']; $menu_slug = strtolower(trim($item->url)); if (strpos($menu_slug, $current_post_type_slug) !== false) { $classes[] = 'current-menu-item'; } return $classes; }
关键修改点:
- 确保数组索引
['slug']始终用单引号包裹,避免PHP将其识别为未定义常量。 - 增加多层校验:先检查
$post是否存在,再校验$current_post_type和rewrite属性的有效性,避免空对象/空数组引发的错误。 - 非目标场景下提前返回原
$classes,不影响原有菜单类的正常输出。
内容的提问来源于stack exchange,提问作者Corneliatt
相关产品推荐
相关产品推荐

