建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

吐血整理:碰到 WordPress 致命错误,如何一步一步解决(WordPress用户角色权限详解)

GG网络技术分享 2025-03-18 16:13 0


吐血整理:碰到 WordPress 致命错误,如何一步一步解决

WordPress 用户最头疼的问题就是站点白屏打不开了,或者后台进不去了,这就是 WordPress 的致命错误,英文是 White Screen of Death(白屏错误),简称:WSoD。

同样类似的,使用 WPJAM Basic 插件的用户,问得最多的问题是:为什么开启 WPJAM Basic 之后,xxx 主题不可用,xxx 插件用不了呢?

其实这些都是因为兼容问题,造成了 WordPress 致命错误。一般我的建议是停用其他插件,换用默认主题,看看还有没有问题,然后一个一个排除

下面我们详细讲解一下什么是 WordPress 致命错误,我们怎么一步一步定位它和解决它。

什么是 WordPress 致命错误

就是网站平常访问没有问题,突然屏蔽成了白屏了,也可能因为使用不同的浏览器得到不同的错误信息,比如在 Chrome 浏览器下显示的 HTTP 500 错误:

如果火狐浏览器,那么就是白屏了,没有任何有用的信息:

如果 WordPress 开启了致命错误处理,那么就会显示下面的信息:

WordPress 的致命错误都是 PHP 代码错误引起,或者内存限制引起的,一般是一些错误的主题或者插件的代码,比如插件和主题使用了相同的函数,造成冲突了。

所以 WPJAM Basic 插件的大部分问题就是上面所说,其他插件或者主题使用和 WPJAM Basic 相同的函数或者类库,造成了冲突引起的。

那么怎么解决这些问题呢?

仅仅是本站还是所有站点?

如果服务器安装多个 WordPress,看看其他站点有没有问题,如果有同样的问题,可能是服务器出问题了,联系一下服务商,看看是不是线路或者服务器出问题了。

这也是我一直建议使用阿里云和腾讯云这类服务器,因为一般不会莫名出现这类问题,如果出现问题,他们也会很快修复。

如果仅仅是该站点的问题,那可能是真的是这个站点的代码出问题了,那就针对该站点就行深究了。

PHP 的内存限制造成的?

很多时候出现白屏是因为,PHP 脚本的执行需要大量的内存,而服务器的限制使得 PHP 脚本得不到满足,比如下面的错误代码,这种情况有可能是程序写了死循环了,或者真的需要那么大的内存。

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 2348617 bytes) in /www/xxx/wp-includes/plugin.php on line xxx

我们先尝试增大一下 PHP 脚本的内存限制看看能不能解决问题,在 wp-config.php 文件增加下面这行,把限制修改为 256M:

define( 'WP_MEMORY_LIMIT', '256M' );

文件权限引起问题?

还有一个可能引起白屏的原因可能是文件的权限和所有者,这个处理有点麻烦,如果不是很熟悉建议找个专业的人员帮你处理一下。

一般来说对于 WordPress 来说,文件的权限规则是:

  • 文件应该设置为 664 或者 644.
  • 文件夹应该设置为 775 或者 755.
  • wp-config.php 文件应该设置为 660, 600, 或者 644.

如果你可以使用 SSH 登录你的服务器,可以在 WordPress 根目录下的执行下面这行命令一次搞定:

sudo find . -type f -exec chmod 664 {} +

sudo find . -type d -exec chmod 775 {} +

sudo chmod 660 wp-config.php

WordPress 插件冲突了?

如果还不能解决问题,那么接下来,解决 WordPress 致命错误的方法就是先停用所有插件,一般来说一个站点挂了很大原因是一个有问题的插件。

1. 如果还能访问 WordPress 管理后台,最快的方法就是到后台的插件页,选择所有插件,在批量操作下拉菜单中选择停用。

如果停用所有插件之后可以解决问题,那么接下来我们要找出具体是哪个插件导致问题的,一般我们是通过一个一个激活插件来发现,每激活一个插件,在出问题的界面刷新一下,如果问题重现,我们就可以定位是哪个插件出的问题了。

2. 如果后台已经无法进入,那就只能通过 FTP 来处理了,进入网站的 wp-content 目录,然后再把 plugins 文件夹改成 plguins-old 目录。

改名之后检查一下网站是否可以访问,如果可以访问,那么接下来要一个一个检查插件了。把插件目录改回「plugins」,然后在插件目录中,对每个插件进行重命名的方法,来定位出问题的插件。

WordPress 主题不兼容?

如果问题不是插件引起,很可能是主题引起的,所以很多使用 WPJAM Basic 问题大部分是主题引起的,很多主题使用的函数和 WPJAM Basic 函数冲突了。

