You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress菜单获取文章类型时触发致命错误的排查与解决

错误原因及解决方法

错误原因

  1. 数组索引未加引号(核心触发点):错误提示明确指向slug是未定义常量,说明实际代码中你大概率把数组索引写成了$current_post_type->rewrite[slug](未用单/双引号包裹slug)。PHP 7.4及之前会默认将无引号索引当作字符串常量处理并抛出警告,但PHP 8.0+会直接触发致命错误。
  2. 缺少容错判断:代码直接调用$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:35:23