WordPress出现Call to a member function get_header_transparency() on null报错咨询
问题根因定位
报错Call to a member function get_header_transparency() on null的直接原因是add_body_classes方法调用$header_object的成员方法时,$header_object本身为空,具体触发逻辑如下:
- 从
PlayroomCoreHeaders类的定义可见,$header_object的赋值逻辑挂载在wp钩子对应的set_variables方法中,注释明确说明该逻辑依赖全局wp_query对象获取页面ID,仅在正常前端页面访问场景下会被正确初始化 - 从调用栈可判断报错发生在WordPress后台小工具页面的旧版小工具预览iframe场景,该场景下没有初始化前端页面对应的全局查询对象,
$header_object无法被正常赋值 - 原代码未对
$header_object做非空校验就直接调用成员方法,兼容性缺陷触发了致命错误
修复方案
- 优先级最高的修复是给
add_body_classes方法增加$header_object非空校验,修改后代码如下:
function add_body_classes( $classes ) { $header_object = $this->get_header_object(); $header_layout = playroom_core_get_post_value_through_levels( 'qodef_header_layout' ); $header_scroll_appearance = playroom_core_get_post_value_through_levels( 'qodef_header_scroll_appearance' ); $classes[] = ! empty( $header_layout ) ? 'qodef-header--' . $header_layout : ''; $classes[] = ! empty( $header_scroll_appearance ) ? 'qodef-header-appearance--' . $header_scroll_appearance : ''; // 新增非空判断,仅header对象存在时才追加对应样式类 if ( ! empty( $header_object ) ) { $classes[] = $header_object->get_header_transparency() ? 'qodef-header--transparent' : ''; $classes[] = $header_object->content_behind_header() ? 'qodef-content--behind-header' : ''; } return $classes; }
- 可选优化:限制
body_class过滤器仅在前端生效,避免后台场景执行不必要的逻辑,修改类构造函数中添加过滤器的代码即可:
// 原代码:add_filter( 'body_class', array( $this, 'add_body_classes' ) ); // 替换为以下代码 if ( ! is_admin() ) { add_filter( 'body_class', array( $this, 'add_body_classes' ) ); }
- 修复完成后验证:进入后台小工具页面确认功能恢复正常,访问前端站点确认header透明度、内容后置等原有样式功能不受影响即可。
内容的提问来源于stack exchange,提问作者Will Bodansky
相关产品推荐
相关产品推荐

