it-swarm.com.de

Wie kann ich Posts basierend auf der Länge der Koordinate als Post-Meta abfragen?

Ich plane ein benutzerdefiniertes WordPress-Thema, bei dem der CPT (Custom Post Type) die Koordinaten für Breite und Länge als Metawert hat. Der Breiten- und Längengrad wird in einer Google Map als Markierung angezeigt.

Bisher habe ich kein Problem damit, Google Map und CPT als Marker anzuzeigen. Das ist, wenn ich den CPT mit der Standardreihenfolge abfrage.

Das Problem tritt auf, wenn ich n CPTs benötige, die einer Koordinate am nächsten liegen, unabhängig davon, ob es sich um die aktuelle Benutzerposition oder um einen Ort handelt, auf den auf der Karte geklickt wird. Eine andere Situation besteht darin, alle CPTs abzufragen, die sich im Radius x km einer Koordinate befinden.

Die Frage ist: Wie frage ich Posts basierend auf dem Längen- und Breitengrad ab, der auf dem Post-Meta gespeichert ist?

Ich bin mir nicht sicher, wie ich es machen soll, aber ich denke, der Längen- und Breitengradwert sollte in einem separaten benutzerdefinierten Feld gespeichert werden.

Danke im Voraus.

5
ifdion

Dies ist ein einfaches mathematisches Problem. Sie benötigen in der Tat Zugriff auf Ihren Längen- und Breitengrad. Speichern Sie ihn in einem Metafeld.

als müssen Sie Ihre Beiträge wie folgt als SQL-Abfrage abfragen. Habe keine Chance es zu testen. und oder gießen Sie es in WordPress. Ich habe jetzt keinen Zugriff auf meine Testumgebung. Aber ich denke, du könntest es selbst machen :) wenn nicht, mache ich es später, wenn ich kann.

set @latitude = xxx; — center latitude
set @longitude = xxx; — center longitude
set @distance = xx; — search distance

select p.ID, p.post_name, ((ACOS(SIN(@latitude * PI() / 180) * SIN(`latitude.meta_value` * PI() / 180) + COS(@latitude * PI() / 180) * COS(`latitude.meta_value` * PI() / 180) * COS((@longitude – `longitude.meta_value`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance
from wp_posts p
left join wp_postmeta latitude on latitude.post_id = p.ID and latitude.meta_key = ‘_latitude’
left join wp_postmeta longitude on longitude.post_id = p.ID and longitude.meta_key = ‘_longitude’
having distance < @distance;
5
woony

Für alle, die in Zukunft nach dieser Antwort suchen, habe ich den Code von woony um ein Vielfaches erweitert und dafür gesorgt, dass alles innerhalb der post_meta-Tabellenstruktur von Wordpress funktioniert. Dies setzt voraus, dass Sie zwei separate benutzerdefinierte Felder haben, eines für den Breitengrad (city_latitude) und eines für den Längengrad (city_longitude). Übergeben Sie einfach die Parameter für Breite, Länge und Entfernung in eine WP -Funktion, und Sie sollten festgelegt werden.

Hier ist die Funktion WP. Legen Sie dies in Ihrer functions.php-Datei ab:

function get_nearby_cities($lat, $long, $distance){
    global $wpdb;
    $nearbyCities = $wpdb->get_results( 
    "SELECT DISTINCT    
        city_latitude.post_id,
        city_latitude.meta_key,
        city_latitude.meta_value as cityLat,
        city_longitude.meta_value as cityLong,
        ((ACOS(SIN($lat * PI() / 180) * SIN(city_latitude.meta_value * PI() / 180) + COS($lat * PI() / 180) * COS(city_latitude.meta_value * PI() / 180) * COS(($long - city_longitude.meta_value) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance,
        wp_posts.post_title
    FROM 
        wp_postmeta AS city_latitude
        LEFT JOIN wp_postmeta as city_longitude ON city_latitude.post_id = city_longitude.post_id
        INNER JOIN wp_posts ON wp_posts.ID = city_latitude.post_id
    WHERE city_latitude.meta_key = 'city_latitude' AND city_longitude.meta_key = 'city_longitude'
    HAVING distance < $distance
    ORDER BY distance ASC;"
    );

    if($nearbyCities){
        return $nearbyCities;
    }
}

Geben Sie den Wert in Ihrer Vorlagendatei zurück:

$nearbyCities = get_nearby_cities(get_post_meta($post->ID, 'city_latitude', true), get_post_meta($post->ID, 'city_longitude', true), 25);
8
mread1208

Schauen Sie sich das Geo Data Store Plugin an . Es erstellt eine optimierte Tabelle für Ihre Breiten-/Längenkoordinaten und verfügt über zwei zu verwendende Vorlagen-Tags.

Weitere Infos und Codebeispiele in diesem Beitrag

0
Mattvic