WordPressで特定の関数から呼ばれたときだけフックをかける裏技!?

フォーラムの 「カテゴリのよく使うものを削除」の回答にて使ったものなのだけど、特定の関数から呼ばれたときだけフックさせたい時ってありませんか?私は結構あります。

自作のプラグインとか、テーマであれば、直前に add_filter して、直後に remove_filter することも出来ますが、コアファイルや配布されているプラグイン・テーマだとそうもいかないですよね。

そんなにっちもさっちも行かないようなケースの場合、php の debug_backtrace 関数を使って、呼び出し元に特定の関数名が存在しているかのチェックを行えばなんとかなるということに気がつきました。

ただし、本来デバッグ用のものですから、こういうことに用いていいのかどうかはわかりません(爆
※ 詳しい方コメントください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function exclude_default_category_from_popular_list( $args, $taxonomies ) {
    if ( in_array( 'category', $taxonomies ) ) {
    $traces = debug_backtrace(); // 呼び出し元を取得する
        foreach ( $traces as $trace ) {
            // 関数名を照合
            if ( isset( $trace['function'] ) && $trace['function'] == 'wp_popular_terms_checklist' ) {
                // get_terms の引数に、デフォルトカテゴリーの除外を追加
                $args['exclude'] = array( get_option( 'default_category' ) );
                // 合致したらループをその場で抜ける
                break;
            }
        }
    }
    return $args;
}
add_filter( 'get_terms_args', 'exclude_default_category_from_popular_list', 10, 2 );