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」
みたいな。
意図的に条件や値をひきずらせる場合を除き、この処理は覚えておいたほうがいいと思いました。
このページを共有する