web-dev-qa-db-ja.com

複数のメタキーと値で投稿する

以下のメタキーに基づいて投稿を取得しようとしています。

  • post_code432C
  • locationXYZどちらもCPTに属します。私はこれらの両方のmeta_valuesを使ってPostを取得しようとしています。

私はOR関係を望みません、私はAND関係を望みます、私はいくつかのWP_Queryオブジェクトを試してみました、そしてまだ数時間の調査の後に解決策を見つけていません。

5
Sheraz Ahmed

_ソリューション_

下記に受け入れられた解決策はうまくいった、しかし私はそれがどのようにうまくいっているか知りたいと思った?

これはどのように機能しているのか

SELECT * FROM wp_posts p, wp_postmeta m1, wp_postmeta m2
    WHERE p.ID = m1.post_id and p.ID = m2.post_id
    AND m1.meta_key = 'key1' AND m1.meta_value = 'value1'
    AND m2.meta_key = 'key2' AND m2.meta_value =  'value2'
    AND p.post_type = 'cpt' AND p.post_status = 'published'
0
Sheraz Ahmed

これでうまくいくはずです。デフォルトの関係はANDなので、指定する必要はありません。

$args = array(
    'post_type'  => 'wpse_cpt',
    'meta_query' => array(
        array(
            'key'     => 'post_code',
            'value'   => '432C',
        ),
        array(
            'key'     => 'location',
            'value'   => 'XYZ',
        ),
    ),
);
$query = new WP_Query( $args );
10
Jeremy Ross

もう一度編集する:ああ、私は質問に答えなかった。 a.*を選択する代わりに、一致するキー値を持つ投稿のすべての列を取得するには、c.meta_valueを選択します。

下記のsql/$wpdbクエリはpost_typeが$postTypeでmeta_keyの値が$metaKeyの投稿のすべてのmeta_valuesを選択します。したがって、( '$ metaKey'を介して)特定のmeta_keyのすべての異なる値を選択します。 term_relationshipsテーブルは、テーブル内の関係接続のためのwordpressのヘルパーテーブルです。 wp_postsはワードプレスの 'posts'テーブル、そしてwp_postmetaはワードプレスの 'postmeta'テーブルです。 (注:カスタムテーブルを使用している場合、これらのテーブル名は異なります。)

〜@MikeNGarrettが要求する「すること」のメモを追加するために編集されました

/* $wpdb is a global var provided by the wordpress 'engine'
** for query'ing wordpress database tables. 
*/
global $wpdb; 
$postType = 'mycustomposttype';
$metaKey = 'mymetakey';
$query = "
    SELECT c.meta_value 
    FROM wp_posts a 
    LEFT JOIN wp_term_relationships b 
        ON (a.ID = b.object_id) 
    LEFT JOIN wp_postmeta c 
        ON (a.ID = c.post_id) 
    WHERE a.post_type = %s AND c.meta_key = %s";

$metaValues = $wpdb->prepare(query, [$postType, $metaKey]);
$metaValues = $wpdb->get_results($metaValues);

注:$ metaValues変数を再利用しているだけです。 $ metaValues prepare()の結果を$ metaValues変数に書き戻す他の理由はありません。ただし、$ metaValuesをget_resluts()に渡す必要があります。

2
Eric Shoberg

オブジェクトパラメータ以下で試しました

array(
            'key' => 'post_code',
            'value' =>'432C',
            'compare' => '='
        ),
        array(
            'relation' =>'AND',
             array(

            'key' => 'location',
            'value' => 'XYZ',
             'compare' => '=',

          ),
        )
0
Manthan Dave
$args = array(
    'post_type'  => 'wpse_cpt',
    'meta_query' => array(
        'relation' => 'AND' //**** Use AND or OR as per your required Where Clause
        array(
            'key'     => 'post_code',
            'value'   => '432C',
        ),
        array(
            'key'     => 'location',
            'value'   => 'XYZ',
        ),
    ),
);
$query = new WP_Query( $args );
0