先日、自分が作成しているテーマにスキン機能をつけてみました。
スキン機能は、PHPのファイル操作関数を使っていました。
するとその後、テンプレートチェッカーやTheme Checkなどでチェックすると「ファイル操作すんなや」と怒られたので、修正方法の紹介です。
photo by Andrew Abogado
目次
PHPファイルシステムでの操作は非推奨
それで、先日取り付けた機能というのが以下。
スキン機能の必要/不要はさておき、これらの機能の中で、テキストを開くのにPHPのget_contents()関数を使用しました。そしたらテンプレートチェッカーに20ポイントも減点された挙げ句、以下のようにマルウェアとまで言われて怒られてしまいました。
こういうのが出ていたら、おそらく公式テーマとして登録はできません。
これを回避するための方法を検索したのですが、日本語での修正方法が見つからなかったので以下で紹介したいと思います。
ファイル操作をするときはWP_FileSystemを使用する
WordPressでは、PHPの関数を使ってファイル操作をするのは好ましくないと考えられています。
確かにそれは当然で、変なコードを含むものを直接読み込んで表示させたら、まずいので非推奨なのも分ります。それを回避するには、WP_FileSystemというWordpress用ファイル操作オブジェクトを使用するのが望ましいそうです。
WP_FileSystemの使用方法は、以下に詳しく書かれています。
Filesystem API « WordPress Codex
問題の箇所
で、スキン機能の問題の箇所は以下の記述でした。
$css = file_get_contents($pathname);//CSSファイルを開く
これは、$css変数に$pathnameのCSSファイルを開いて読み込む動作です。
CSSファイル内のコメント部分に、何が書かれているかをチェックするためだけに開いて、表示したりしないのですがそれでもダメみたいです。
修正方法
これを回避するには、WP_FileSystemを使用して以下のように書く必要があるようです。
まずは、WP_FileSystemを利用するために、「Wordpressインストールディレクトリ/wp-admin/includes/」にあるfile.phpを呼び出す必要があります。
require_once(ABSPATH . 'wp-admin/includes/file.php');//WP_Filesystemの使用
ABSPATHは、Wordpressのインストールディレクトリが入っています。WP_FileSystemを利用するのに、上記の記入がないと、使用できないのがかなりの引っかかりポイントでした。
あとは以下のようにして、WP_FileSystemを利用します。
if ( WP_Filesystem() ) {//WP_Filesystemの初期化 global $wp_filesystem;//$wp_filesystemオブジェクトの呼び出し $css = $wp_filesystem->get_contents($pathname);//$wp_filesystemオブジェクトのメソッドとして呼び出す //...処理を書く }
PHPのファイルシステムで、get_contents()と呼び出せば、1行で済むところですが、上記のように書く必要があるようです。
ただ、おかげでテーマチェッカーでの警告も出なくなりました。
WP_FileSystemの参考文献
WP_FileSystemについて検索してみたら、日本語で書かれた参考資料のは少なく、この記事を書いた時点で以下のみが見つかりました。
- ……きこえますか……WP_FileSystemを使うのです…… | 高橋文樹.com
- WordPress Snippet | WP_Filesystemを使った、ファイルの作成
- WPの自動アップグレードについて調べてみる | XPressME Integration Kit
英語だと以下。
まとめ
WP_FileSystemは、機能が多くて僕も全然全てを把握しているわけではないのですが、WP_FileSystem利用の触りとして何かのお役に立てれば幸いです。