2016-09-08 6 views
2

Ich versuche, eine benutzerdefinierte WP_Query verwenden, aber die Ergebnisse sind nicht richtig.Benutzerdefinierte WP_Query funktioniert nicht wie vorgesehen

Ich möchte ein benutzerdefiniertes Formular erstellen, um Jobs, die mit "WP Job Manager" registriert sind, mithilfe der Radius-Suche zu filtern.

Dies ist meine Frage:

$args = array(
'post_type' => 'job_listing', 
'post_status' => array('publish'), 
    'meta_query' => array(
     'relation' => 'AND', 
      array(
       'key' => 'geolocation_long', 
       'value' => array($maxLong,$minLong), 
       'compare' => 'between', 
       'type'  => 'numeric', 
      ), 
      array(
       'key'  => 'geolocation_lat', 
       'value' => array($maxLat,$minLat), 
       'compare' => 'between', 
       'type'  => 'numeric', 
      ), 
     ), 
    ); 

$the_query = new WP_Query($args); 

Können Sie ein Problem erkennen?

Jede Hilfe wäre willkommen. Vielen Dank!

+1

Welche Fehler bekommen Sie? Das wird sicherlich hilfreich bei der Fehlersuche sein. – nyedidikeke

+0

Ich würde zustimmen, was @nyedidikeke sagte, und auch, was ein var_dump von $ maxLong, $ minLong ist. Es könnte sich um ein Problem mit einem variablen Typ handeln. Außerdem gibt die Dokumentation an, dass der Vergleich "BETWEEN" und der Typ "NUMERIC" in Großbuchstaben geschrieben sind, obwohl ich wirklich keine Ahnung habe, ob das überhaupt zählt. :) –

+0

Vielen Dank für Ihre Zeit. Nun, ich bekomme keinen Fehler, es zeigt kein Ergebnis, obwohl, ich habe in der Datenbank überprüft und es sollte 5 Ergebnisse geben. @GregBurkett Ich habe das versucht, funktioniert aber auch nicht. $ maxLong, $ minLong usw. sind nur Koordinaten wie 51.509865 und -0.118092 –

Antwort

0

Dies kann ein Problem mit der Funktion BETWEEN sein. Ich würde vorschlagen, dass Sie einen Blick auf die genaue Abfrage, die generiert wird, und ob der Vergleich tatsächlich vergleicht schwimmt, nicht Strings (die möglicherweise zu unerwarteten Ergebnissen führen).

Werfen Sie einen Blick auf die Fehlerbehebung für eine sehr ähnliche Abfrage über wordpress.stackexchange.com.

Das Folgende ist von der Frage zitiert:

Da postmeta Werte als Strings gespeichert sind, ich dachte, ich DECIMAL werden Gießen sollte, aber es scheint nur den Dezimalwert aus der Zeichenfolge zu trimmen aufgrund der Mangel an DECIMAL-Argumenten/Präzisionsparametern.

und Bewertung Rarst ‚s Antwort:

Sie können generierten SQL-Filter und Präzision Parameter hinzufügen, die Sie benötigen.

aktivieren Filter für get_posts() durch Zugabe von folgenden abfragen:

'suppress_filters' => false, 

Und:

add_filter('get_meta_sql','cast_decimal_precision'); 

function cast_decimal_precision($array) { 

    $array['where'] = str_replace('DECIMAL','DECIMAL(10,3)',$array['where']); 

    return $array; 
} 

Hinweis OP Kommentar zu diesem Vorschlag zu, obwohl:

versucht, beiden Lösungen und sieht aus, als ob sie sie als Strings mit einfachen Anführungszeichen vergleicht (wp 3.1.1), irgendwelche Ideen dazu? versuchte rohe sql hat aber funktioniert.

Bitte aktualisieren Sie Ihre Frage mit weiteren Ergebnissen, damit wir Ihnen helfen können.

+1

Vielen Dank für Ihre Antwort! Entschuldigung, ich habe diese Frage nicht gesehen, als ich nach solchen Problemen gesucht habe! Wie auch immer, das Aktivieren des Filters und das Einfügen des Filters, um die Dezimalgenauigkeit zu berechnen, löste mein Problem! Vielen Dank Kumpel! –

+0

@PedroPinto kein Problem, glücklich zu helfen! Danke, dass du diese Antwort angenommen hast :). –

0

Änderung $ minlong und maxlong $

$args = array(
'post_type' => 'job_listing', 
'post_status' => array('publish'), 
    'meta_query' => array(
     'relation' => 'AND', 
      array(
       'key' => 'geolocation_long', 
       'value' => array($minLong,$maxLong), 
       'compare' => 'between', 
       'type'  => 'numeric', 
      ), 
      array(
       'key'  => 'geolocation_lat', 
       'value' => array($minLat,$maxLat), 
       'compare' => 'between', 
       'type'  => 'numeric', 
      ), 
     ), 
    ); 

$the_query = new WP_Query($args); 
+0

Danke für deine Zeit, nun, das hat den Trick nicht gemacht, aber du hattest Recht! Ich musste diese Werte ändern, sie waren in der falschen Reihenfolge! Vielen Dank –

Verwandte Themen