it-swarm.com.de

Verwendung von wp_filesystem in Plugins zum Speichern von Customizer-Einstellungen

Ich versuche mein Plugin mit den Antworten, die ich hier bekommen habe, zu reparieren: Mit wp_filesystem in Plugins Background habe ich ein Theme geschrieben ( https://github.com/bassjobsen/jamedo-bootstrap-start-theme ) und ein plugin ( https://github.com/bassjobsen/wp-less-to-css ) jetzt möchte ich das plugin in das theme integrieren. Das Plugin hat eine CSS-Datei in einen Ordner geschrieben. Das Schreiben von Dateien mit der systemeigenen Funktion PHP ist nicht sicher, wie hier beschrieben: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ . Die vorherige Antwort hilft mir, diese Probleme für das Plugin zu beheben.

Die von @otto bereitgestellte Lösung leitet auf request_filesystem_credentials weiter, wofür anscheinend eine URL erforderlich ist. Diese URL wird mir einige Probleme bereiten, wenn ich das Plugin in das Theme einbinde.

Mein Ziel ist es, die Einstellungen aus dem Customizer nach dem Speichern zu verwenden, um eine neue CSS-Datei zu erstellen.

Jetzt habe ich in functions.php:

add_action( 'customize_save_after', 'lesscustomize' );

function lesscustomize($setting)
{
//$setting is no used here
$updatecss = WP_LESS_to_CSS::$instance;
add_filter( 'add_extra_less_code', 'add_extra_less_now_live');

function add_extra_less_now_live($parser)
{
    return 'h1{color:'.get_theme_mod( 'heading_color').'}';          
}
$updatecss->wpless2csssavecss();
}

Wo wpless2csssavecss() jetzt die Datei mit file_put_contents speichert. Der file_put_contents sollte durch eine $wp_filesystem->put_contents(); ersetzt werden. Ursache $wp_filesystem wird als globaler Code verwendet. Ich denke, es sollte möglich sein, die Anmeldeinformationen des Dateisystems in meiner Funktion lesscustomize() abzurufen. Außerdem habe ich keine Ahnung, wie ich das ohne URL machen soll. Es wird eine URL geben, die jedoch von Ajax aufgerufen wird und für den Benutzer nicht sichtbar ist.

Die Idee, 'customize_save_after' zu verwenden, kam von https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837

Meine erste Frage wird es möglich sein, Anmeldeinformationen für das Dateisystem in meiner lesscustomize() zu erhalten? Oder, falls nicht, gibt es eine Alternative, die Aktion zum Speichern der Customizer-Einstellungen zu aktivieren und Anmeldeinformationen für das Dateisystem abzurufen, um meine Einstellungen zu speichern?

updateIn diesem Update der Frage werde ich auf die nützliche Antwort von Mark Kaplun reagieren. Ich gehe davon aus, dass dies zum Verständnis meiner ersten Frage beiträgt.

Was Sie versuchen, ist falsch, wenn es für allgemeine Zwecke verwendet wird und nicht auf die Bedürfnisse eines bestimmten Kunden zugeschnitten ist. Das dynamische Ändern des Codes Ihres Themas, und CSS ist Code wie JS, ist normalerweise eine schlechte Idee, die nur Wartungsprobleme mit sich bringt

In meinem Thema verwende ich WENIGER anstelle von CSS (obwohl Sie auch CSS schreiben könnten). Ich denke, dies wird nützlich sein und den Bedürfnissen der Benutzer des Themas entsprechen. Erstens hält WENIGER die Dinge sauber und zweitens wird mein Thema mit Twitter's Bootstrap erstellt. WENIGER ist die direkteste Möglichkeit, Bootstrap-basiertes HTML/CSS zu ändern. Ich ändere meinen Theme-Code nicht, ich möchte nur mein CSS in einer Datei speichern, in der CSS aus WENIGER kompiliert wird. Wartungsstrategie des Codes, den ich hier beschrieben habe: http://bassjobsen.weblogs.fm/integrate-less-jbst-wordpress-theme/

Zusätzlich zu den theoretischen Gründen gibt es Benutzererwartungen in Bezug auf die Benutzeroberfläche der Themenanpassung, bei denen keine Dateien auf den Server geschrieben werden.

Ich verstehe nicht, was das Schreiben von Dateien mit UX zu tun hat. Leute, die mein Thema verwenden, wählen ein Thema, das Bootstrap verwendet und somit WENIGER. Ich denke, sie sollten verstehen, dass es irgendwo geschriebene Dateien geben sollte. Ich bin damit einverstanden, dass ein zusätzlicher Schritt zum Ausfüllen Ihrer Anmeldeinformationen eine schlechte Benutzeroberfläche ergibt.

Wenn Sie wirklich Dateien auf dem Server speichern müssen,> ist das Verzeichnis/wp-content/uploads der richtige Ort dafür.

Ja, das mache ich jetzt. http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ sagt mir, dass es eine schlechte Idee ist. Seit WP3.8 besteht es auch nicht die Theme-Tests auf wordpress.org: "WARNUNG: file_put_contents wurde in der Datei wp-less-to-css.php gefunden. Mögliche Dateivorgänge."

Die bessere Möglichkeit besteht darin, nur minimale WENIGER-Dateien zu haben, die nur für die vom Benutzer gesteuerten Optionen relevant sind. Sobald die Optionen geändert wurden, kompilieren Sie das WENIGER und speichern das generierte CSS in einer Option und geben es als Teil der HTML-Seiten aus, wie es die meisten Designs mit ihren anpassbaren Optionen tun.

Ich bin damit einverstanden, dass dies eine Option sein könnte. Das Schreiben von Inline-CSS ist nicht immer die beste Lösung. Siehe auch: https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery . Nicht alle Anpassungseinstellungen müssen kritisch sein oder Teil des übergeordneten CSS. Abgesehen davon, dass in meinem Fall einige Einstellungen auch das CSS von Bootstrap neu kompilieren (zum Beispiel das Ändern des @ grid-float-breakpoint), kann ich diesen Code nicht einbetten.

2
Bass Jobsen

update

Die unten beschriebene Sitzungsoption scheint sehr unsicher zu sein! Weitere Untersuchungen haben ergeben, dass das von request_filesystem_credentials zurückgegebene Array Ihre Anmeldeinformationen im Klartext enthält. Es scheint also eine schlechte Idee zu sein, dies in einer Sitzung zu speichern.

Beachten Sie, dass das Senden der Anmeldeinformationen über eine nicht sichere Verbindung (http) beim Posten des Formulars ebenfalls eine schlechte Idee ist. Der neueste Fehler kann behoben werden, indem Sie Ihre Anmeldeinformationen zu wp_config.php hinzufügen. Stellen Sie dabei sicher, dass Sie Ihre wp_config.php chmod 600 (siehe: http://codex.wordpress.org/Changing_File_Permissions ).

Festlegen der Anmeldeinformationen in wp-config.php zum Beispiel:

define('FS_METHOD', 'ftpext');
define('FTP_Host', 'localhost');
define('FTP_USER', 'ftpuser');
define('FTP_PASS', 'ftpuser');
define('FTP_BASE', '/home/username/http_docs/');

Danach können wir sie (temporär) zur Verwendung durch den Customizer in der Datenbank speichern. Dies scheint sicher zu sein, da die Einstellungen von wp-config.php auch in der Datenbank gespeichert werden. Das Speichern in die Datenbank erfolgt mit set_theme_mod, inspiriert von: https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837

Nach alledem den endgültigen Code, mit dem ich die Customizer-Einstellungen mit wp_filesystem in einer Datei speichern kann:

function lesscustomize($setting)
{
$updatecss = WP_LESS_to_CSS::$instance;
$updatecss->wpless2csssavecss(unserialize(get_theme_mod('customizercredits')));
}

add_action( 'customize_save_after', 'lesscustomize' );

function storecedits( $wp_customize ) {

            $in = true;
            $url = 'customize.php';
            if (false === ($creds = request_filesystem_credentials($url, '', false, false,null) ) ) {
                $in = false;
                exit;
            }

            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, '', true, false,null);
                $in = false;
                exit;
            }

            set_theme_mod('customizercredits', serialize($creds));

}
add_action('customize_controls_init', 'storecedits', 1);  

