【WordPressでフィルターフックをした関数を除去する】フックした条件や値を「あとに引きずらない」ように解除(除去)する方法

WordPressで「query_posts」や「WP_Query」などを使って、最新記事を表示する場合ってあると思います。下のページは以前そんなことを書いた参考例です。

 

それで、例えばもう一つ工夫をして「本日の日付から過去30日間に書かれた最新記事を5件表示」したいと思ったとします。

その場合はCodexのサンプルコード(テンプレートタグ/query posts)を引用して書きますと、以下のようになります。

function filter_where( $where = '' ) {
	// 過去30日間の投稿を表示
	$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
	return $where;
}
add_filter( 'posts_where', 'filter_where' );

query_posts( $query_string . "&ignore_sticky_posts=1&posts_per_page=5" );

やっていることは、

  • 関数「filter_where」を作って、
  • 「filter_where」関数内で、SQL文のWhere節に当たる検索条件を作る。
  • フィルターフック「add_filter」を利用して、フィルター「posts_where」に関数「filter_where」をフックして
  • 「query_posts」で最新記事5件を出力

って感じです。

フィルター「posts_where」を使えば、SQL文のwhere節の書き方さえなんとなくわかれば、思いのままの条件で必要な情報を取得することができるんで、便利ですね。

Codex(カスタムクエリ)には、以下のように書かれています。

SQL文のWHERE節を拡張して、プラグインテーブルのフィールドも探すようにします。

これは'posts_where'フィルターを使います。このアイデアを使えば、

WordPressが投稿タイトルフィールドを探すときの動作を

カスタムテーブルのフィールドに対しても適用できます

(WordPressのなにかと複雑なロジックをコピーするよりはいいでしょう)。

WordPressはこのような節を追加します:(post_title LIKE 'xyz')

それで、便利は便利なんですけども、この「add_filter」でフックした関数で指定した検索条件は、あとにも引き継がれます。

単純に表現すると、このコードの次に「また違った条件で何かを出力したい場合」は、先で設定した「add_filter」でフックした「filter_where」関数の検索条件が邪魔になってきます。

そこで、「add_filter」でフックした関数を解除(除去)する方法があります。「remove_filter」を利用します。

「remove_filter」を使って、フィルターフックした特定の関数を解除(除去)

単純に書きますと、先ほどのサンプルコードで「filter_where」関数をフックさせると下のようになります。

add_filter( 'posts_where', 'filter_where' );

ですので、この場合「remove_filter」を使うと

remove_filter( 'posts_where', 'filter_where' );

と書きます。

「remove_filter」の注意点

codex(関数リファレンス/remove filter)に書いてあるんですが、

除去に失敗した時に警告は出ません。

とあります。これは、その後に出てくる

この関数は、意図したフィルター以外のフィルターも除去する可能性があります。

に関係しているんじゃないかと理解しています。ちゃんと間違えずにremove_filterしてね、っていうことですかね。間違えても警告されないんで、間違いに気づきにくいかもよ、的な。

是非「いや、こういう意味だぜ」みたいな情報がございましたらご教示ください・・・と言うわけでして「remove_filter」の詳細やパラメータ設定などについては、codex(関数リファレンス/remove filter)で実際に確認いただけるとより理解が深まると思います。

「remove_filter」は「wp_reset_query()」などと併せて覚えています

この関数で指定した条件を「あとに引きずらない設定」は「query_posts」で「wp_reset_query()」を使用する流れと似ていますね。意味するところも大体似ていると思っています。

  • 「query_posts」のあとは、「wp_reset_query()」
  • 「add_filter」のあとは、「remove_filter」

みたいな。

意図的に条件や値をひきずらせる場合を除き、この処理は覚えておいたほうがいいと思いました。

著者:bouya Imamura