比如我在博客上介绍一些自己写的一些工具函数,这些函数都尽量 wpjam_ 开头了,但是有些主题没有改,直接拿过去用了,WPJAM Basic 插件里面也有,那么就冲突了。

1. 我们可以通过切换回 WordPress 默认的主题来定位问题,如果还能进入后台,那么进入「外观」-「主题」,选择一个默认的 WordPress 主题,比如最新的 2021:

然后在出问题的界面刷新一下,如果问题重现,那就是主题的问题。

2. 如果无法进入后台,处理方法和上一节处理插件一样的,使用 FTP 工具进入 wp-content 目录,重命名一下 themes 文件夹。

这样 WordPress 会自动使用最新的默认主题,比如现在就是 2021。最后测试,如果问题重现就是插件的问题了,如果确定是,可以考虑换个主题。

浏览器和 WordPress 的缓存有问题?

浏览器的缓存和插件的缓存也可能引起致命的错误,建议先清理掉。

如果你安装了缓存插件,比如 WP Rocket 或者 WP Super Cache,最快删除缓存的办法,通过插件的设置页面。

比如 WP Super Cache,在「设置」-「WP Super Cache」-「删除缓存」即可清理掉缓存。

如果无法进入 FTP,那么缓存的文件在 wp-content/caches 目录下,可以进入进行删除操作。

放大招:开启 WordPress Debug 模式

如果还不能解决问题,那就用最后的大招了,直接定位错误的 log,我们是忽略前面的方法直接用这个来解决的。

对于程序员来说,出现问题最重要的是知道是什么问题,问题的细节,具体的错误 log,这样就要开启 WordPress Debug 模式。

WordPress 提供了 WP_DEBUG WP_DEBUG_DISPLAY 和 WP_DEBUG_LOG 这三个常量让你应对各种情况,下面讲经常经常使用到的方法:

1. 如果是前台和后台空白,并且没有显示任何错误

打开 wp-config.php 文件,将原来的 WP_Debug 设置改成如下设置:

define('WP_DEBUG', true);

define('WP_DEBUG_DISPLAY', true);

这样就可以直接看到错误的信息:

Cannot redeclare get_posts() (previously declared in

/var/www/html/wordpress/wp-includes/post.php:1874) in

/var/www/html/wordpress/wp-content/plugins/test-plugin/test-plugin.php on line 38

比如上面的错误信息就是在 test-plugin 插件定义了 get_post 函数,这个函数 WP 内置了,函数名冲突了。

2. 错误是发生在某些后台进程,比如 cron job 或者微信自定义回复的时候,没法显示错误 log,我们可以把 log 保存到 debug 文件。

打开 wp-config.php 文件,将原来的 WP_Debug 设置改成如下设置:

define('WP_DEBUG', true);

define('WP_DEBUG_DISPLAY', false);

define('WP_DEBUG_LOG', true);

然后就可以在 wp-content/debug.log 文件中看到相应的错误信息了。

最后一定要记得,测试完了一定要改回去,就是:

define('WP_DEBUG', false);

不然,你的用户也会看到你的系统错误了,或者 wp-content/debug.log 很大,把你服务器的空间都用完。

附加技巧:增强 PHP 文本处理能力

如果还没有解决你的致命错误,并且错误是发生在文章编辑页,并且很小的概率是因为文章太长造成的。

如果是这种情况,我们可以尝试一下增加回溯和递归限制来增强 PHP 文本处理能力,在 wp-config.php 文件添加下面的代码:

/* 针对超长文章的技巧 */

ini_set('pcre.recursion_limit',20000000);

ini_set('pcre.backtrack_limit',10000000);

总结:耐心处理和提供 log

WordPress 出现了致命错误并不可怕,按照这篇文章提示的方法一步一步整理,总能解决问题的,所以也欢迎收藏本文,方便以后碰到问题方便处理。

同样使用 WPJAM Basic 出现问题之后,也不要惊慌失措,也不要直接来说出问题了,然后没有任何细节,这样谁也帮不了你,毕竟程序员也是凡人,不是神。

一般建议按照这里的方法先自己解决一遍,最后不行,只要给到相关的错误的 log(特别关注一下前面关于如何生成 log 的部分),我们都是可以帮忙定位到问题,然后解决的。

如果你使用的主机造成的问题,建议切换到阿里云和腾讯云,还是推荐使用我的链接,给我赚点佣金,才有更大动力写教程。

WordPress用户角色权限详解

