PHP_CodeSnifferを使ってWordPressのプラグインやテーマがコーディングスタンダードに準拠しているかチェックする

先日、海外のユーザーさんから「おまえWordPressのコーディングスタンダートをガン無視してるやないか!」というツッコミを頂きまして、「あーすいませんすいません」みたいなやりとりをしてたら、コマンドラインでコーディングスタンダードに準拠しているかどうかをチェックするツールを教えてもらいました。

phpcs

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

(※ このメッセージの意味は最低でも4つのスペースでとのことですが、WordPressのインデントは本物のタブを使うことになっているので、これはエラーメッセージの間違いですね。コメントで指摘もらいました。感謝です。)

これらをちゃちゃっと習性してもっかいチェックしてみました。

FILE: ...ww/dev.localwww/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

あと、`.composer/vendor/bin`にパスを通す必要があります。
以下の行を`~/.bash_profile`に追加しましょう。

export PATH=~/.composer/vendor/bin:$PATH

以上でインストールは完了です。

ちなみにphpcsを最新版にアップデートするなら以下のような感じで。

composer global update

composerってglobalってオプションがついて便利になりましたね。

あと、.bash_profileに以下のように記述しておくと、コマンドが短くなって便利です。

alias wpcs="phpcs -p -s -v --standard=WordPress"

以降は以下のような感じで、チェックが出来ます。

$ wpcs simple-map/simple-map.php