先日、海外のユーザーさんから「おまえWordPressのコーディングスタンダートをガン無視してるやないか!」というツッコミを頂きまして、「あーすいませんすいません」みたいなやりとりをしてたら、コマンドラインでコーディングスタンダートに準拠しているかどうかをチェックするツールを教えてもらいました。
PHP_CodeSniffer + WordPress-Coding-Standards
コーディングスタンダードに準拠しているかどうかをチェックするためのツールとしてはPHP_CodeSnifferというのが有名です。
http://pear.php.net/package/PHP_CodeSniffer/
このPHP_CodeSniffer用に作られたWordPress用のルール(sniffs?)がWordPress-Coding-Standardsです。
https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
さっそく僕のプラグインSimple Mapでどんな感じになるか見てみましょう。
PHP_CodeSnifferでチェックを行うにはphpcsというコマンドに対して、以下のようにルールと対象ファイルを指定します。
$ phpcs -p -s -v --standard=WordPress simple-map/simple-map.php
すると以下のような感じ。
うぐぐ、すいませんすいません。。。
(中略)
--------------------------------------------------------------------------------
FOUND 161 ERROR(S) AND 123 WARNING(S) AFFECTING 114 LINE(S)
--------------------------------------------------------------------------------
17 | ERROR | Line indented incorrectly; expected at least 1 spaces, found 0
| | (WordPress.WhiteSpace.ScopeIndent.Incorrect)
17 | WARNING | Equals sign not aligned with surrounding assignments; expected
| | 2 spaces but found 1 space
| | (WordPress.Formatting.MultipleStatementAlignment)
18 | ERROR | Line indented incorrectly; expected at least 1 spaces, found 0
| | (WordPress.WhiteSpace.ScopeIndent.Incorrect)
18 | WARNING | Equals sign not aligned with surrounding assignments; expected
(以下省略)
この例では、161個のエラーと123個の警告が検出されました。。。
ほぼすべての行で何かしら怒られているので、いくつか見てみました。
まず、大量に出ているのが、Line indented incorrectly; expected at least 1 spaces, found 0というErrorで、これはインデントしてないぞーって意味です。
修正前:
class SimpleMap {
private $shortcode_tag = 'map';
private $class_name = 'simplemap';
private $width = '100%';
private $height = '200px';
private $zoom = 16;
private $breakpoint = 480;
private $max_breakpoint = 640;
function __construct()
修正後:
class SimpleMap {
private $shortcode_tag = 'map';
private $class_name = 'simplemap';
private $width = '100%';
private $height = '200px';
private $zoom = 16;
private $breakpoint = 480;
private $max_breakpoint = 640;
function __construct()
あー、なるほどー、{...} で囲まれてたらインデントしろってことですね。
あと、インデントにはスペースじゃなくてタブを使わんかいってエラーも大量に出てます。
Line indented incorrectly; expected at least 4 spaces
これらをちゃちゃっと習性してもっかいチェックしてみました。
FILE: ...ww/dev.local/www/wordpress/wp-content/plugins/simple-map/simple-map.php
--------------------------------------------------------------------------------
FOUND 90 ERROR(S) AND 14 WARNING(S) AFFECTING 38 LINE(S)
--------------------------------------------------------------------------------
27 | ERROR | No space after opening parenthesis of function definition
| | prohibited (WordPress.Functions.FunctionCallSignature)
27 | WARNING | No space after opening parenthesis of array is bad style
| | (WordPress.Arrays.ArrayDeclaration)
27 | WARNING | No space before closing parenthesis of array is bad style
| | (WordPress.Arrays.ArrayDeclaration)
これだけで、以下のように劇的にツッコミが減りました。
| 修正前 | 修正後 | |
|---|---|---|
| ERROR | 161 | 90 |
| WARNING | 123 | 14 |
インストール方法
PHP_CodeSniffer + WordPress-Coding-StandardsをMacにインストールするには以下のような感じで。
以下の方法はComposerを使用する方法なので、ComposerがなければComposerもインストールする必要があります。
$ brew install composer
つぎに、PHP_CodeSnifferをインストールします。
$ composer global require 'squizlabs/php_codesniffer=*'
次にWordPress-Coding-Standardsをインストールします。
git clone git@github.com:WordPress-Coding-Standards/WordPress-Coding-Standards.git \
~/.composer/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/WordPress
以上でインストールは完了です。
ちなみにphpcsを最新版にアップデートするなら以下のような感じで。
composer global update
composerってglobalってオプションがついて便利になりましたね。
あと、.bash_profileに以下のように記述しておくと、コマンドが短くなって便利です。
alias wpcs="phpcs -p -s -v --standard=WordPress"
以降は以下のような感じで、チェックが出来ます。
$ wpcs simple-map/simple-map.php
最近の投稿
- 管理画面におけるエラーメッセージの表示
- WP-CLI+PHPUnitを使ったWordPressプラグインのユニットテスト(2)
- WP-CLI+PHPUnitを使ったWordPressプラグインのユニットテスト(1)
- WP-CLI経由のときにプラグインが警告を吐くときの対処方法
- Vagrant+Amimotoで超高速&鼻血がでるぐらい便利なWordPress環境をコマンド一発で起動する。
- WP Total Hacks 1.8.0 – Pingbackをブロックする機能を追加しました。
- Vagrant Shareを使ってVagrant上で構築中のWordPressを一時的にネットに公開!
- oEmbed Gist + Jetpack 2.9について
- WordPressで jQuery UI を使うときに、WordPressと同じバージョンのCSSをGoogleから取得する
- WordPressでget_*()を使うときは念のためソースを確認して適切に処理すべし!