WordPress默认5个用户角色,分别为:订阅者、贡献者、作者、编辑和管理员,每个角色拥有不同的后台控制权,我们可以自由添加新的角色或为已有角色分配不同的权限。

用户角色权限

可以打印全局变量 $wp_roles 来查看所有用户的权限和等级。

subscriber(订阅者)

等级:level_0

权限:

  • read:阅读

contributor(贡献者)

等级:level_1

权限:

  • edit_posts:添加文章;
  • delete_posts:删除自己的文章。

贡献者提交的文章需要编辑或管理员审核,审核发布后的文章不再有权限编辑。

author(作者)

等级:level_2

权限:

  • upload_files:上传文件;
  • edit_published_posts:编辑自己已发布的文章;
  • publish_posts:发布自己的文章;
  • delete_published_posts:删除自己已发布的文章。

editor(编辑)

等级:level_7

权限:

  • moderate_comments:审核评论;
  • manage_categories:管理分类;
  • manage_links:管理友情链接;
  • unfiltered_html:文章、评论允许发布带有HTML标记的内容;
  • edit_pages:编辑页面;
  • edit_others_pages:编辑其他用户添加的页面;
  • edit_published_pages:编辑已发布的页面;
  • publish_pages:编辑页面的发布状态;
  • delete_pages:删除页面;
  • delete_others_pages:删除其他用户添加的页面;
  • delete_published_pages:删除已发布的页面;
  • delete_private_pages:删除私密页面;
  • edit_private_pages:编辑私密页面;
  • read_private_pages:查看私密页面。
  • edit_others_posts:编辑其他用户的文章;
  • delete_others_posts:删除其他用户的文章;
  • delete_private_posts:删除私密文章;
  • edit_private_posts:编辑私密文章;
  • read_private_posts:阅读私密文章。

administrator(管理员)

等级:level_10

权限:

  • update_themes:上传主题;
  • install_themes:安装主题;
  • switch_themes:切换主题;
  • edit_themes:编辑主题;
  • edit_theme_options:编辑主题选项;
  • delete_themes:删除主题;
  • update_plugins:上传插件;
  • delete_plugins:删除插件;
  • install_plugins:安装插件;
  • activate_plugins:激活插件;
  • edit_plugins:编辑插件;
  • list_users:查看用户列表;
  • create_users:添加用户;
  • edit_users:编辑用户;
  • promote_users:用户角色权限管理;
  • remove_users:移除用户;
  • delete_users:删除用户;
  • unfiltered_upload:未过滤的上传;
  • edit_files:编辑文件;
  • manage_options:管理设置选项;
  • edit_dashboard:仪表盘管理;
  • update_core:更新主程序;
  • import:工具中的导入功能;
  • export:导出。

高级别的用户拥有低级别用户的所有权限。

权限简要概括

  • 订阅者:可以编辑个人资料,查看文章。
  • 贡献者:添加文章和删除待审核中的文章,相当于投稿。
  • 作者:上传文件,添加、编辑和删除自己的文章(无论是否已审核),相当于专栏作者。
  • 编辑:拥有所有文章、页面和评论的管理权限。
  • 管理员:拥有所有后台权限。

添加新的用户角色及权限

在WordPress的二次开发中,常常需要添加新的用户角色权限:

add_role(\\\'manager\\\', \\\'经理\\\', array(\\\'read\\\' => true,\\\'level_0\\\' => true,));

以上示例添加了一个名称为经理的角色,仅拥有订阅者权限。

当然,我们可以给新增的角色或已存在的角色添加权限:

$wp_roles->add_cap(\\\'manager\\\', \\\'edit_posts\\\');

以上示例给“经理”添加了编辑文章的权限,注意在函数中使用时,需要先引入全局变量$wp_roles:

global $wp_roles;

在二次开发中可能需要自定义一些权限,例如我之前的实体店铺会员系统中就用到了自定义权限:

$wp_roles->add_cap(\\\'manager\\\', \\\'delete_transactions\\\');

然后在对应功能页面判断当前用户是否具有该权限:

current_user_can(\\\'delete_transactions\\\')

还可以使用下面的方式判断是否为某个角色:

current_user_can(\\\'manager\\\');

删除用户角色及权限

用户权限的设置保存在wp_options表的wp_user_roles字段,添加/编辑/删除用户权限其实就是修改这个字段的值。

下面是删除订阅者权限的示例代码:

remove_role(\\\'subscriber\\\');

注意:无论何种情况下,不要删除管理员权限。一般来说,我们都不应该删除WordPress默认的角色,如果不小心删除了,可以在本地新安装一个WordPress,然后将wp_user_roles字段的值拷贝过来就可以了。

标签:

提交需求或反馈

Demand feedback