wpdb drucke alle Post-Meta

Ich erstelle Abfrage, um eine Ausgabe aller Meta-Wert von Metaschlüssel ‘select_analyst’, aber wenn ich OR, um zwei post_status einzuschließen, ist es alle postmeta drucken. Könnten Sie mir bitte sagen, was ich falsch mache?

Wenn ich nur einen Poststatus einstelle, ist es Arbeit, aber ich brauche einen anderen post_status

meine Frage:

$query = $wpdb->prepare(' SELECT DISTINCT pm.meta_value FROM %1$s pm LEFT JOIN %2$sp 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 ); 

Solutions Collecting From Web of "wpdb drucke alle Post-Meta"

Dies ist nicht wirklich eine WordPress-Frage, da es nur Standard-SQL ist, also gehört es nicht wirklich hierher, aber ich habe einige Punkte, die Sie über Ihre Verwendung von $wpdb->prepare() müssen, um die Frage zu beantworten.

Sehen wir uns Ihre WHERE Klausel isoliert an, wobei die Werte ersetzt und eingerückt sind, um zu reflektieren, wie sie interpretiert wird:

 WHERE pm.meta_key = "select_analyst" AND p.post_status = "new" OR p.post_status = "pending_review" AND p.post_type = "post_type" 

Dies gibt meta_value für Zeilen zurück, die die folgenden Bedingungen erfüllen:

  • meta_key ist select_analyst und post_status ist new
  • oder post_status ist pending_review und post_type ist Ihr Post-Typ.

Beachten Sie, dass die zweite Bedingung keinen meta_values pending_review . pending_review erhalten meta_values für alle Posts, die pending_review sind, pending_review .

Sie müssen Ihre Bedingungen so formatieren, dass Sie abfragen:

  • meta_key ist select_analyst
  • post_type ist Ihr Post-Typ
  • post_status ist new oder pending_review

Die SQL dafür wäre

 WHERE pm.meta_key = 'select_analyst' AND p.post_type = 'post_type' AND p.post_status IN ('new', 'pending_review' ) 

Ihre vollständige Abfrage sollte also lauten:

 $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" ); 

Ein paar andere Änderungen, die ich gemacht habe:

  • Sie müssen die statement nicht vorbereiten. In die Abfrage werden keine unsicheren Benutzereingaben eingegeben. Der einzige Grund, warum Sie das tun möchten, ist, den Schlüssel mehrfach zu speichern, aber Sie können die Variable immer direkt in die statement einfügen, wenn sie nicht aus unsicheren Eingaben stammt. Sie haben nicht einmal eine der Variablen mehrfach verwendet (mit Ausnahme des Metaschlüssels, siehe unten), sodass dies für Ihre Abfrage nicht erforderlich war.
  • Sie haben nach dem 'select_analyst' , was nichts 'select_analyst' . Ich nehme an, Sie wollten nach dem Metawert sortieren, also habe ich das gemacht.

Beachten Sie auch, dass das Einrücken des Codes, um die Struktur der Abfrage widerzuspiegeln, das Erkennen dieser Art von Problemen erheblich erleichtert.