11
10

More than 5 years have passed since last update.

WordPressのテーマやプラグインに仕込んだオレオレフックをPHPUnitでテスト

Last updated at Posted at 2015-04-10

自作のテーマやプラグインにオレオレフックを仕込んで置くと、一気に汎用性が高くなって再利用をしやすくなります。

オレオレフックを仕込んでおくと便利な場所はだいたい以下のような感じ。

  • HTML - たとえば<div>おれおれ</div>みたいなHTMLをサイトによっては<p>おれおれ</p>みたいに変えたいことがありますよね。
  • 数字 - たとえば表示したいデータの数とかは、サイトによって5だったり10だったり。0とか1以外の数字は全部フィルターフックをつけてもいいぐらい。
  • テキスト - たとえばこんにちは!やあ!に変えたいとかは再利用をする際にはかならずあるので、テキストにもフィルターフックを仕込んでおくと便利です。

これらの場所にフィルターフックを仕込むのは簡単です。

return 'こんにちは!';

を以下のように修正するだけです。

return apply_filters( 'my_custom_filter', 'こんにちは!' );

これに関しては詳しいことがプラグイン本に書いてあるので、そっちを読んでください。笑

PHPUnitでフィルターフックの動作をテスト

このように自作プラグインにオレオレフックを仕込んだら、それが期待通りに動くか?とか想定したいろいろなシチュエーションで使いやすいかとかテストしたいですよね。

そんなときは以下のようにテストコードを書きます。

まずプラグイン側は以下のような感じを想定。

function hello{
    return apply_filters( 'my_custom_filter', 'こんにちは!' );
}

PHPUnitのテストコードは以下のような感じ。

class Oreore_Test extends WP_UnitTestCase
{
    /**
     * @test
     */
    public function filter_test()
    {
        // デフォルトの状態でテスト
        $this->assertSame( 'こんにちは!', hello() );

        // フィルターフックを追加した状態でテスト
        add_filter( 'my_custom_filter', function( $str ){
            return 'やあ!';
        } );

        $this->assertSame( 'やあ!', hello() ); // やあに変わったことを確認
    }
}

これだけだとあんまり意味がなさそうですが、ちょっとややっこしいのになると以下の様な感じになります。

以下の例では、manage-downloads-link-htmlというフィルターフックを仕込んで、そのコールバック関数に4つの引数が渡されるようにしています。

return apply_filters(
    'manage-downloads-link-html',
    sprintf(
        '<a id="manage-downloads-%1$s" href="%2$s">%3$s</a>',
        $atts['id'],
        esc_url( self::get_permalink( $atts['id'] ) ),
        esc_html( get_the_title( $atts['id'] ) )
    ),
    $atts['id'],
    self::get_permalink( $atts['id'] ),
    get_the_title( $atts['id'] )
);

この場合、それぞれの引数の値とかもチェックしたいですよね。

あとデザイナーさんの意図通りのHTMLに、テーマのfunctions.phpでカスタマイズできるかも確認しておきたいです。

そんなわけで、テストに書いたコードは以下のとおり。

add_filter( 'manage-downloads-link-html', function( $link_html, $post_id, $url, $onclick, $title ){
    return sprintf(
        '<a class="manage-downloads-%1$s" href="%2$s">%3$s</a>',
        esc_attr( $post_id ),
        esc_url( $url ),
        $title
    );
}, 10, 4 );
$this->assertSame(
    '<a class="manage-downloads-' . $post_id . '" href="http://example.org/download/' . $post_id . '">Download!!</a>',
    do_shortcode( '[download_link id="' . $post_id . '"]' )
);

長くメンテナンスしてると、使わなくなったフックとかあってうっかりフックの挙動を変えてしまうことがあるので、こうしておくととても便利ですよ。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10