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

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

この記事は、jim912によって書かれたものです。
引用を行う場合は、著作権法に定める範囲にて、引用元であるSimple Colorsの出展元表示とhttp://www.warna.info/archives/2666/へのリンクを必ず行って下さい。

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

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

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

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 );
カテゴリー: WordPressの小技 タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です