web-dev-qa-db-ja.com

wpdbすべての投稿メタを印刷

メタキー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
);
1

これは単なる標準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_keyselect_analystおよびpost_statusnewです
  • またはpost_statuspending_reviewpost_typeはあなたの投稿タイプです。

2番目の条件はメタキーを指定していないので、meta_valuesであるすべての投稿に対してpending_reviewを取得します。

照会するように条件をフォーマットする必要があります。

  • meta_keyselect_analystです
  • post_typeはあなたの投稿タイプです
  • post_statusnewまたはです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'で順序付けしていましたが、これは何もしません。私はあなたがメタ値でソートしたいと思うので、私はそれをしました。

また、クエリの構造を反映するようにコードをインデントすると、これらの種類の問題を簡単に見つけることができるようになります。

0
Jacob Peattie