为什么WP文件系统API不能读取googlefonts.json?

时间:2014-10-22 作者:codecowboy

我继承了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 解决了问题,但显然不是一个很好的解决方案。

4 个回复
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网友:Dovy

@codecowboy,你使用的是什么版本的Redux?在新版本中,我们甚至不使用googlefonts。像这样的json。

我建议您只需从WordPress插件库安装Redux框架(http://wordpress.org/plugins/redux-framework/), 这个问题将为您解决,因为插件将覆盖嵌入主题中的Redux版本。

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

SO网友:kprovance

作为记录,最新版本的Redux不再使用这种特殊的方法来加载google字体。其次,奥托对Redux的人有一定的反感,所以对他在这里所说的话持保留态度。我们经常看到主题检查错误,例如:

警告:在file类中找到file\\u put\\u内容。redux\\u文件系统。php文件操作应使用WP\\U文件系统方法,而不是直接调用php文件系统

真正地那么,奥托?你在制定标准和指导方针?这真的很有意义,因为整个$wp\\u文件系统库就像是由不知道自己在做什么的孩子们零零碎碎地拼凑起来的。确实是标准!

结束

相关推荐