WordPressテーマなどでは、PHP関数で直接ファイル操作をするのは非推奨、WP_FileSystemを使って操作するのが望ましいらしい

3730930942_1b6835eef7_b

先日、自分が作成しているテーマにスキン機能をつけてみました。

スキン機能は、PHPのファイル操作関数を使っていました。

するとその後、テンプレートチェッカーTheme Checkなどでチェックすると「ファイル操作すんなや」と怒られたので、修正方法の紹介です。

photo by Andrew Abogado

スポンサーリンク
レクタングル(大)広告

PHPファイルシステムでの操作は非推奨

それで、先日取り付けた機能というのが以下。

スキン機能の必要/不要はさておき、これらの機能の中で、テキストを開くのにPHPのget_contents()関数を使用しました。そしたらテンプレートチェッカーに20ポイントも減点された挙げ句、以下のようにマルウェアとまで言われて怒られてしまいました。

79% - WordPress theme Simplicity

こういうのが出ていたら、おそらく公式テーマとして登録はできません。

これを回避するための方法を検索したのですが、日本語での修正方法が見つからなかったので以下で紹介したいと思います。

ファイル操作をするときは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行で済むところですが、上記のように書く必要があるようです。

ただ、おかげでテーマチェッカーでの警告も出なくなりました。

テーマチェッカーでのValidation結果

WP_FileSystemの参考文献

WP_FileSystemについて検索してみたら、日本語で書かれた参考資料のは少なく、この記事を書いた時点で以下のみが見つかりました。

英語だと以下。

まとめ

WP_FileSystemは、機能が多くて僕も全然全てを把握しているわけではないのですが、WP_FileSystem利用の触りとして何かのお役に立てれば幸いです。