У меня есть геокодированные сообщения с широтой и долготой - Как выполнить поиск по радиусу?


У меня есть сообщения, которые геокодированы с широтой и долготой от Google. В принципе, я могу ввести адрес в пользовательское поле post, а широта и долгота помещаются в два отдельных мета-поля.

Я хотел бы создать пользовательский поиск, позволяющий посетителям искать свой почтовый индекс/почтовый индекс и находить ближайшие местоположения.

Я нашел этот плагин, который делает все это в комплекте с пользовательскими типами записей, а затем на странице поиска http://wordpress.org/extend/plugins/wp-find-your-nearest/

Я думал попробовать изменить его для работы с моими пользовательскими мета-полями и использовать только страницу/функцию поиска. Кто-нибудь знает о каких-либо других плагинах или методах для создания пользовательского поиска с использованием почтовых индексов и радиусов из мета-полей lat/long

Спасибо

Author: Anagio, 2012-07-31

1 answers

Есть Хранилище географических данных, созданное нашим собственным человеком, @Brady. Он отлично справляется с одной из моих инсталляций.

Он использует пользовательскую таблицу, в которой хранится только информация об ID, meta ID, lat и lng, поэтому ваши запросы остаются быстрыми и краткими, даже когда ваша база данных начинает масштабироваться. С моей стороны он получил оценку 5 звезд.

Этот плагин предназначен для использования другими разработчиками и для использования вместе с темами и другими плагинами. Многие темы и плагины используют метаданные WordPress таблица для хранения координат долготы и широты для сообщений. Хотя это работает нормально, таблица метаданных не может быть очень хорошо проиндексирована. Давайте возьмем, к примеру, вы создали пользовательский тип записи под названием "свойства". Вы создаете 100 000 прикрепленных сообщений с координатами широты и долготы. Вы хотите, чтобы ваши пользователи искали эти объекты, например, в радиусе 50 миль. Из-за метода, с помощью которого WordPress хранит метаданные, запрос выполняется медленно, особенно при работе с большими объемами данных.

@ Брэди в описании плагина.

Примечание: Существует ошибка, связанная с внутренними функциями WP, - строки не удаляются при удалении записи. Не беспокойтесь об этом. Я пытался разобраться с этим вместе с разработчиком, и мы не смогли этого сделать. В любом случае: это ничему не повредит, но вам следует очистить свои таблицы, прежде чем приступить к работе (или протестировать в локальной установке), чтобы свести к минимуму количество несвязанных строк.

Пример кода из Скоттса пастебина в комментарии

        // 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
Author: kaiser, 2013-03-23 13:24:12