web-dev-qa-db-ja.com

なぜカント WP ファイルシステムAPI read googlefonts.json?

私はRedgradeフレームワークを使用して構築されたHighgrade( southcentral )によるテーマで構築されたサイトを継承しました。

フロントエンドと管理パネルに次のようなエラーが表示されます。

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フレームワークの中にあるようです - githubの このスレッド を見てください

Typography.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です。

アップデート:

wordpressディレクトリ全体の所有権を_www:_wwwに変更すると問題は解決しますが、明らかに優れた解決策ではありません。

2
codecowboy

あらゆることにWP_Filesystemを使用する必要はありません。この場合、正しい解決策は通常のfile_get_contentsを使用することです。

WP_Filesystemは、安全な方法でファイルシステムとやり取りするためのさまざまな方法のラッパーです。しかし、それはすべてを意味するものではありません。

基本的に、WP_FilesystemコードはWordPressが自分自身を更新できるようにするために作成されました。

そのようなことをするとき、ファイルの所有権はかなり大したことです。多くのサーバーはPHPファイルの実際の所有者としてではなく、 "www"として(たとえば)実行されます。そのような場合にWordPressが直接ファイルを作成すると、結果として得られるファイルも真の正しい所有者ではなく「www」が所有することになります。これは、特に共有ホスティングでセキュリティ上の問題を引き起こす可能性があります。

そのため、WP_Filesystemはファイル操作を抽象化します。ファイルの所有権を維持する方法でファイルを読み書きできます。直接書き込みが可能で所有権が残っている場合はそうなりますが、できない場合は、代わりにFTPなどの方法で資格情報が必要になります。認証情報を使用することで、そのルートを介してログインし、適切な所有者を使用してファイルを書き込むことができます。

これが意味するのは、あなたがWP_Filesystemを使う前に、それがセットアップされなければならないということです。テストを実行する必要があります。テストが失敗した場合は、ユーザーから資格情報を取得する必要があります。これらの資格情報がなければ、機能することはできません。

あなたの場合、「wordpressディレクトリ全体の所有権を_www:_wwwに変更する」ことで問題が解決したので、これがあなたに起こっていることです。ファイルを書き込もうとして適切な所有権を取得しようとするテストは失敗します。既存のファイルの所有者を変更することで、そのテストの条件が変わります。

実のところ、この場合、WP_Filesystemを使用する理由はまったくありません。彼はファイルを読んでいます。彼はそのファイルを直接読むことができます。所有権はここでは関係ありません。そのため、実際にはfile_get_contentsを使用してください。これにWP_Filesystemを使用しても意味がありません。

使い方の観点から見たWP_Filesystemの詳細: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/

2
Otto

@ codecowboy、どのバージョンのReduxを使用していますか?新しいバージョンでは、このようにgooglefonts.jsonを使用することすらありません。

私はあなたがWordPressのプラグインレポジトリ( http://wordpress.org/plugins/redux-framework/ )から単にRedux Frameworkをインストールすることをお勧めします、そしてこの問題あなたのテーマに埋め込まれたReduxバージョンをプラグインが上書きするので、あなたのために解決されます。

1
Dovy

いくつかのデバッグの後、WP_Filesystemがチェックをしている間にWP_Filesystemが一時ファイルへの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を通過させることができる理由がわかりません。

1
codecowboy