如何解决WordPress调试post_content非对象报错及锚点跳转滚动异常问题
问题根因
你遇到的PHP报错是aThemes Blocks插件的代码逻辑缺陷导致的:代码在读取全局$post对象的post_content属性前,没有判断$post是否为有效的WP_Post对象。当站点首页是自定义首页、最新文章列表页这类没有初始化全局文章对象的场景时,$post为NULL,调用$post->post_content就会抛出Notice。
如果站点开启了调试模式显示错误,这个Notice会提前输出内容破坏页面结构,同时中断后续脚本加载逻辑,导致视差和平滑滚动相关的脚本没有正常加载,这就是锚点点击跳变不流畅的根本原因。
解决方案
临时修复方案(直接修改插件代码,快速生效)
找到路径wp-content/plugins/athemes-blocks/classes/class-athemes-blocks-init.php的第121行,在原有判断前新增$post有效性校验,修改后的代码段如下:
global $post; // 新增$post有效性判断,避免非对象报错 if ( is_a( $post, 'WP_Post' ) && strpos( $post->post_content, 'parallax' ) !== FALSE ) { wp_enqueue_script( 'athemes-blocks-parallax' ); } else { // 原有第123行及之后的逻辑保持不变
修改后保存文件,清空站点缓存即可生效。缺点是后续插件更新会覆盖修改,需要重新操作。
永久兼容方案(推荐,不受插件更新影响)
将以下代码添加到当前使用的Botiga主题的functions.php文件末尾即可,会自动替换插件有缺陷的脚本加载逻辑:
// 提前移除插件有问题的脚本挂载逻辑 add_action( 'wp_enqueue_scripts', function() { remove_action( 'wp_enqueue_scripts', [ 'aThemes_Blocks_Init', 'enqueue_scripts' ], 10 ); }, 9 ); // 重写兼容的视差脚本加载逻辑 add_action( 'wp_enqueue_scripts', function() { if ( is_admin() || is_customize_preview() ) { wp_enqueue_script( 'athemes-blocks-parallax' ); return; } global $post; $load_parallax = false; // 仅当$post为有效文章对象时才校验内容 if ( is_a( $post, 'WP_Post' ) ) { $load_parallax = strpos( $post->post_content, 'parallax' ) !== false; } // 文章内容未找到匹配则校验区块小工具 if ( !$load_parallax ) { $block_widgets = get_option( 'widget_block' ); if ( $block_widgets ) { foreach ( $block_widgets as $block_widget ) { if ( isset($block_widget['content']) && strpos( $block_widget['content'], 'wp:athemes/' ) !== false && strpos( $block_widget['content'], 'parallax' ) !== false ) { $load_parallax = true; break; } } } } if ( $load_parallax ) { wp_enqueue_script( 'athemes-blocks-parallax' ); } }, 10 );
滚动效果修复说明
PHP报错修复后,平滑滚动依赖的视差脚本可以正常加载,锚点点击的跳变问题会同步解决。如果修复后仍存在滚动异常,可以检查主题自定义设置中是否开启了平滑滚动选项,同时排查是否有其他JS脚本冲突。
内容的提问来源于stack exchange,提问作者Lucile
相关产品推荐
相关产品推荐

