У меня есть геокодированные сообщения с широтой и долготой - Как выполнить поиск по радиусу?
У меня есть сообщения, которые геокодированы с широтой и долготой от Google. В принципе, я могу ввести адрес в пользовательское поле post, а широта и долгота помещаются в два отдельных мета-поля.
Я хотел бы создать пользовательский поиск, позволяющий посетителям искать свой почтовый индекс/почтовый индекс и находить ближайшие местоположения.
Я нашел этот плагин, который делает все это в комплекте с пользовательскими типами записей, а затем на странице поиска http://wordpress.org/extend/plugins/wp-find-your-nearest/
Я думал попробовать изменить его для работы с моими пользовательскими мета-полями и использовать только страницу/функцию поиска. Кто-нибудь знает о каких-либо других плагинах или методах для создания пользовательского поиска с использованием почтовых индексов и радиусов из мета-полей lat/long
Спасибо
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'] );
}