出于某种原因,get_option()
当我将网站从本地主机移动到web服务器时,返回二进制结果时开始失败。我通过FTP上传文件迁移了WordPress
然而,其他一切都很完美。甚至wp-admin
工作正常:我可以编辑、发布等。这只是一行代码,让我感到沮丧。它来自我正在使用的一个主题,但没有特定于主题的行为:它在此之前崩溃了。该行代码尝试执行以下操作:
$sqbtn_1 = unserialize(get_option(\'magaling_ads_468060_1\')); //returns null.
$sqbtn_1 = $sqbtn_1->is_empty() ? $ad_def : $sqbtn_1; //CRASHES: is_empty on a non-object.
如果我创建一个简单的PHP文件,我可以证明数据正确来自MySQL。我的WordPress选项表中有“magaling\\u ads\\u 468060\\u 1”字段,它包含以下内容:
mysql_query(\'SET NAMES utf8\');
$result = mysql_query("select * from wp_options WHERE option_name = \'magaling_ads_468060_1\'");
//prints out the following value of the option_value field:
s:376:"O:18:"Padd_Advertisement":5:{s:27:"Padd_Advertisementimg_url";s:88:"http://www.echysttas.org/wp-content/themes/magaling/images/advertisement-468x060_1.jpg";s:28:"Padd_Advertisementalt_desc";s:15:"Axonn Echysttas";s:27:"Padd_Advertisementweb_url";s:24:"http://www.echysttas.org";s:26:"Padd_Advertisementtarget";s:4:"_new";s:29:"Padd_Advertisementcss_class";s:0:"";}";
所以MySQL返回数据!但是,get\\u选项返回
nothing. 我回音了,它是空的。在另一边。。。
get_option(\'magaling_installed\'); //works and returns "1"
其他一切都很好,甚至返回其他特定于主题的(整数或字符串)值。
var_dump( get_option(\'magaling_ads_468060_1\') ); //shows bool(false)
var_dump( get_option(\'magaling_installed\') ); //shows string(1) "1"
var_dump( get_option(\'blogname\') ); //string(9) "Echysttas"
最合适的回答,由SO网友:Axonn 整理而成
发现问题。和A WORD OF WARNING to people MIGRATING their WordPress Installations. 阅读本文,了解get\\u选项在以下情况下如何开始失败unserializing
来自数据库的二进制数据。
我所做的是以核心方式迁移WordPress:将所有文件复制到web服务器,恢复完整的SQL数据库脚本。
在还原之前,我在SQL数据库中进行了大规模替换,将URL从本地更改为web服务器。这就是问题所在。
数据库中存在PHP序列化对象。在序列化字符串的地方,其长度是在前面加上前缀的。而且,你可以猜到我陷入了什么样的混乱:既然我大量替换了主机名,我应该在所有序列化主机名的地方修改序列化对象的字符串长度。
使用默认WordPress安装不会有问题,因为WordPress不使用此类功能。但是,如果你使用插件或主题,并且你使用这种方法来迁移你的博客,你就是在问问题。
幸运的是,在序列化对象中,以前只有很少的本地URL,准确地说,只有两个。
我希望我与这个问题的7个小时的斗争能对某人有所帮助。