WordPress: フックに登録した無名関数を削除する


WordPressではフックというコード中に埋め込まれたラベルにコールバックを登録することで機能を拡張できます。

次の例では、'render_block_core/paragraph' というフィルターフックに 'lf_render_p' というコールバックを登録しています。このフックは段落ブロックを書き出す直前に置かれているので、すべての段落ブロックに ABC という文字が追加されることになります。

// 全段落ブロックに ABC を追加
function lf_render_p( $block_content, $block, $instance ) {
    return $block_content.'<p>ABC</p>';
}
add_filter( 'render_block_core/paragraph', 'lf_render_p', 10, 3 );

コールバックにデータを渡すには、コールバックを無名関数とし、use() を使います。次の例では呼び出し側でセットした $message がすべての段落ブロックに追加されます。

// 全段落ブロックに任意の文字列を追加
$message = 'XYZ';
add_filter( 'render_block_core/paragraph',
    function( $block_content, $block, $instance ) use( $message ) {
        return $block_content.'<p>'.$message.'</p>';
    }, 10, 3 );

コールバックを削除したいこともあります。たとえば、最初の段落ブロックにのみ文字を追加したいとします。コールバックが最初に呼ばれたときに削除してしまえばよいわけですから、次のように remove_filter() 関数を使えば実現できます。ちなみに3行目はフックやコールバックをハードコードせずに済む便利な表現です。

// 最初の段落ブロックだけに ABC を追加
function lf_render_p( $block_content, $block, $instance ) {
    remove_filter( current_filter(), __FUNCTION__ );
    return $block_content.'<p>ABC</p>';
}
add_filter( 'render_block_core/paragraph', 'lf_render_p', 10, 3 );

2番目の例のように無名関数をコールバックにした場合には、Callable とするために無名関数を変数に納め、それを渡します。

// 最初の段落ブロックだけに任意の文字列を追加
$message = 'XYZ';
$lf_render_p = function( $block_content, $block, $instance )
    use( &$lf_render_p, $message ) {
        remove_filter( current_filter(), $lf_render_p );
        return $block_content.'<p>'.$message.'</p>';
    };
add_filter( 'render_block_core/paragraph', $lf_render_p, 10, 3 );

use() が引き渡すのは実行時の内容でなく関数が定義された時点の内容なので、$lf_render_p を参照渡ししています。

Posted by

on

in category