質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

「ワードプレス」カスタムフィールドによる投稿の絞り込みについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 702

alitomo

score 35

・ユーザーと投稿にはそれぞれカスタムフィールドが2つ登録されている。
・そのカスタムフィールドには配列で値が複数入っている。※セレクトボックスにより選択した値である。

項目:food
選択肢:'cake','manjyu','steak','barger'
項目:drink
選択肢:'coffee','coke','water','tea'

・ユーザーと投稿に登録されているセレクトボックスの種類と項目は1対1である。
・表示されたページでログインしているユーザー情報を確認して、投稿の出し分けをしたい。

上記の状態でログインしているユーザーのカスタムフィールドに保存された値がfoodのsteakとcakeだった場合に
-->
foodのsteakとcakeが登録された投稿とfood又はdrinkの値が空の投稿を表示するにはどのようなquery_postsを発行したら良いでしょうか?

2/16追記
aozukiさん、お返事遅くなりすいません。
頂いた内容で色々試してみたのですが、何故か上手く行きません。。。。

'meta_query'を指定すると、カスタムフィールドが登録されていない投稿が弾かれてしまうんですよね。
しかも'compare'の値がlikeだとヒットするのにINだとヒットしないとか。。。完全にハマってしまいました。_| ̄|○ il||li

イメージ説明

画像の内容で

    'meta_query' => array(    
        'relation' => 'AND',
        array(
            'key' => 'posFil-1',
            'value' =>  array('alitomo'),
            'compare' => 'IN',
        ),
    )
);
query_posts( $args );


とすると何も表示されず、

            'compare' => 'LIKE',


とすると364だけじゃなく、438、442も取得してしまいます。
いったいどうなっているのか困惑しています。

しかも'meta_query'がセットされていない投稿はヒットしないし。
どうぞよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2018/02/14 18:50

    ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。

    キャンセル

  • alitomo

    2018/02/15 16:49

    そうですね。アドバイスありがとうございます。(_ _)質問のしかたをもう少し見直します。

    キャンセル

回答 1

checkベストアンサー

+2

  1. wp_get_current_user()で現在のユーザーを取得
  2. get_user_meta()にユーザーIDとフィールドのkey名を指定し、ユーザー側のフィールドの値を取ってくる
  3. get_posts()のパラメータmeta_queryに取ってきた値を入れる
    (事前に配列を組み立てておけば楽)

流れはこれだけですよね。
各関数の使い方を調べて(関数名でググれば大体出ます)自身でコードを書いてみてください。
meta_queryは最終的に下記のような形になっていれば大丈夫でしょう

$args = array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'food',
            'value' => 'steak',
            'compare' => '=',
        ),
        array(
            'key' => 'food',
            'value' => 'cake',
            'compare' => '=',
        ),
    ),
);
$myposts = get_posts($args);


参考:query_posts(WP_Queryクラス)でカスタムフィールドを使う


【追記】

↑これでfoodがsteakかcakeか空でdrinkが空の投稿が取得出来ますでしょうか?逆に言えば'manjyu'と'barger'以外の投稿全てが取得出来ますでしょうか?

こういうことですかね?
compareにINを指定すればvalue(配列)のいずれかが一致する投稿を取得します。

'meta_query' => array(
    'relation' => 'AND',
    array(
        'key' => 'food',
        'value' => array('', 'steak', 'cake'),
        'compare' => 'IN',
    ),
    array(
        'key' => 'drink',
        'value' => array(''),
        'compare' => 'IN',
    ),
),


これならforeach使うまでもなく、get_user_metaで取ってきた値をそのままvalueに突っ込むだけです。

$foods = get_user_meta($user->ID, 'food');
$foods['food'][] = '';

'meta_query' => array(
    'relation' => 'AND',
    array(
        'key' => 'food',
        'value' => $foods['food'],
        //以下略

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/15 13:59 編集

    aozukiさん、いつもありがとうございます。
    上記コードの悩みなんですが、投稿のfoodに何も情報が付与されていない投稿が拾えないところなのです。

    food又はdrinkの値が空の投稿を表示するのは・・・・

    $args = array(
    'meta_query' => array(
    'relation' => 'AND',
    array(
    'key' => 'food',
    'value' => 'steak',
    'compare' => '=',
    ),
    array(
    'key' => 'food',
    'value' => 'cake',
    'compare' => '=',
    ),
    array(
    'key' => 'food',
    'value' => '',
    'compare' => '=',
    ),
    ),
    );

    ↑これでfoodがsteakかcakeか空でdrinkが空の投稿が取得出来ますでしょうか?逆に言えば'manjyu'と'barger'以外の投稿全てが取得出来ますでしょうか?

    あと
    >get_posts()のパラメータmeta_queryに取ってきた値を入れる
    >(事前に配列を組み立てておけば楽)
    の部分ですが、配列の処理が苦手なので、
    array(
    'key' => 'food',
    'value' => 'cake',
    'compare' => '=',
    ),
    の部分をforeachなので回しながら追加していくんでしょうが、
    イマイチやり方が分かっていません。

    ご教授のほどどうぞよろしくお願いします。(_ _)

    キャンセル

  • 2018/02/15 14:40

    回答に追記しました(ちょっと仕様がいまいちわかってないかもしれませんが)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる