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

WordPress升级后出现非对象属性获取提示,如何解决全局变量与数组配合问题?

解决WordPress升级后出现的Notice错误及问题解析

嘿,我来帮你把这个问题掰明白~

问题原因

你遇到的Notice: Trying to get property of non-object错误,核心原因是**user_can_richedit这个钩子触发的时机太早了**:

  • 这个过滤器在WordPress后台初始化的早期就会执行,比如你打开后台首页、用户管理页面这些不是编辑文章的场景时,全局变量$post还没有被赋值为有效的文章对象(甚至可能是null)。
  • 这时候你直接访问$post->ID,就相当于在一个不存在的对象上找属性,PHP自然会抛出警告。

正确的修复方案

你之前修改的思路不对,不能随便给$post赋值数组,而是要先确保$post是有效的文章对象,再去判断ID。这里给你两种可靠的写法:

写法一:检查当前屏幕(更稳妥)

利用WordPress的get_current_screen()函数,先确认当前是在文章编辑页面,再获取文章ID:

add_filter( 'user_can_richedit', 'disable_my_richedit' );
function disable_my_richedit( $default ) {
    // 获取当前后台屏幕对象
    $screen = get_current_screen();
    
    // 验证:是文章编辑页面 + 存在文章ID
    if ( $screen && $screen->base === 'post' && isset( $screen->post_id ) ) {
        // 目标文章ID列表
        $target_post_ids = array(19909, 20148, 20150);
        if ( in_array( $screen->post_id, $target_post_ids ) ) {
            return false; // 禁用可视化编辑器
        }
    }
    
    return $default; // 其他情况保持默认设置
}

写法二:直接验证$post对象

如果你还是想用$post全局变量,一定要先检查它是不是有效的WP_Post对象:

add_filter( 'user_can_richedit', 'disable_my_richedit' );
function disable_my_richedit( $default ) {
    global $post;
    
    // 先确保$post是合法的文章对象,再判断ID
    if ( $post instanceof WP_Post && in_array( $post->ID, array(19909, 20148, 20150) ) ) {
        return false;
    }
    
    return $default;
}

为什么脚本还能运行?

这个问题很好理解:
PHP的错误分为不同级别,你遇到的是Notice(通知)级别的非致命错误,这类错误只会在页面输出警告信息,但不会中断程序的执行流程。

  • 当你在编辑目标文章时,$post是有效的对象,代码能正常执行,禁用编辑器的逻辑生效;
  • 当你在其他页面时,虽然会抛出Notice,但程序还是会继续走下去,返回默认的$default值,所以整体功能不受影响。

内容的提问来源于stack exchange,提问作者AA-T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:44:05