WordPress のFilesystemとかAjaxとか
Page No.1
ちょっと自虐ネタなんぞをぶつぶつと・・・。
汎用のテーマを作っていたりしたのです。
好みでいろいろと設定できるようにオプションを設けて、それを管理画面から設定できるようにと。
前に作った、背景画像が一定時間で切り替わっていく日めくりカレンダーなどもくっつけてみたりして。
その背景画像を好きなように追加できるように、画像のリストを作ってそれをjavascriptで読んで切り替えていくようにと。
いえいえ、テーマのディレクトリに登録するなんてことは考えていなくて、なるべく機能を盛り込んだものをという考えです。
で、その背景画像を追加したときなどに、画像のリストを作るプログラムを管理画面のオプション設定画面から動かせるようにAjax などを使っていたのです。
オプションの設定画面から動かすjavascriptなので、phpで書いてページにprint out したjavascript ということになります。
そのオプション設定ページに表示させるためのhtmlをoutput するための関数などを以下に。これはテーマのオプションを読み込んだり設定したりするクラスの中にある関数です。途中省略してます。肝心なのは最後のjavascript の部分だけではあります。管理画面の中なのでjQuery が使えるのです。
61~66行目が肝心のAjax の部分です。そこだけでいいんでないの?そうですね・・・ついつい。
実はこの時はまだ知らなかったのでWordPress 推奨のAjax の作法に基づいたやりかたではありません。リクエストを送信するphpファイルを別途用意してという普通のやりかたでじたばたしてました。なんてことだっ!ってことでそのphpファイルのface_list_make.php。
sessionを使用しているのは一応のセキュリティ対策ではあります。いらぬところから動かされないようにとワンタイムチケットなるものです。管理画面の中なのでこれまたcookie は使用できるはずです。チケットの発行はfunctions.php のテーマのオプションを設定するクラスの中に関数を作って、そのクラスを読み込むときに管理画面においてsessionに登録しています。functions.php からではだめだろうかと思いましたが、ちゃんと機能しました。はたして必要でしょうか?
これで機能したのでとりあえずは意図は達成できたのであります。
が、事件はこの後起こってしまったのです。
ネットをうろうろしていたら、「Theme Check 」などというプラグインがあることを知ることになってしまったのであります。
これは楽しそうだと、さっそくチェックさせてみたら、これがまぁ、なんてこったで警告の大行進というような状況で・・・。
その中で、まっさきに目についたのがfopen とか fclose とかfile_put_contents とかファイル操作に関する事。
「警告: ファイル functions.php 内に fopen が見つかりました。 ファイル操作は直接的な PHP ファイルシステムコールの代わりに WP_Filesystem メソッドを使用する必要があります 。 」
とのことです。
なになに?WP_Filesystem とな?そんなのがあるのか?と、いうことになって初めて知ることになった訳です。
しらなかったのね~!あれま~!
ネットでじたばたしてもこれに関しての詳しい情報自体が少ないようです。codex の《ファイルシステムAPI》から引いてみると、
「WordPress自身の自動アップデート機能のために開発されました。ファイルシステムAPIは、ファイルシステム上のローカルファイルを読み書きする機能を、異なるホスティング上でセキュアに行うために抽象化します。
多くのホスティングシステム上のウェブサーバーは、WordPressファイルのオーナーとは異なるユーザーで動いています。この場合、ウェブサーバーからファイルを書き込まれる際に、実際のユーザーアカウントではなく、ウェブサーバーのユーザーアカウントがオーナーのファイルが作られます。このことは、複数のユーザーがひとつのウェブサーバーを共有し異なるサイトが動いている共有ホスティングの場合にセキュリティ上の問題を引き起こします。
WP_Filesystemはファイルを書き込むユーザーが異なるかどうかを判別し、FTPかそれに代わる手段に切り替える機能を有しています。利用可能なPHPライブラリーに依存しますが、WP_FilesystemはFTPを利用するための3つの異なる手段(エクステンション、ソケット、SSH経由)をサポートしており、自動的に最適な手段が選択されます。
この場合、プラグインまたはテーマでユーザーにFTPの認証情報を入力させるコードを実装する必要があります。入力フォームの見た目を統一し、実装を簡単にするための関数が用意されています。 」
と、いうことですな、ふむふむなるほどと。
しかし、実装方法がよくわからないというかむずかしいのですが、codex を見ていくと、「ヒントとトリック」の「WP Filesystem API の方法論」がこの場合にそのまま使用することができそうでした。
で、実はこの時にもしかしたらAjax においても用意されている作法があるのではないか?と、ひらめいたのです。
WordPress での Ajax においては、codex よりもjQuery を使用した場合の解説をしてくれている他の様々なサイトを見た方がわかりやすくて簡単です。
- WordPress での Ajax においては、javascript からのリクエスト送信先には、「WordPressの管理システムで定義されたURL(bloghome)/wp-admin/admin-ajax.php 」に設定すること。
- リクエストを受けるphpはfunctions.php の中に関数として記述する。
- その、functions.php の中に書かれた関数は、リクエストを受け取った時にどのPHP関数を呼び出せばいいのかを、アクションフックにて認識させる。
と、いうことです。
それでは、と、一番上に載せた、オプション設定ページに表示させるためのhtmlをoutput するための関数のなかのAjaxリクエスト送信のjQuery の部分。
見ればわかりますが、POST にての送信です。
リクエスト送信先のurl をajaxurl としています。これは、管理画面においてだけWordPress によってあらかじめ設定されている変数です。管理画面のなかであれば、この変数が使用できます。ちなみに私のローカルな環境においての値は、「wp/wp-admin/admin-ajax.php 」でした。
”action” において設定している文字列は、後述する、php関数をアクションフックで登録する際の、アクションフック名「wp_ajax_{} 」のWp_ajax_につづく{}に指定する部分となります。関数名と同じである必要はありません。
なお、今回はPOST にて書いていますが、ajax で書くなら以下のごとくで当然のことながらほとんど同じようなものです。
そして、リクエストを受け取る側のfunctions.php に書いたphp関数。
尚、こちらのほうはと言えば、先に書いたWP_Filesystem を、まんまcodex から引っ張り出してきた内容にて適用しています。念のために言っておくと、これはあくまで管理画面内で動かすものであるから、codex そのまんまで使えるということだと。
アクションフックが二つあるのは、ログインユーザーと非ログインユーザー用で共にフロントエンドにおいてということなので両方とも必要であると思われます。codex の原文は「So, if you want it to fire on the front-end for both visitors and logged-in users, you can do this: 」となってます。
27行目でscandir を使用していますが、これは「Theme Check 」から警告されません。
scandir においては、WP_Filesystem のいくつかあるファイルの中身を探してみましたが見つかりません。調べて見ると、「wp-includes/class-wp-theme.php 」の 「WP_Theme 」クラスにprivate static としてscandir 関数があります。ゆえに、WP_Theme::scandir ですね。説明的には、「Scans a directory for files of a certain extension 」。「特定の拡張子のファイルをディレクトリにおいてスキャンします」ということかな?
で、あればあえてこれを使うこともなさそうです。
以上で管理画面内で動かすこの件においては、WP_Filesystem 、およびWordPress においてのAjax を適用させつつ、意図を達成することができました。
Post : 2016/08/24 10:32
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=70560