我继承了Highgrade以主题构建的网站(southcentral) 它是使用Redux框架构建的。
我在前端和管理面板中看到以下错误:
Warning: Invalid argument supplied for foreach() in /Volumes/Data/Users/me/Sites/reference360.eu/wordpress/wp-content/themes/southcentral/highgrade/framework/inc/fields/typography/field_typography.php on line 772
我试图改变googlefonts的权限和所有权。json,但无济于事。
问题似乎在Redux框架内-请参阅this thread 在github上
我正在调试排版。php类:
if (!isset($this->parent->fonts[\'google\']) || empty($this->parent->fonts[\'google\'])) {
$this->parent->fonts[\'google\'] = json_decode($wp_filesystem->get_contents(ReduxFramework::$_dir . \'inc/fields/typography/googlefonts.json\'), true);
var_dump(ReduxFramework::$_dir . \'inc/fields/typography/googlefonts.json\');
var_dump($wp_filesystem->get_contents(ReduxFramework::$_dir . \'inc/fields/typography/googlefonts.json\')); exit;
$this->parent->font_groups[\'google\'] = array(
\'id\' => \'google\',
\'text\' => __(\'Google Webfonts\', \'redux-framework\'),
\'children\' => array(),
);
foreach ($this->parent->fonts[\'google\'] as $font => $extra) {
$this->parent->font_groups[\'google\'][\'children\'][] = array(
\'id\' => $font,
\'text\' => $font
);
}
}
}
有人知道这是什么原因吗?文件存在,并且位于指定的路径。开发环境是OSX Mavericks。
UPDATE:
将整个wordpress目录的所有权更改为
_www:_www
解决了问题,但显然不是一个很好的解决方案。
SO网友:Otto
没有必要为每一件小事都使用WP\\u文件系统,在这种情况下,正确的解决方案是使用普通的file_get_contents
.
WP\\u文件系统是一个包装器,围绕着以安全的方式与文件系统交互的各种方式。。。但这并不意味着一切。
基本上,创建WP\\u文件系统代码是为了允许WordPress自我更新。
在做这样的事情时,文件所有权是一个相当大的问题。许多服务器作为“www”(例如)运行,而不是作为PHP文件的实际所有者。如果WordPress在这种情况下直接编写文件,那么生成的文件也将属于“www”,而不是真正正确的所有者。这可能会导致安全问题,尤其是在共享托管中。
因此,WP\\u文件系统抽象了文件操作。它可以以保留文件所有权的方式读取和写入文件。如果它可以直接写入并且所有权仍然存在,那么它将这样做,但如果它不能,那么它将需要FTP等方法的凭据。通过使用凭据,它可以通过该路由登录,并使用正确的所有者写入文件。
这意味着在使用WP\\u文件系统之前,必须对其进行设置。必须执行测试,如果测试失败,则必须从用户处获取凭据。没有这些凭证,它就无法运行。
在您的情况下,由于“将整个wordpress目录的所有权更改为\\u www:\\u www”解决了问题,因此这就是发生在您身上的情况。尝试写入文件并获得适当所有权的测试失败。通过更改现有文件的所有者,您正在更改该测试的条件。
现在,事实是,在这种情况下,根本没有理由使用WP\\u文件系统。他正在读一个文件。他可以直接读那个文件。所有权在这里并不重要。所以,真的,只要使用file_get_contents
. 为此使用WP\\u文件系统没有任何意义。
有关WP\\U文件系统的更多信息,请从如何使用它的角度来看:http://ottopress.com/2011/tutorial-using-the-wp_filesystem/
SO网友:codecowboy
经过一些调试后,这里真正发生的情况似乎是WP\\U文件系统在进行检查时试图打开到临时文件的ftp连接:
public function get_contents( $file ) {
$tempfile = wp_tempnam($file);
$temp = fopen($tempfile, \'w+\');
if ( ! $temp )
return false;
if ( ! @ftp_fget($this->link, $temp, $file, FTP_BINARY ) )
return false; //false is returned and so I end up with an empty google fonts array
fseek( $temp, 0 ); // Skip back to the start of the file being written to
$contents = \'\';
while ( ! feof($temp) )
$contents .= fread($temp, 8192);
fclose($temp);
unlink($tempfile);
return $contents;
}
在我的本地OSX机器上,这会失败,而它会在目标服务器上传递。我不知道为什么要将整个wordpress目录的所有权更改为
_www:_www
允许这样做
ftp_fget
如果正在尝试读取临时文件,则通过
/var/tmp