Optionale Meta-Abfrage

Ich habe Orte als Beiträge in der Post-Tabelle von WP gespeichert.

Ich mache eine Geolokalisierung mit Geo Data Store ( http://wordpress.org/plugins/geo-data-store/ ). Dies funktioniert gut für mich, da ich momentan Ergebnisse von jedem beliebigen Radius erhalten kann, den ich von einem Startpunkt (einer Stadt, die in Koordinaten umgewandelt wurde) auswähle.

Ich habe zuvor eine exakte Übereinstimmung für die Stadt verwendet – wenn ein Nutzer eine Stadt angeklickt hat, hat er Ergebnisse mit Posts geladen, die postmeta genau mit der angeklickten Stadt übereinstimmten – ich klicke auf Asheville, ich bekomme Plätze in Asheville.

Das Problem, das der Wechsel zum Geo-Standort verursacht hat, ist, dass jetzt, wenn ein Benutzer auf eine Stadt klickt, einige Ergebnisse innerhalb dieser Stadt nicht angezeigt werden, da sie nicht innerhalb des gegebenen Radius des Stadtzentrums liegen, obwohl die Stadt postmeta genau mit dem übereinstimmt angeklickte Stadt.

Der relevante Teil meiner Abfrage sieht so aus:

$coordinates = ConvertCityStateToCoords($city.', '.$state); $lat = (double)$coordinates['lat']; $long = (double)$coordinates['long']; $posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long); $posts = array_map('intval',$posts); $args['post__in']=$posts; $places= new WP_Query($args); 

Früher sah es so aus:

 $args['meta_query'][] = array( 'key' => 'place_state', 'value' => $state, ); $args['meta_query'][] = array( 'key' => 'place_city', 'value' => $city ); $places= new WP_Query( $args ); 

Meine Frage ist folgende: Muss ich WP_Query (was ich lieber nicht tun würde, weil ich es auch für Paginierung und Sortierung verwende) zugunsten von SQL aufgeben, was mir erlaubt, ein ‘optionales’ Feld abzufragen – SQL, das Posts enthalten würde innerhalb des Radius sowie Posts mit der exakt passenden Stadt, aber nicht ausschließlich das eine oder das andere.

Solutions Collecting From Web of "Optionale Meta-Abfrage"

Die eigentliche Arbeit hier wird von $geoDataStore->getPostIDsOfInRange . Dort wird die Suche durchgeführt, und das liefert nicht die gewünschten Ergebnisse.

WP_Query zieht nur die angegebene Post- ID s. Es gibt keinen Grund, dass Sie diesen Teil des Codes aufgeben sollten, obwohl Sie möglicherweise 'orderby' => 'posts__in' hinzufügen möchten, um die Reihenfolge der Post- ID zu erhalten, die an die Abfrage übergeben wurden.

Wenn $geoDataStore->getPostIDsOfInRange nicht alle $geoDataStore->getPostIDsOfInRange , wie es funktioniert.

Nun sieht dies wie der Code aus , den Ihre $geoDataStore class verwendet, um die Abfrage zu $geoDataStore . Es gibt keine Haken, die Sie manipulieren könnten.

Es gibt nur zwei Dinge, an die ich denken kann.

  1. Erweitern Sie diese class und ersetzen Sie diese function, sodass sie Ihre Metainformationen durchsucht.
  2. Oder führen Sie eine weitere Abfrage aus, um Ihre Metainformationen zu überprüfen und die Orte außerhalb des generierten Radius einzubeziehen – so etwas .

Mit anderen Worten…

 $posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long); $posts2 = new WP_Query(array( // query for the others 'fields' => 'ids', // other parameters // Much like your original meta_query but // I do think you need the 'OR' relationship )); $posts = array_unique($posts + $posts2); $args['post__in'] = $posts; $places = new WP_Query($args); 

Sie müssen eine OR Beziehung zwischen den Abfragen deklarieren, da AND standardmäßig verwendet wird.

Beispiel aus http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

 $args = array( 'post_type' => 'product', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE' ), array( 'key' => 'price', 'value' => array( 20, 100 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) );