WordPressのサイト内検索機能で特定のカスタム フィールドを検索対象から除
-
はじめまして。タイトルが長くてすみません。
WordPressのサイト内検索機能で特定のカスタム フィールドを検索対象から除外させる方法を探してます。
HTML入力用のカスタム フィールド(A)を定義し、特定のユーザ レベル($user_level)以上でログインした場合に限り、固定ページの一部にコンテンツ(A)を表示する制御を入れています。
カスタム フィールドは他にもカスタム投稿タイプで利用しており、これらのコンテンツを検索できるようにするため、Search Everything プラグインを導入し、「すべてのカスタムフィールドを検索」をYesに設定しました。
ここで、ユーザが未ログインだった場合($user_level == 0 )は、検索キーワードがカスタム フィールド部分のコンテンツ(A)内の文字列で見つかった場合は検索結果から除外させたいのです(リンク先を開いても中身の存在が確認できないため)。
ページ単位での検索除外設定は下のようなフィルタを作成することで実現できたのですが、特定のカスタム フィールド内の文字列でひっかかったページを、未ログイン時には表示させないようにしたいのですがアドバイスいただけないでしょうか。
function SearchFilter($query) { global $user_level; if ($query->is_search) { $exclude_all = array(1,2,3,4,5,6); //PostIDs $exclude_different = array(1,2,3); //PostIDs //権限:未ログイン if($user_level == 0){ $query->set('post__not_in',$exclude_all); } //権限:ログイン済み elseif($user_level > 0){ $query->set('post__not_in', $exclude_different); } } return $query; } add_filter('pre_get_posts','SearchFilter');
Search Everything プラグインの設定はそのままに、function.phpへの追記で実現できれば理想です。
よろしくお願いいたします。
-
ちょっと検証していないのですが、考え方だけ。
WordPress 3.1以降であればWP Queryで meta_query というのが使えるのでそれで制御できると思います。
http://codex.wordpress.org/Function_Reference/WP_Query#Custom_Field_Parameters以前、フォーラムに似たような投稿がありましたので、そちらもご覧ください
http://ja.forums.wordpress.org/topic/10582?replies=5あと、user_levelは3.0から非推奨になっているので、
is_user_logged_in を使った方が良いかとgatespaceさん
ご回答ありがとうございます。meta_queryでそれっぽい条件を作って$query->setに入れてみたのですが、設定が悪かったのか期待通りに動かせてません。参考のURLを元にもう少し調べてみます。また、user_levelが非推奨になったのは存じてなかったのですが、実際はログイン・未ログインだけではなく、会員レベルに応じて数段階出力するHTMLを切り替えている制御が必用で、これを使用しています。
考え方の提示のみでごめんなさい。
また、user_levelが非推奨になったのは存じてなかったのですが、実際はログイン・未ログインだけではなく、会員レベルに応じて数段階出力するHTMLを切り替えている制御が必用で、これを使用しています。
会員レベルというのがWordPressの権限グループに当たるのであれば、current_user_can という関数が使えます。
自分のブログで恐縮ですが、以前「WordPressでユーザー情報で条件分岐」をいう記事を書いたので、ご覧いただければと思います。
http://gatespace.wordpress.com/2012/10/23/wp-user-info-conditional/meta_queryでそれっぽい条件を作って$query->setに入れてみたのですが、設定が悪かったのか期待通りに動かせてません。
具体的にコードを提示してもらえれば、分かる人が回答できると思いますよ。
gatespace さん
アドバイスありがとうございます。グローバル変数ではなく関数で取得するのが作法なのですね
。以前書いてみたコードです。特定のフィールド名で検索文字を like で探したらどうかと考えてみました。このタイミングでカスタム フィールドの値を検索条件でさらに絞っても良いのか疑問に思いながら書いてみましたが、はやり期待通りには動作しませんでした。
functionSearchFilter($query) { if ($query->is_search) { $query->set( 'meta_query', array( array( 'key' => '<フィールド名>', 'value' => $query, 'compare' => 'LIKE' ) ) ); } } add_filter('pre_get_posts',"functionSearchFilter")
そもそも、一旦すべて検索で取得しておいて、そこから検索キーワードがカスタム フィールドの値によって一致した場合は除外、としたいので、このコードは見当違いだったと思います。
本件、カスタム フィールドではなく、別のカスタム投稿タイプでコンテンツを作成することにしました。
ご回答いただいた皆様ありがとうございました。
- トピック「WordPressのサイト内検索機能で特定のカスタム フィールドを検索対象から除」には新たに返信することはできません。