WordPress升级支持PHP 8.0全记录:从报错到完美运行

从泰国回来已1月有余,整理下心情,把生活节奏调整下,重新开启记录模式,第一步就是折腾博客,由于PHP 7.2已经在2020年停止安全支持,更重要的是,现在使用的WordPress很多老旧的皮肤和插件都无法支持,考量到安全问题,必须修正,这次就分享下修正的过程。
准备工作
升级调试前,一定要做好两件事,非常重要:
- 完整备份:网站文件和数据库各来一份
- 开启调试模式:在 wp-config.php 中添加:
|
1 2 3 |
define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); |
这样错误会记录到 /wp-content/debug.log,不会直接显示在页面上。
在主机后台切换到PHP 8.0
我使用的篱落主机,在后台控制面板 - 账号管理 - PHP设置中修改即可

修改完成后刷新主页,提示网站发生重大问题(白屏),这时在/wp-content/debug.log查看详细报错即可。
后面把报错文件发给AI,我使用的Deepseek,它会教你如何一步步解决,跟着做就好了,和以前对比,现在有了AI确实方便许多,以前都要通过搜索引擎,现在时代的变化真的大。
报错一:主题widget.php中的create_function
第一个致命错误指向主题的 widget.php:
PHP Fatal error: Uncaught Error: Call to undefined function create_function() in .../widget.php:58
create_function() 在PHP 7.2开始被废弃,8.0中彻底移除。这个函数在老主题中非常常见,用于动态创建函数。
修复方法:将 create_function 替换为匿名函数。
原代码:
|
1 |
add_action('widgets_init', create_function('', 'return register_widget("My_Widget");')); |
修改后:
|
1 |
add_action('widgets_init', function() { register_widget('My_Widget');}); |
我使用的Dream主题 widget.php 里有11处这样的代码,逐一替换后,错误消失,你也可以直接把代码发给AI,让AI修正后复制粘贴。
报错二:inc/default.php中的另一个create_function
网站能打开了,但后台又报错。检查日志,发现 inc/default.php 第53行还有一处
|
1 |
add_filter('login_headerurl', create_function(false, "return get_bloginfo('url');")); |
同样替换为匿名函数:
|
1 |
add_filter('login_headerurl', function() { return get_bloginfo('url');}); |
和报错一是同样的函数问题,替换即可。
报错三:插件Crayon Syntax Highlighter的兼容问题
代码高亮插件Crayon是另一个重灾区。日志显示多个错误:
- implode() 参数顺序问题
- get_class(null) 致命错误
- 正则表达式解析问题
这个插件已经很多年没更新了,手动修复起来太麻烦。AI推荐了社区分支——Urvanov Syntax Highlighter,它是Crayon的修复版,完美支持PHP 8。
解决方案:停用Crayon,安装并激活Urvanov Syntax Highlighter。旧文章中的代码块自动继承,不需要任何手动迁移,无缝切换。
报错四:comments-ajax.php中的$wpdb->escape
这个主题评论功能使用了自定义的AJAX处理文件,其中用到了已弃用的 $wpdb->escape():
|
1 |
comment_author = wpdb->escape($user->display_name); |
替换为 esc_sql():
|
1 |
comment_author = esc_sql(user->display_name); |
但是最后我禁用了这个主题自带的ajax,因为还会导致其他问题,现在采用原生的评论PHP,留言会立即刷新,不折腾了,懒得去修正,写博客主要是内容,评论区的交互方式也没那么重要。
报错五:登录框中的get_currentuserinfo
主题的登录框模板使用了 get_currentuserinfo(),这个函数在WordPress 4.5.0开始被弃用。
原代码:
|
1 2 |
global $user_ID; get_currentuserinfo(); |
修改为:
|
1 2 |
$current_user = wp_get_current_user(); $user_ID = $current_user->ID; |
报错六:主题自带的comments-ajax.js与原生评论冲突
文章页面评论区点击回复按钮,出现 undefined 错误,AI提示是主题自带的 comments-ajax.js 与WordPress原生的 comment-reply.js 冲突,主题的AJAX评论脚本覆盖了原生的 addComment.moveForm 函数,导致功能异常。
解决方案:在 functions.php 中注释掉 comments-ajax.js 的加载:
|
1 |
// wp_enqueue_script( 'comments-ajax-qt', get_template_directory_uri() . '/js/comments-ajax.js', array(), version, true); |
原生 comment-reply.js 完全够用,评论回复功能恢复正常。
总结
整个升级调试过程,核心就是一件事,学会使用AI,真的方便,包括这篇记录也是让AI写得大纲,我在进行二次修改。
分享这个记录是想想可能还有一些和我一样懒得更换主题和插件的WP博主,希望能帮到还没升级到PHP8.0的WordPress博主们。
坚持真的是一件很难的事情,后面会分享一些在泰国的趣事,那些我在泰国学到的东西。
End




