メタキーselect_analyst
からすべてのメタ値を出力させるためのクエリを作成しますが、ORを2つのpost_status
に含めると、すべてpostmetaが出力されます。私が間違っていることを教えてください。
投稿ステータスを1つだけにした場合、それは機能しますが、別のpost_status
が必要です。
私の質問:
$query = $wpdb->prepare('
SELECT DISTINCT pm.meta_value FROM %1$s pm
LEFT JOIN %2$s p ON p.ID = pm.post_id
WHERE pm.meta_key = "%3$s"
AND p.post_status = "%4$s"
OR p.post_status = "%5$s"
AND p.post_type = "%6$s"
ORDER BY "%3$s"',
$wpdb->postmeta,
$wpdb->posts,
'select_analyst',
'new',
'pending_review',
$post_type
);
これは単なる標準SQLなので、これは実際にはWordPressの質問ではないので、実際にはここには属しませんが、$wpdb->prepare()
の使用についていくつか指摘する点があります。
それでは、WHERE
句を見てみましょう。分離され、値が置換され、インデントされてそれがどのように解釈されるのかを反映します。
WHERE
pm.meta_key = "select_analyst" AND p.post_status = "new" OR
p.post_status = "pending_review" AND p.post_type = "post_type"
これは、以下の条件を満たす行に対してmeta_value
を返します。
meta_key
はselect_analyst
およびpost_status
はnew
ですpost_status
はpending_review
、post_type
はあなたの投稿タイプです。2番目の条件はメタキーを指定していないので、meta_values
であるすべての投稿に対してpending_review
を取得します。
照会するように条件をフォーマットする必要があります。
meta_key
はselect_analyst
ですpost_type
はあなたの投稿タイプですpost_status
はnew
またはですpending_review
そのためのSQLは次のようになります。
WHERE
pm.meta_key = 'select_analyst' AND
p.post_type = 'post_type' AND
p.post_status IN ('new', 'pending_review' )
だからあなたの完全なクエリは次のようになります。
$query = $wpdb->get_results(
"SELECT
DISTINCT pm.meta_value
FROM
$wpdb->postmeta pm
LEFT JOIN
$wpdb->posts p ON p.ID = pm.post_id
WHERE
pm.meta_key = 'select_analyst' AND
p.post_type = $post_type AND
p.post_status IN ('new', 'pending_review')
ORDER BY
pm.meta_value"
);
私が加えた他のいくつかの変更点:
'select_analyst'
で順序付けしていましたが、これは何もしません。私はあなたがメタ値でソートしたいと思うので、私はそれをしました。また、クエリの構造を反映するようにコードをインデントすると、これらの種類の問題を簡単に見つけることができるようになります。