以下のメタキーに基づいて投稿を取得しようとしています。
post_code
と432C
location
とXYZ
どちらもCPTに属します。私はこれらの両方のmeta_valuesを使ってPostを取得しようとしています。私はOR関係を望みません、私はAND関係を望みます、私はいくつかのWP_Query
オブジェクトを試してみました、そしてまだ数時間の調査の後に解決策を見つけていません。
_ソリューション_
下記に受け入れられた解決策はうまくいった、しかし私はそれがどのようにうまくいっているか知りたいと思った?
これはどのように機能しているのか
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'
これでうまくいくはずです。デフォルトの関係は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 );
もう一度編集する:ああ、私は質問に答えなかった。 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()
に渡す必要があります。
オブジェクトパラメータ以下で試しました
array(
'key' => 'post_code',
'value' =>'432C',
'compare' => '='
),
array(
'relation' =>'AND',
array(
'key' => 'location',
'value' => 'XYZ',
'compare' => '=',
),
)
$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 );