• 解決済 simplysx

    (@simplysx)


    simplysxと申します。
    カスタム投稿「bookinfo」での投稿情報の中から
    キーが「キーワード」で、値が「アーカイブ」のものを除外したいと思い
    以下のコードを書きました。

    <?php
    $paged = get_query_var('paged');
    query_posts(
    array(
    'post_type' => 'bookinfo',//投稿タイプ
    'post_status' => 'publish',//公開中かどうか
    'posts_per_page' => 15,// 1ページに表示する件数
    'meta_key' => 'キーワード',
    'meta_value' => 'アーカイブ',
    'meta_compare' => '!=',
    'orderby' => 'rand',// ランダムに表示
    'paged' =>  ( $paged ) ? intval($paged) : 1
    ));
    ?>

    ↑これだと表示部分だけが真っ白になりました。

    'meta_key' => 'キーワード',
    'meta_value' => 'アーカイブ',
    'meta_compare' => '!=',

    の部分を

    'key' => 'キーワード',
    'value' => 'アーカイブ',
    'compare' => '!=',

    にすると表示はされますが、アーカイブが除外されません。
    カスタムフィールドの入力にはプラグイン「Custom Field Template」を使用しております。
    どのように記述すればアーカイブが除外されるのでしょうか。
    どなたかご教授お願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 同じような症状で悩みました。
    以下のコードでどうですか?
    ちょっと力技っぽくてスマートじゃないですけど、大量の記事がなければまあいいんじゃないかなあと思います。

    $args = array(
    	'post_type' => posts,
    	'meta_query' => array(
    		array(
    			'key' => 'キーワード',
    			'value' => 'アーカイブ',
    		)
    	)
     );
    $postslist = get_posts( $args );
    foreach($postslist as $postval){
    	$result[] = $postval->ID;
    }
    //$resultに除外したいカスタムフィールドの値を持っている記事のIDが配列ではいります。
    
    $paged = get_query_var('paged');
    query_posts( array($query_string,
    'post_type' => 'bookinfo',
    'post_status' => 'publish',
    'posts_per_page' => 15,
    post__not_in=>$result,//除外したいIDの記事をはじいてもらいます。
    'orderby' => 'rand',
    'paged' =>  ( $paged ) ? intval($paged) : 1
    ));

    2ヶ月前の質問ですから見ていないかもしれませんが、
    次の部分を

    'meta_key' => 'キーワード',
    'meta_value' => 'アーカイブ',
    'meta_compare' => '!=',

     
    次のようにすると除外して表示されないでしょうか?

    'meta_query' => array(
    	array(
    		'key' => 'キーワード',
    		'value' => 'アーカイブ',
    		'compare' => '!=',
    	)
    ),

     
    関数リファレンス/WP_Query#Custom_Field_Parameters – Codex 日本語版
    query_posts(WP_Queryクラス)でカスタムフィールドを使う – WordPress私的マニュアル

    'meta_query' => array(
    	array(
    		'key' => 'キーワード',
    		'value' => 'アーカイブ',
    		'compare' => '!=',
    	)
    ),

    なるほどこういうやり方があるんですね、
    横から入ってきといて勉強になってしまいました。

    私がさっきあげたようなめんどくさいことをしなければならなかったのは、

    あるkeyにあるvalueが入っている記事だけを除外

    したかった場合なんです。なので質問者さんとは違う条件で追っているときに辿り着いた方法になってしまっています。
    compareで除外しようと試みると、
    あるkeyを持っている記事の中で、あるvalueを持っているかどうかを判定するので、
    あるkeyを持っていないものも除外されてしまうんです。
    すべての記事にkeyを記述しないといけなくなる。
    で、あるkey(’key’ => ‘キーワード’,←こういうやつ)を設定しないとvalueだけではcompareできないのか、除外が機能しません。全部出力されてしまいます。

    あるkeyをワイルドカードで指定

    することができたりするんでしょうか。
    'key' => *
    とかの感じで。
    そうすれば「除外」も幅が広がるんじゃないかなとか思ったんですが見つからなかったです。

    ここで横やりが質問してもいけないので話は戻しますが、あげたコードは一度get_postsで除外記事を取得してpost__not_inで除外するということになってしまっています。
    もっとスマートなやり方があればと思っていますが、もし同じように

    検索結果にカスタムフィールドの値で除外したい

    という場合には試してみてください。

    WP3.1

    トピック投稿者 simplysx

    (@simplysx)

    mogueさん popupさん
    投稿して頂きありがとうございます。
    2ヶ月前の質問だったので、ほぼあきらめかけてました。

    popupさんのおっしゃった

    'meta_query' => array(
    	array(
    		'key' => 'キーワード',
    		'value' => 'アーカイブ',
    		'compare' => '!=',
    	)
    ),

    で、除外することができました!!
    popupさん、ありがとうございます。

    mogueさんのご意見、とても参考になりました。
    ワイルドカード指定は確か
    'key'=>'*キーワード'
    こんな書き方だったと思います。
    違ってたらごめんなさい。

4件の返信を表示中 - 1 - 4件目 (全4件中)

トピック「カスタムフィールドの値で除外検索をしたい」には新たに返信することはできません。