web-dev-qa-db-ja.com

緯度経度でジオコード化された記事があります - 半径で検索するにはどうすればいいですか?

Googleの緯度と経度でジオコーディングされた投稿があります。私は基本的にポストカスタムフィールドに住所を入力することができ、緯度と経度は2つの別々のメタフィールドに配置されます。

カスタム検索を作成して、訪問者が自分の郵便番号を検索して最も近い場所を見つけられるようにします。

私はこのプラグインを見つけました。それはカスタム投稿タイプと1つにまとめられ、検索ページ を含みます。

私は自分のカスタムメタフィールドで動作するようにそれを試して修正することを考えていて、検索ページ/機能のみを使用していました。緯度/経度のメタフィールドの郵便番号と半径を使用してカスタム検索を作成するための他のプラグインまたは方法を知っている人はいますか

ありがとう

3
Anagio

私たち自身の@Bradyによる Geo Data Storeがあります 。それは私のインスタレーションのうちの1つで完璧な仕事をします。

ID、メタID、lat、lng情報のみを格納するカスタムテーブルを使用しているので、データベースがスケーリングを開始しても、クエリは迅速かつ簡潔になります。それは私の側から5つ星の評価を得ました。

このプラグインは他の開発者によって使用され、テーマや他のプラグインと一緒に使用されることを意図しています。多くのテーマとプラグインはWordPressメタデータテーブルを使って投稿の経度と緯度の座標を保存します。これはうまく機能しますが、メタデータテーブルにはあま​​りインデックスを作成できません。たとえば、 'properties'というカスタム投稿タイプを作成したとしましょう。あなたはすべて緯度と経度の座標で結び付けられた10万の投稿を作成します。たとえば、半径50マイルの範囲でこれらのプロパティをユーザーに検索させます。 WordPressがメタデータを保存する方法のため、特に大量のデータを扱う場合、クエリは遅くなります。

プラグインの説明で@Brady。

注:WP内部に関するバグがあります - 投稿を削除しても行が削除されないということです。気にしないでください。私は開発者とそれをやり取りしようとしましたが、私たちはそれを後押ししませんでした。とにかく、それは何も害を及ぼしません、しかし、あなたが実際に行く(またはローカルインストールでテストする)前に、あなたのテーブルをきれいにするべきです、関連しない行の量を最小にするため。

コメント内のScotts Pastebinからのサンプルコード

        // Only do a map search if user submitted one
        if( 2 == $_SESSION['s_doing_property_search'] )
        {
            // Only generate map search results if we don't have any yet or if they are a day out of date
            if( empty( $_SESSION['homes_for_' . $type . '_map_search_results'] ) || $_SESSION['homes_for_' . $type . '_map_search_timestamp'] < strtotime( "-1 Day" ) )
            {
                // Load instance of GeoDataStore
                if ( ! isset( $sc_gds ) )
                    $sc_gds = new sc_GeoDataStore();

                // Just get the ID's of posts in range
                $_SESSION['homes_for_' . $type . '_map_search_results'] = (array) $sc_gds->getPostIDsOfInRange( "homes-for-" . $type, $_SESSION['s_property_radius'], $_SESSION['s_property_address_lat'], $_SESSION['s_property_address_lng'] );

                // Set a timestamp so we don't do this expensive get each page load.
                $_SESSION['homes_for_' . $type . '_map_search_timestamp'] = time();
            }

            // We we have no results then set an array just one that will trigger no posts found.
            if( empty( $_SESSION['homes_for_' . $type . '_map_search_results'] ) )
                $query->set( 'post__in', array(1) );
            else
                $query->set( 'post__in', $_SESSION['homes_for_' . $type . '_map_search_results'] );
        }
4
kaiser