迁移WordPress站点后遇wp_kses调用错误及数据库认证问题求助
问题根源及解决方案
一、PHP 8.0下wp_kses_allowed_html错误的根源
- PHP版本严格性差异:PHP 8.0对全局变量的初始化检查比PHP 7.3更严格。你的站点代码(可能是主题、自定义插件或mu-plugin)中使用了
CUSTOM_TAGS常量扩展WP的HTML标签白名单,但未正确初始化$allowedposttags、$allowedtags、$allowedentitynames、$allowedxmlentitynames这四个全局数组。PHP 7.3中未初始化的全局变量会被默认当作空数组处理,不会触发WP的错误检测;但PHP 8.0下未初始化变量会被识别为null,触发WP的_doing_it_wrong错误提示。 - 过时的自定义代码:部分旧代码仍在使用WP早期的
CUSTOM_TAGS常量方式修改允许的HTML标签,这种方式在高版本PHP+WP组合中已不被推荐,WP官方更建议使用过滤器钩子实现。
二、PHP 8.0下错误的解决步骤
- 定位问题代码:
- 检查主题的
functions.php文件、所有自定义插件、wp-content/mu-plugins目录下的文件,以及wp-config.php中是否存在定义CUSTOM_TAGS的代码,或者直接调用wp_kses_allowed_html的逻辑。 - 如果禁用插件和主题后错误仍存在,重点排查mu-plugin或wp-config.php中的自定义代码,甚至数据库中主题/插件选项里存储的PHP代码片段。
- 检查主题的
- 初始化全局数组:
在调用wp_kses_allowed_html或定义CUSTOM_TAGS的代码前,添加全局变量初始化逻辑:global $allowedposttags, $allowedtags, $allowedentitynames, $allowedxmlentitynames; // 确保变量为数组类型,避免null触发错误 $allowedposttags = is_array($allowedposttags) ? $allowedposttags : []; $allowedtags = is_array($allowedtags) ? $allowedtags : []; $allowedentitynames = is_array($allowedentitynames) ? $allowedentitynames : []; $allowedxmlentitynames = is_array($allowedxmlentitynames) ? $allowedxmlentitynames : []; - 替换为推荐的过滤器方式:
放弃使用CUSTOM_TAGS常量,改用WP官方推荐的wp_kses_allowed_html过滤器添加自定义标签,示例代码:add_filter('wp_kses_allowed_html', 'custom_whitelist_tags', 10, 2); function custom_whitelist_tags($allowed_tags, $context) { // 根据上下文添加自定义标签,比如针对文章内容的自定义标签 if ($context === 'post') { $allowed_tags['my-custom-tag'] = [ 'data-id' => [], 'class' => [] ]; } return $allowed_tags; }
三、PHP 7.3下数据库认证错误的根源及解决
根源
新服务器的PHP 7.3环境使用的MySQL驱动(如mysqli)与旧服务器存在差异,且数据库用户可能使用了PHP 7.3不支持的认证插件(如caching_sha2_password),导致连接失败。
解决步骤
- 修改数据库用户认证方式:
登录MySQL数据库,执行以下SQL语句,将用户认证方式切换为PHP 7.3支持的mysql_native_password:-- 替换为你的数据库用户名和主机(通常是localhost或%) ALTER USER 'wp_db_user'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的数据库密码'; FLUSH PRIVILEGES; - 检查PHP扩展配置:
确保PHP 7.3的php.ini文件中启用了mysqli或pdo_mysql扩展(旧的mysql扩展已废弃),取消相关扩展行的注释:extension=mysqli extension=pdo_mysql - 调整wp-config.php配置:
将DB_HOST从localhost改为127.0.0.1,避免本地套接字连接的兼容性问题:define('DB_HOST', '127.0.0.1');
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

