Abfrage von Posts OHNE ein benutzerdefiniertes Meta-Feld

Ich versuche, eine benutzerdefinierte Abfrage zu erstellen, die alle Beiträge zurückgibt, die nicht über den zugehörigen Post-Meta verfügen. Ich bin nicht ganz sicher, wie das geht … hier ist, was ich arbeite, und für Ihre Referenz “Score” ist eine benutzerdefinierte Spalte, die ich in die Posts-Tabelle hinzugefügt habe.

$querystr = " SELECT $wpdb->posts.ID FROM $wpdb->posts, $wpdb->postmeta WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_date postmeta.meta_key != '_social_' ORDER BY $wpdb->posts.score DESC LIMIT 1 "; $result = $wpdb->get_row($querystr, ARRAY_A); add_post_meta($result["ID"], "_social_", date("YmdHi"), true); 

Das obige Beispiel funktioniert nicht. Der Kontext davon ist, dass ich einen cron betreibe, um jede halbe Stunde automatisch einen einzelnen Beitrag in meinen sozialen Netzwerken zu veröffentlichen, und nachdem ich das getan habe, möchte ich das Post-Meta _social_ so dass ich bei meinem nächsten Cron nicht füge es meinen sozialen Netzwerken ein zweites Mal hinzu. Diese Anfrage wird mir hoffentlich immer die Post mit der höchsten Punktzahl geben, die meinen sozialen Netzwerken noch nicht hinzugefügt wurde.

Kann mir jemand sagen, wie man alle Beiträge _social_ , die den _social_ kundenspezifischen _social_ ausschließen?

Solutions Collecting From Web of "Abfrage von Posts OHNE ein benutzerdefiniertes Meta-Feld"

Sie müssen einen Join oder eine Unterabfrage durchführen:

 $querystr = " SELECT $wpdb->posts.ID FROM $wpdb->posts WHERE $wpdb->posts.post_type = 'post' AND $wpdb->posts.post_date < NOW() AND $wpdb->posts.ID NOT IN ( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = '_social_' ) ORDER BY $wpdb->posts.score DESC LIMIT 1; "; 

Eine alternative SQL-statement von Milo wäre:

 $querystr = " SELECT {$wpdb->posts}.ID FROM {$wpdb->posts} LEFT JOIN {$wpdb->postmeta} ON ( {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_social_' ) WHERE {$wpdb->posts}.post_type = 'post' AND {$wpdb->posts}.post_date < NOW() AND {$wpdb->postmeta}.post_id IS NULL /* ORDER BY {$wpdb->posts}.score DESC LIMIT 1 */ "; $result = $wpdb->get_col($querystr); var_dump($result); 

Ich habe die letzten zwei Zeilen kommentiert, weil:

  1. Du $wpdb->posts die $wpdb->posts Tabelle gehackt zu haben, um eine neue column – score einzubeziehen – und ich konnte das nicht testen (aber als ORDER BY Argument sollte es nichts ausmachen.) Ich bin neugierig, warum du das gefühlt hast Müssen Sie den Tisch hacken?
  2. Ihre Frage lautet “Ich versuche eine benutzerdefinierte Abfrage zu erstellen, die alle Beiträge zurückgibt …” Mit einem LIMIT 1 Argument gibt es keine Möglichkeit, dass die Abfrage “alle” Beiträge zurückgibt. Dieses Argument wird es zwingen, nur eins zurückzugeben, egal wie viele die Kriterien erfüllen.

Ich habe außerdem die $wpdb Methode zu get_col da sie Ihnen ohne weitere get_col ein ordentliches Array von ID get_col .