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
相关产品推荐
相关产品推荐

