wordpress フィルターフック 調査方法

フィルターフックとは?

定義

フィルターは、WordPress が様々な種類のテキストをデータベースまたはブラウザ画面へ送信する前に、それを変更できます。プラグインは、フィルター API を利用して、指定したテキストをその時点で変更する PHP 関数を実行できます。

なんのこっちゃ? なので解説

よく考えてみよう!
Railsなどはモデルからコントローラーから自分で作成してDBとのやり取りを記述しないといけない。 でもWordPressでは?
そう、画面しか作っていないよね。
基本的にtheme の中に作成していくのでモデルとか記載していないですね。

Railsで言えば、assets(css, JavaScript) とview だけ作るイメージ。

ではルーティングはどうするの?
そう、ワードプレスがテンプレート階層という順位付けがあり、その規定に準じて、ファイル名を命名しないといけない。

それがテンプレート階層

この記事など参考にしてください。 WordPressのテンプレート階層を初心者でも分かるように解説 | lblevery

本日の本命は、フィルターフックです。

まずソースから

navメニュのクラスを削除して、表示中メニューに 'current' クラスを付与するフィルターフック

add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 );

function remove_to_currentClass( $classes, $item ) {
    $classes = array();
    if( $item -> current == true ) {
        $classes[] = 'current nav-item';
    } else {
        $classes[] = 'nav-item';
    }
    return $classes;
}

関数定義

<?php add_filter( $tag, $function_to_add, $priority, $accepted_args ); ?>

引数

$tag

$function_to_add 引数で指定した関数を登録するフィルターフックの名前。 これはワードプレスが決定しているので、自分では決めれない。基準に沿うものを探そう。

$function_to_add

フィルターが適用されたときに呼び出される関数の名前。 これは自分で命名して関数を記述する。 上記では remove_to_currentClass

$priority

フィルターフックに登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行する。初期値は10.優先順位が低いときは100とかにする。10刻みが利用されることが多い。

$accepted_args

関数が受け取る引数の個数。 上記の場合は2つ 自分で作った関数に引数を2つ渡している。

ここからがポイント

上記の nav_menu_css_class の定義はここ

developer.wordpress.org

apply_filters( 'nav_menu_css_class', string[] $classes, WP_Post $item, stdClass $args, int $depth )

apply_filtersは、WordPress コアの関数のなかで呼び出されているので、そのように記述されている

ざっくり言うと、これをadd_filterに置き換えて、functions.phpの中で利用する

引数は4つ

$classes  string型の配列

メニューの中の li タグに適用したいクラス string[] の配列になっているのがポイント だから配列で初期化している

$item WP_Post型

現在のメニュー item これは、ダッシュボードで登録されているメニューですね。

$args  stdクラス 

wp_nav_menu() 関数の 引数ですね。 そもそもNAVバーを表示しているときに、wp_nav_menu() を記述しているはず。 その引数です。

$depth int型

メニューアイテムの深度、paddingに利用する

もう一度書きます。

//フィルターフックは、nav_menu_css_classというワードプレスの関数。
//メニューの<li>タグにクラスを適用する関数
//自分で作った関数は emove_to_currentClass' 引数を2つもっていくよ!
add_filter( 'nav_menu_css_class', 'remove_to_currentClass', 10, 2 );

function remove_to_currentClass( $classes, $item ) {
    $classes = array();

//$item は WP_Post型だから current というプロパティを持っている。
//もし current だったらクラス名は current nav-itemを当ててね。
    if( $item -> current == true ) {
        $classes[] = 'current nav-item';

//そうでなかったら、nav-item だけ当ててね
    } else {
        $classes[] = 'nav-item';
    }
    return $classes;
}