get_posts-Abfrage stimmt mit zu vielen Ergebnissen überein

Ich habe eine Abfrage innerhalb einer function, die Übereinstimmungen zurückgibt, die ich nicht will, zum Beispiel, wenn das $ id = 116 es auch Ergebnisse zurückgibt, wo der meta_key ‘funds_id’ 11687 ist.

public function list_related_docs($id){ $docs_args = array( 'post_type' => 'publication', 'post_status' => 'publish', 'posts_per_page'=> -1, 'orderby' => 'meta_value_num title', 'order' => 'ASC', 'meta_key' => 'fund_list_order', 'limit' => 4, 'suppress_filters' => 0, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'funds_id', 'value' => $id, 'compare' => 'LIKE' ), array( 'key' => 'fund_list_order', 'compare' => 'EXISTS', ) ) ); $docs_posts = get_posts($docs_args); // more stuff } 

Ich habe versucht, ‘vergleichen’ => ‘=’ zu verwenden, aber das gibt keine Ergebnisse zurück.

Vielen Dank.

Solutions Collecting From Web of "get_posts-Abfrage stimmt mit zu vielen Ergebnissen überein"

Nun, Sie müssen den Typvergleich einschließen, oder es wird hier ein alphanumerischer Vergleich angewendet.

In diesem Fall sollten Sie 'type' => 'numeric' hinzufügen.

Verwenden Ihrer classnfunktion

 < ?php public function list_related_docs($id){ $docs_args = array( 'post_type' => 'publication', 'post_status' => 'publish', 'posts_per_page'=> -1, 'orderby' => 'meta_value_num title', 'order' => 'ASC', 'meta_key' => 'fund_list_order', 'limit' => 4, 'suppress_filters' => 0, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'funds_id', 'value' => $id, 'compare' => '=', 'type' => 'numeric', ), array( 'key' => 'fund_list_order', 'compare' => 'EXISTS', ) ) ); $docs_posts = get_posts($docs_args); // more stuff } 

Eine Suche durch das Plugin, auf dem Ihr Code basiert, zeigt an, dass alles in Ihrer Frage Ihre eigenen Modifikationen sind.

Das Problem, dem Sie gegenüberstehen, besteht darin, dass Sie PHP-Arrays serialisieren und in Post-Meta speichern und dann versuchen, Abfragen für sie auszuführen. Dies funktioniert nicht und wird nie funktionieren.

Der von Ihnen angegebene Beispielwert a:1:{i:0;s:3:"11687";} entspricht array( 11687 ) . Anstatt ein Array mit einem einzelnen Wert zu speichern, sollten Sie nur die Nummer speichern. Wenn Sie mehrere Zahlen speichern müssen, können Sie mehrere Post-Metas mit demselben Schlüssel verwenden oder sie als Liste in einem separaten Post-Meta speichern. Wenn Sie jedoch Vergleiche in SQL ausführen oder mit Werten vergleichen möchten, können Sie keine serialisierten Daten verwenden.

Sobald die Daten als Zahl gespeichert sind, nicht als serialisiertes Objekt, wird die von Courtney gegebene Antwort funktionieren. Courtneys Antwort geht jedoch davon aus, dass es sich um eine Nummer handelt, die keine serialisierte PHP-Zeichenkette ist, wie die meisten anderen Leute annehmen, weshalb es anfangs nicht für Sie funktionierte.

Wenn Sie die ID ausschließlich zu Klassifizierungszwecken verwenden, könnten Sie stattdessen Folgendes tun:

  • Legen Sie den übergeordneten Ersteller fest
  • Verwenden Sie eine benutzerdefinierte Taxonomie, wobei die ID der Name des Begriffs ist

Ansonsten ist es eine allgemeine Binsenweisheit, wenn Sie mit databaseen arbeiten, in denen Sie serialisierte Strukturen in Tabellen nicht speichern, besonders wenn Sie dann Abfragen auf ihren Inhalten durchführen möchten.