----------------- Update beenden ----------------------

Ich stellte fest, dass ich das Problem theoretisch mit Hilfe von Sitzungen lösen kann. Dies führt leider zu neuen Sicherheitsfragen. Wird die Aktivierung von Sitzungen (hier zu finden https://stackoverflow.com/a/4769449/1596547 ) andere Probleme verursachen? und wenn nicht, welches Risiko besteht dann, wenn ich meine Anmeldeinformationen in einer Sitzung speichere?

function kana_init_session()
{
  session_start();
}

add_action('init', 'kana_init_session', 1);

function updatefiles( $wp_customize ) {
WP_Filesystem($_SESSION['creds']);

            global $wp_filesystem;
            $contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
            echo $contentdir;
            $wp_filesystem->mkdir( $contentdir. 'cbe' );
            if ( ! $wp_filesystem->put_contents(  $contentdir . 'cbe/test.txt', 'Test file contents', FS_CHMOD_FILE) ) 
            {
                echo "error saving file!";
            }



}

add_action('customize_save', 'updatefiles', 1);

function storecredentials( $wp_customize ) 
{

            $in = true;
            $url = 'customize.php';
            if (false === ($creds = request_filesystem_credentials($url, '', false, false,null) ) ) {
                $in = false;
                exit;
            }
            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, '', true, false,null);
                $in = false;
                exit;
            }
            $_SESSION['creds'] = $creds;

}
add_action('customize_controls_init', 'storecredentials', 1);</strike>
1
Bass Jobsen

Was Sie versuchen, ist falsch, wenn es für allgemeine Zwecke verwendet wird und nicht auf die Bedürfnisse eines bestimmten Kunden zugeschnitten ist. Das dynamische Ändern des Codes Ihres Themas, und CSS ist Code wie JS, ist normalerweise eine schlechte Idee, die nur Wartungsprobleme mit sich bringt. Überprüfen Sie alle Werte, um kompilieren zu können? Wie gehst du mit Upgrades um? Wie gehen Sie mit Netzwerkinstallationen um, bei denen Benutzer die FTP-Anmeldeinformationen nicht kennen?

Zusätzlich zu den theoretischen Gründen gibt es Benutzererwartungen in Bezug auf die Benutzeroberfläche der Themenanpassung, bei denen keine Dateien auf den Server geschrieben werden.

Wenn Sie wirklich Dateien auf dem Server speichern müssen, ist das Verzeichnis/wp-content/uploads der richtige Ort dafür.

Die bessere Möglichkeit besteht darin, nur minimale WENIGER-Dateien zu haben, die nur für die vom Benutzer gesteuerten Optionen relevant sind. Sobald die Optionen geändert wurden, kompilieren Sie das WENIGER und speichern das generierte CSS in einer Option und geben es als Teil der HTML-Seiten aus, wie es die meisten Designs mit ihren anpassbaren Optionen tun.

1
Mark Kaplun