it-swarm.com.de

Warum kann das nicht WP Dateisystem-API googlefonts.json lesen?

Ich habe eine Site geerbt, die mit einem Thema von Highgrade ( southcentral ) erstellt wurde und das Redux-Framework verwendet.

Im Frontend- und Admin-Bereich wird der folgende Fehler angezeigt:

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

Ich habe versucht, Berechtigungen und Eigentumsrechte auf googlefonts.json zu ändern, aber ohne Erfolg.

Das Problem scheint im Redux-Framework zu liegen - siehe diesen Thread auf Github

Ich debugge in der typography.php Klasse:

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

Hat jemand eine Ahnung, woran das liegen könnte? Die Datei existiert und befindet sich im angegebenen Pfad. Entwicklungsumgebung ist OSX Mavericks.

UPDATE:

das Ändern des Besitzes des gesamten WordPress-Verzeichnisses in _www:_www behebt das Problem, ist jedoch offensichtlich keine großartige Lösung.

2
codecowboy

Es ist nicht notwendig, das WP_Filesystem für jede Kleinigkeit zu verwenden, und in diesem Fall besteht die richtige Lösung darin, den normalen file_get_contents zu verwenden.

Das WP_Filesystem ist ein Wrapper für verschiedene Arten der sicheren Interaktion mit dem Dateisystem ... aber es ist nicht für alles gedacht.

Grundsätzlich wurde der WP_Filesystem-Code erstellt, damit sich WordPress selbst aktualisieren kann.

Wenn Sie so etwas tun, ist der Besitz von Dateien eine ziemlich große Sache. Viele Server werden (zum Beispiel) als "www" anstatt als eigentlicher Eigentümer der PHP -Dateien ausgeführt. Wenn WordPress in einem solchen Fall eine Datei direkt schreibt, gehört die resultierende Datei ebenfalls "www" und nicht dem wahren und richtigen Eigentümer. Dies kann zu Sicherheitsproblemen führen, insbesondere beim Shared Hosting.

Das WP_Filesystem abstrahiert also die Dateioperationen. Es kann Dateien auf eine Weise lesen und schreiben, die den Dateieigentum bewahrt. Wenn es direkt schreiben kann und das Eigentumsrecht verbleibt, wird es dies tun, aber wenn es nicht kann, werden stattdessen Anmeldeinformationen für eine Methode wie FTP benötigt. Mithilfe von Anmeldeinformationen kann es sich über diese Route anmelden und Dateien mit dem entsprechenden Eigentümer schreiben.

Dies bedeutet, dass das WP_Filesystem eingerichtet werden muss, bevor Sie es verwenden können. Es muss ein Test durchgeführt werden. Wenn der Test fehlschlägt, müssen die Anmeldeinformationen vom Benutzer angefordert werden. Ohne diese Anmeldeinformationen kann es nicht funktionieren.

In Ihrem Fall, da "Ändern des Besitzers des gesamten WordPress-Verzeichnisses in _www: _www" das Problem behoben hat, geschieht dies mit Ihnen. Der Test, bei dem versucht wird, eine Datei zu schreiben und den richtigen Besitz zu erlangen, schlägt fehl. Durch Ändern des Besitzers der vorhandenen Dateien ändern Sie die Bedingungen für diesen Test.

In Wahrheit gibt es in diesem Fall keinen Grund, das WP_Filesystem überhaupt zu verwenden. Er liest eine Akte. Er kann diese Datei direkt lesen. Eigentümerschaft spielt hier keine Rolle. Also, wirklich, benutze einfach file_get_contents. Die Verwendung des WP_Filesystems ist hierfür nicht sinnvoll.

Weitere Informationen zum WP_Filesystem aus der Perspektive der Verwendung: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/

2
Otto

@codecowboy, welche Redux-Version verwendest du? In den neueren Versionen verwenden wir die googlefonts.json nicht einmal so.

Ich schlage vor, Sie installieren Redux Framework einfach aus dem WordPress-Plugin-Repository ( http://wordpress.org/plugins/redux-framework/ ) und dieses Problem wird für Sie behoben, da das Plugin die darin eingebettete Redux-Version überschreibt dein thema.

1
Dovy

Nach einigem Debuggen scheint es, dass WP_Filesystem hier wirklich versucht, eine FTP-Verbindung zur temporären Datei zu öffnen, während es seine Prüfungen durchführt:

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

Auf meinem lokalen OSX-Computer schlägt dies fehl, wohingegen es auf dem Zielserver übergeben wird. Ich bin mir nicht sicher, warum das Ändern der Inhaberschaft des gesamten WordPress-Verzeichnisses in _www:_www die Übergabe dieses ftp_fget ermöglicht, da versucht wird, eine temporäre Datei in /var/tmp zu lesen.

1
codecowboy