[追記あり] [メモ] WordPressでクエリーをいじっていたらカスタムメニューが消えてしまった件
Posted by admin at 18:08 日時 2012/03/02
WordPressはプラグインなどからクエリーをいじって標準の挙動を変えることができるのですが、その際に困ったことがあったのでメモ。
具体的にはカスタムフィールドに特定の値が入っている投稿のみが表示されるようにWordPressの動作を変更するために、parse_queryアクションにフックしてクエリーの変更を試みました。ところが、単純に meta_query を追加するだけだと、カスタムメニューが消えてしまいます。原因はあらゆる投稿タイプに適用されてしまうことが原因(カスタムメニューはバックエンドではカスタム投稿タイプとして実装されています)だったので、投稿タイプが指定されていないか、投稿・固定ページの場合にのみ適用されるようにして解決しました。
add_action( 'parse_query', 'my_parse_query'); function my_parse_query($query) { global $user_level; $post_type = $query->get('post_type'); if ( !is_admin() ) { if ( empty($post_type) || ('post' == $post_type) || ('page' == $post_type) ) { $args = array( array( 'key' => 'field_key', 'value' => 'field_value' ) ); } } if ( $user_level < 2 ) $query->set( 'meta_query', $args ); } }
でもちょっと不安なのでバグが出たりしたらこの記事を修正するかもです。とりあえず、メモ書き程度に。
# 検索結果では投稿タイプは ‘any’ でセットされる様なんですが、SQLが発行されるタイミングになるまでは空のままみたい。ややこしい…。
# フックでクエリーを改変するサンプルはCodexのCustom Queriesのページに色々載っています。
■追記&コード修正
記事を公開してしばらくしたら天の声が。
[blackbirdpie url=”https://twitter.com/#!/jim0912/status/175555649227329536″]
ありがとうございます!!すっきり解決しました。
add_action( 'parse_query', 'my_parse_query'); function my_parse_query($query) { global $user_level; if ( !is_admin() && ($user_level < 2) ) { if ( $query->is_main_query() ) { $args = array( array( 'key' => 'field_key', 'value' => 'field_value' ) ); $query->set( 'meta_query', $args ); } } }
持つべきものはスーパーWPerの知り合いですなぁ〜