Необязательный Мета-Запрос
У меня есть места, сохраненные в виде сообщений в таблице сообщений WP.
Я выполняю геолокацию с использованием хранилища геоданных (http://wordpress.org/plugins/geo-data-store /). Это отлично работает для меня, так как в настоящее время я могу получать результаты с любого радиуса, который я выбираю из начальной точки (город, преобразованный в координаты).
Ранее я использовал точное совпадение по городу - когда пользователь нажимал на город, он загружал результаты с постами, в которых постметы точно совпадали выбранный город - я нажимаю Эшвилл, я получаю места в Эшвилле.
Проблема, вызванная переключением на географическое местоположение, заключается в том, что теперь, когда пользователь нажимает на город, некоторые результаты в этом городе не отображаются, потому что они не находятся в заданном радиусе от центра города, даже если постметка города точно соответствует выбранному городу.
Соответствующая часть моего запроса выглядит так:
$coordinates = ConvertCityStateToCoords($city.', '.$state);
$lat = (double)$coordinates['lat'];
$long = (double)$coordinates['long'];
$posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long);
$posts = array_map('intval',$posts);
$args['post__in']=$posts;
$places= new WP_Query($args);
Тогда как раньше это выглядело так:
$args['meta_query'][] = array(
'key' => 'place_state',
'value' => $state,
);
$args['meta_query'][] = array(
'key' => 'place_city',
'value' => $city
);
$places= new WP_Query( $args );
Мой вопрос заключается в следующем: придется ли мне отказаться от WP_Query (чего я бы предпочел не делать, потому что я также использую его для разбиения на страницы и упорядочивания) в пользу SQL, который позволит мне запрашивать "необязательное" поле - SQL, которое будет включать сообщения в радиусе, а также сообщения с точным совпадением города, но не исключительно одно или другое.
2 answers
Вся реальная работа здесь выполняется $geoDataStore->getPostIDsOfInRange
. Именно там выполняется поиск, и именно это не дает желаемых результатов.
WP_Query
просто тянет указанный пост ID
s. Нет никаких причин, по которым вам следует отказаться от этой части кода, хотя вы можете добавить 'orderby' => 'posts__in'
, чтобы сохранить порядок сообщений ID
, переданных в запрос.
Если $geoDataStore->getPostIDsOfInRange
возвращает не все ID
, которые вы хотите, вам придется изучить, как это работает.
Теперь, это похоже на код , который ваш класс $geoDataStore
использует для выполнения запроса. Нет никаких зацепок, которыми вы могли бы манипулировать.
Есть только две вещи, которые я могу придумать.
- Расширьте этот класс и замените эту функцию, чтобы она выполняла поиск вашей метаинформации.
- Или запустите другой запрос, чтобы проверить вашу метаинформацию и включить места за пределами сгенерированного радиуса - что-то вроде это.
Другими словами...
$posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long);
$posts2 = new WP_Query(array(
// query for the others
'fields' => 'ids',
// other parameters
// Much like your original meta_query but
// I do think you need the 'OR' relationship
));
$posts = array_unique($posts + $posts2);
$args['post__in'] = $posts;
$places = new WP_Query($args);
Вам необходимо объявить связь OR
между запросами, так как AND
по умолчанию.
Пример взят из http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE'
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);