web-dev-qa-db-ja.com

カスタマイザ設定を保存するためのプラグインでのwp_filesystemの使用

私は私がここで得た答えで私のプラグインを修正しようとしています。 プラグインでのwp_filesystemの使用 背景テーマを書いた( https://github.com/bassjobsen/jamedo- bootstrap-start-theme )とプラグイン( https://github.com/bassjobsen/wp-less-to-css )プラグインを統合したいテーマで。プラグインはCSSファイルをフォルダに書き込みました。ネイティブPHP関数でファイルを書くことはここに記述されているように安全ではありません: http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ 。前の答えは私がプラグインのためにこの問題を解決するのを助けます。

解決策は@otto relayがrequest_filesystem_credentials上で提供するもので、URLを必要とするようです。このURLは、プラグインをテーマに統合するときに私にいくつかの問題を与えます。

私の目標は、新しいCSSファイルを作成するために保存した後にカスタマイザからの設定を使用することです。

今私は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();
}

ここでwpless2csssavecss()file_put_contentsでファイルを保存します。 file_put_contents$wp_filesystem->put_contents();に置き換えてください。原因$wp_filesystemはグローバルとして使用されます私は私のlesscustomize()関数でファイルシステムの資格情報を取得することが可能であるべきだと思います。横に私はURLなしでこれを行う方法がわからない。 URLがありますが、それはAjaxによって呼び出され、ユーザーには見えません。

'customize_save_after'を使用するというアイデアは、 https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837 に由来します。

私の最初の質問は私のlesscustomize()でファイルシステムの資格情報を取得することは可能でしょうか?または、そうでない場合は、カスタマイザ設定の保存アクションをフックしてファイルシステムの認証情報を取得して設定を保存するという代替策はありますか

updateこの質問の更新では、Mark Kaplunの有益な答えに反応します。これが私の最初の質問を理解するのに役立つと期待しています。

あなたがやろうとしていることは、それが一般的な用途のためであり、特定のクライアントのニーズに合わせて調整されていない場合、間違っています。テーマのコードを動的に変更する、そしてcssはJSのようなコードです、通常メンテナンス問題だけをもたらすのは悪い考えです。

私のテーマではCSSの代わりにLESSを使用します(ただしCSSを記述することもできます)。私はこれが役に立つと思い、テーマユーザーのニーズに合っています。そもそもLESSは物事をきれいに保ち、2つ目はTwitterのBootstrapで私のテーマを構築します。 LESSは、BootstrapベースのHTML/CSSを修正するための最も直接的な方法です。私は自分のテーマコードを修正しません、私はCSSをLESSからコンパイルされるファイルに保存したいだけです。私がここで説明したコードのメンテナンス戦略: http://bassjobsen.weblogs.fm/integrate-less-jbst-wordpress-theme/

理論的な理由に加えて、ファイルをサーバーに書き込むことを含まないテーマカスタマイズのUXに関連したユーザーの期待があります。

書き込みファイルがUXとどのような関係にあるのかわかりません。私のテーマを使っている人は、Bootstrapを使ったテーマを選択してください。私は彼らがどこかに書かれたファイルがあるべきであることを理解するべきだと思います。あなたの資格情報を入力するための追加のステップが悪いUXを与えることに同意します。

本当にサーバー上にファイルを保存する必要があるなら、それらのための正しい場所は/ wp-content/uploadsディレクトリです。

はい、それは私が今していることです。 http://ottopress.com/2011/tutorial-using-the-wp_filesystem/ は、それが悪い考えであることを教えてくれます。 WP3.8以降、wordpress.orgでのテーマテストにも合格しません: "警告:file_put_contentsがファイルwp-less-to-css.phpで可能なファイル操作に見つかりました。"

それを行うより良い方法は、ユーザーが制御するオプションにのみ関連する最小限のLESSファイルを用意することです。オプションが変更されたら、LESSをコンパイルして生成されたCSSをオプションに格納し、それを各ページHTMLの一部として出力します。ほとんどのテーマはカスタマイズ可能なオプションを使用しています。

私はこれが選択肢になるかもしれないことに同意します。インラインCSSを作成することが常に最善の解決策とは限りません。下記も参照してください。 https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery 。すべてのカスタマイズ設定が重要である必要はなく、また上記のCSSの一部である必要もありません。私の場合とは別に、いくつかの設定はBootstrapのCSSを再コンパイルするでしょう(例えば@ grid-float-breakingpointを変更する)私はこのコードをインライン化することはできません。

2
Bass Jobsen

更新

下記のセッションオプションは非常に安全ではないようです!さらなる調査により、request_filesystem_credentialsによって返される配列にプレーンテキストの資格情報が含まれていることが明らかになりました。セッションにこれを保存するのは悪い考えです。

フォームを投稿するときに、セキュリティで保護されていない接続(http)を介して資格情報を送信することにも注意が必要です。最新の情報はあなたの認証情報をwp_config.phpに追加することで解決できます。これをするときあなたのwp_config.phpをchmod 600することを確認してください(:= http://codex.wordpress.org/Changing_File_Permissions を見てください)。

たとえば、wp-config.phpで資格情報を設定します。

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

これを行った後、カスタマイザが使用するためにそれらをデータベースに(一時的に)保存することができます。これは、wp-config.phpからの設定がデータベースにも保存されるようにするために保存するようです。 https://stackoverflow.com/questions/14802251/hook-into-the-wordpress-theme-customizer-save-action/16679837に触発されたデータベースへの保存はset_theme_modで行われます。

これらすべてを行った後、wp_filesystemを使用してカスタマイザ設定をファイルに格納できるようにするための最終コード。

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

-----------------最後の更新----------------------

セッションを使用して理論的な問題を解決できることがわかりました。残念ながら、これはセキュリティについての新しい質問を紹介します。最初にセッションを有効にします(ここで見つけられます https://stackoverflow.com/a/4769449/1596547 )他に問題がありますか?そうでない場合、ファイルの認証情報をセッションに保存することによるリスクは何ですか?

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

あなたがやろうとしていることは、それが一般的な用途のためであり、特定のクライアントのニーズに合わせて調整されていない場合、間違っています。テーマのコードを動的に変更し、cssはJSのようなコードですが、通常はメンテナンス上の問題のみをもたらすのはよくありません。アップグレードはどのように処理されますか?ユーザーがFTP資格情報を知らないネットワークインストールをどのように処理しますか?

理論的な理由に加えて、ファイルをサーバーに書き込むことを含まないテーマカスタマイズのUXに関連したユーザーの期待があります。

本当にサーバー上にファイルを保存する必要があるなら、それらのための正しい場所は/ wp-content/uploadsディレクトリです。

それを行うより良い方法は、ユーザーが制御するオプションにのみ関連する最小限のLESSファイルを用意することです。オプションが変更されたら、LESSをコンパイルして生成されたCSSをオプションに格納し、それを各ページHTMLの一部として出力します。ほとんどのテーマはカスタマイズ可能なオプションを使用しています。

1
Mark Kaplun