前后花费了三个晚上,我终于解决了Wordpress升级后,用户名、密码都正确,却无法登陆的问题。为了让后来者不吃二遍苦,不受二茬罪,我把解决的详细过程与思路,记录如下。
一、问题描述
这一问题,有几种描述方式,为了让搜索引擎能够找到这篇文章,我把各种常用的叫法汇集如下:
1、有以症状命名的,例如:wordpress无法登陆,密码正确、登录不了,锁到wordpress之外,可以访问、无法登录;
2、有以成因命名的,例如:wordpress升级出错,wordpress2.6升级无法登陆……
3、有以出错语句命名的,这种方式最多:
1) Warning: Invalid argument supplied for foreach() ……
2)capabilities.php on line 31
3)Warning: Cannot modify header information – headers already sent by (output started at……
4、一篇法国人写的著名的解决方案,是这样命名的:Invalid argument supplied for foreach() in wp-capabilities.php: Case Cracked!
(需要指出的是,这篇文章虽然被搜索得很多,但极具有误导性,害了不少人,我认为完全在胡说八道!下文会谈及)
5、有以痛苦感受命名的:天哪,我登陆不上博客了,救命啊,雪地翻跟头跪求……
用这种命名方式搜索,田螺姑娘都没办法帮你。
二、出错语句
出错信息除了上面描述的语句之外,还有其他形式,试搜集如下:
1、我的出错信息:
Warning: Invalid argument supplied for foreach() in /homepages/23/d208744272/htdocs/wp-includes/capabilities.php on line 31
Warning: Cannot modify header information – headers already sent by (output started at /homepages/23/d208744272/htdocs/wp-includes/capabilities.php:31) in /homepages/23/d208744272/htdocs/wp-includes/pluggable.php on line 552
Warning: Cannot modify header information – headers already sent by (output started at /homepages/23/d208744272/htdocs/wp-includes/capabilities.php:31) in /homepages/23/d208744272/htdocs/wp-includes/pluggable.php on line 689
2、以下大同小异,但肯定有这一句:
Warning: Invalid argument supplied for foreach() in /home/user/wp/wp-includes/capabilities.php on line 31
三、出错诱因
目前来看,这个问题大部分情况是发生在为wordpress升级时,不但从2.5升到wordpress2.6,也看到过从2.2或者更低版本升级,遇到这一情况的。
也有案例显示,安装时就出现这一错误。这个非常罕见。
四、出错原因
我不懂技术,网上有各种说法,有说是uft-8编码转换出了问题,有人说陷入死循环。
这些都不重要,重要的是解决办法,难道不是吗?
五、修改字符编码法,或set names utf8法
这种办法,网上最多。它提供的解决办法是:
第一步:用phpMyadmin后台,把字符编码修改为utf-8。这里要注意,如果你用的是mySql4.0话,当你把字符修改成utf-8后,它下次还会显示gb2312,甭理它,其实已经改好了,我的经验是这样。
还有人说,还应该设置数据库的”collation”为”utf8_general_ci”:因为在新的服务器中建立数据库时,没有指定其为utf-8,更没设定collation,所以需要先设定数据库的字符集。
执行命令:
alter database myblog
character set utf8;
然后再在”操作”或者数据库PhpMyAdmin的登陆页面中设定collation为”utf8_general_ci”。
第二步:修改/wp-includes/wp-db.php这个文件。
这一学派认为,毛病出在wp-db.php中,没有设定好utf-8为字符集,从而造成了一系列悲剧。因此,必须修改这个文件。这一学派又有下属三个分支流派:
流派一:在$this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);后面加上$this->query(“set names ‘utf8′”); 注意英文标点。
该学派认为,出错原因是wp-includes/capabilities.php里面$this->roles这个数组取到的是乱码。
流派二:就是害人的法国人的那个方案,他认为应该在上述同意位置,加上这一语句:mysql_query(“SET NAMES ‘utf8′”);,其实这是错误的!!
流派三:还有人主张$this->query(“set names ‘utf8′”);这个语句应该加到wp-db.php的另外一个位置;另外还要增加另外一处代码。我之所以,没有详细列出来,是因为这种办法根本无效。
我试过以上三种办法,最后保留了流派一的办法。
但我强烈怀疑,这种办法的有效性!!
六、胡说八道法,又名检查wp_options表法,又又名wp_user_roles法
这个办法是法国人发明的,他说,在phpMyadmin里,打开wp_options表,找到wp_user_roles一项,从中发现一个法语怪字符,Abonné,他认为正是这顶小帽子害得程序成为死循环,于是把它改成英文字符,于是立即神奇般地好了。
这个法国人还说了一句阿基米德的名言:Eurêka! ,希腊语,我找到了!真是糟蹋先贤。
实际上这个办法是最害人的。我照着把长达3公里的代码仔细检查,把所有中文都换成英文,结果依然故我。像这样被误导而浪费时间的不止我一个。
七、个别成功法,又名清除cookies法
有人骄傲地宣布,解决了wordpress2.6升级后无法登陆的问题,就是清除cookies。我试了,发现这个办法是无效的。
但这启发了我,有时候你意想不到的办法,反而就是正解。
八、有效办法,又名土耳其补丁法
我在彻底绝望的时候,做了几件事:把wordpress2.6删除,换回了wp2.5。
第二尝试数据库倒裤无果之后,我抱着试试看的办法,找到了这个帖子。
这是土耳其人写的一个小补丁,他说只对2.3.X版本有效。但根据我的经验,后续版本应该也可以兼容。
于是我下载了这个插件,http://file.dmry.net/blog/01/wp_user_roles_yama.zip
解压后,将它放到wordpress安装根目录下。就是这副样子:(http://your_blog_url../wp_user_roles.php)
然后敲入上述网址:http://your_blog_url../wp_user_roles.php
满屏都是字符串。
等尘埃落定,我不敢相信,我真的做到了,我又可以自由登陆我心爱的WORDPRESS了。
[…] ( 我是如何解决Wordpress无法登陆问题的 […]
晕,我现在的博客就登陆不了。
擦 我也遇到了这个问题 前几天还正常的啊 怎么突然就不能登陆了呢
我一个朋友遇到的问题更是离奇,无法异地登录WordPress,在家里面却可以登录,博主知道这是什么原因么?
东东,我最近把easyphp换到最新版,问题不断,只要换了主题,就彻底出错没法用了,到现在还没解决
一会儿好用,一会儿不好用,还没解决,郁闷死了
支持
不知道哪个办法适合我的情况,试了以上5种不起作用,最后一个竟然下载不了,咋办
感谢分享。终于找到了解决方案了。非常感谢楼主!!
郁闷死了,我的站也是这样的.居然也登录不上
大佬,我用那个土耳其的人怎么不管用呢? 就是登陆无效,也不报错~~~~~~
提醒一句:记得之前在 2.5 下你用过这个插件 http://www.nimab.org/2008/05/01/39.html ,升级后可以先去掉。
还没看 2.6 的代码,但是在本地测试, 2.6 自身已经没有之前的问题。
[…] 白板报 » 我是如何解决Wordpress无法登陆问题的 […]
恭喜解决问题撒。现在看起来我的博客貌似也解决了。我的办法是:
用wp2.5的程序替换掉2.6的程序——主要是感觉还是2.5的用着方便,至少添加图片上很方便,然后出现了不能打开登录页面的情况,我再按照你找的清除cookies,然后就好了。
全部是没有章法的方法,我说过我是单核的。晚饭前我还想着直接把程序全部删除,备份一下插件,然后再重新上传程序。幸好没这么做,要不然那一对文章就都没了:)
谢谢这个有用的信息,我将收集到解决方案大全里。
有一种说法是更改Login文件的属性为777
试了,同一主机上面,一个成功了,一个失败了。
虽然从未遇到这种情况,不过还是要bookmark一下,以备不时之需。。。