web-dev-qa-db-fra.com

Pourquoi ne pas le WP API de système de fichiers lire googlefonts.json?

J'ai hérité d'un site créé avec un thème de Highgrade ( southcentral ) qui utilise le cadre Redux.

L'erreur suivante apparaît dans les panneaux d'interface et d'administration:

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

J'ai essayé de modifier les autorisations et la propriété sur googlefonts.json mais en vain.

Le problème semble être dans le cadre de Redux - voir ce fil de discussion sur github

Je débogue dans la classe 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
                );
            }
        }
    }

Quelqu'un a une idée de ce qui pourrait causer cela? Le fichier existe et se trouve dans le chemin spécifié. L'environnement de développement est OSX Mavericks.

UPDATE:

changer la propriété de tout le répertoire wordpress en _www:_www résout le problème mais ce n’est évidemment pas une excellente solution.

2
codecowboy

Il n'est pas nécessaire d'utiliser WP_Filesystem pour chaque petite chose, et dans ce cas, la solution correcte consiste à utiliser le file_get_contents normal.

WP_Filesystem est un wrapper autour de différentes manières d’interagir avec le système de fichiers de manière sécurisée ... mais ce n’est pas fait pour tout.

Fondamentalement, le code WP_Filesystem a été créé pour permettre à WordPress de se mettre à jour.

Lorsque vous faites une telle chose, la propriété d'un fichier est un gros problème. Un grand nombre de serveurs fonctionnent comme "www" (par exemple) au lieu d'être le propriétaire des fichiers PHP. Si WordPress devait écrire un fichier directement dans un tel cas, le fichier résultant appartiendrait également à "www" et non au propriétaire véritable et correct. Cela peut entraîner des problèmes de sécurité, en particulier dans l'hébergement partagé.

Ainsi, WP_Filesystem résume les opérations sur les fichiers. Il peut lire et écrire des fichiers de manière à préserver la propriété des fichiers. S'il peut écrire directement et que la propriété reste, il le fera, mais s'il ne le peut pas, il aura besoin d'informations d'identification pour une méthode telle que FTP. En utilisant des informations d'identification, il peut se connecter via cette route et écrire des fichiers en utilisant le propriétaire approprié.

Cela signifie qu'avant d'utiliser WP_Filesystem, il doit être configuré. Un test doit être effectué et si le test échoue, les informations d'identification doivent être obtenues de l'utilisateur. Sans ces informations d'identification, cela ne peut pas fonctionner.

Dans votre cas, puisque "changer la propriété de tout le répertoire wordpress en _www: _www" a résolu le problème, c'est ce qui vous arrive. Le test consistant à essayer d'écrire un fichier et d'obtenir la propriété appropriée échoue. En changeant le propriétaire des fichiers existants, vous modifiez les conditions de ce test.

En réalité, dans ce cas, il n’ya aucune raison d’utiliser le système de fichiers WP_Filesystem. Il lit un fichier. Il peut lire ce fichier directement. La propriété n'a pas d'importance ici. Donc, vraiment, utilisez simplement file_get_contents. Utiliser WP_Filesystem pour cela n'a aucun sens.

Plus d'informations sur WP_Filesystem, du point de vue de l'utilisation simplifiée: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/

2
Otto

@ Codecowboy, quelle version de Redux utilisez-vous? Dans les versions les plus récentes, nous n'utilisons même pas googlefonts.json comme ceci.

Je vous suggère simplement d'installer Redux Framework à partir du référentiel de plugins WordPress ( http://wordpress.org/plugins/redux-framework/ ), et ce problème sera résolu pour vous car le plugin remplacera la version Redux intégrée à votre thème.

1
Dovy

Après un certain débogage, il apparaît que ce qui se passe réellement ici est que WP_Filesystem essaie d'ouvrir une connexion ftp au fichier temporaire pendant qu'il vérifie:

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;
    }

Sur ma machine OSX locale, cela échoue alors qu'il passe sur le serveur cible. Je ne suis pas sûr de savoir pourquoi le changement de propriétaire du répertoire wordpress entier en _www:_www permet à ce ftp_fget de passer étant donné qu'il essaie de lire un fichier temporaire dans /var/tmp

1
codecowboy