我有带经纬度的地理编码帖子-如何按半径搜索?

时间:2012-07-31 作者:Anagio

我有来自谷歌的用经度和纬度进行地理编码的帖子。我基本上可以在post自定义字段中输入地址,纬度和经度被放置在两个单独的元字段中。

我想创建一个自定义搜索,让访问者搜索他们的邮政编码并找到最近的位置。

我发现了这个插件,它将所有这些功能捆绑在一个自定义帖子类型中,然后是一个搜索页面http://wordpress.org/extend/plugins/wp-find-your-nearest/

我想尝试修改它,使其与我的自定义元字段一起使用,并且只使用搜索页面/功能。是否有人知道其他插件或方法,可以使用lat/long元字段中的邮政编码和半径创建自定义搜索

谢谢

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

Geo Data Store by our own man, @Brady. 它在我的一个装置中做得很好。

它使用一个自定义表,只存储ID、meta-ID、lat和lng信息,因此即使在数据库开始扩展时,查询也会保持快速和简短。我这边的评价是五星。

此插件旨在供其他开发人员使用,并与主题和其他插件一起使用。许多主题和插件使用WordPress元数据表来存储帖子的经纬度坐标。虽然这样做很好,但元数据表无法很好地索引。举个例子,您创建了一个名为“properties”的自定义post类型。您创建了100000个贴子,所有贴子都附有纬度和经度坐标。例如,您希望用户在50英里半径内搜索这些属性。由于WordPress存储元数据的方法,查询速度很慢,尤其是在处理大量数据时。

插件描述中的Brady

注意:在删除帖子时,有一个与WP内部相关的bug,行不会删除。不要担心它。我试着和开发人员一起解决这个问题,但我们没有支持它。无论如何:这不会造成任何损害,但在上线(或在本地安装中测试)之前,应该清理表,以尽量减少不相关行的数量。

注释中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\'] );
        }

结束

相关推荐