Необязательный Мета-Запрос


У меня есть места, сохраненные в виде сообщений в таблице сообщений 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, которое будет включать сообщения в радиусе, а также сообщения с точным совпадением города, но не исключительно одно или другое.

Author: Josh Levinson, 2013-05-31

2 answers

Вся реальная работа здесь выполняется $geoDataStore->getPostIDsOfInRange. Именно там выполняется поиск, и именно это не дает желаемых результатов.

WP_Query просто тянет указанный пост IDs. Нет никаких причин, по которым вам следует отказаться от этой части кода, хотя вы можете добавить 'orderby' => 'posts__in', чтобы сохранить порядок сообщений ID, переданных в запрос.

Если $geoDataStore->getPostIDsOfInRange возвращает не все ID, которые вы хотите, вам придется изучить, как это работает.

Теперь, это похоже на код , который ваш класс $geoDataStore использует для выполнения запроса. Нет никаких зацепок, которыми вы могли бы манипулировать.

Есть только две вещи, которые я могу придумать.

  1. Расширьте этот класс и замените эту функцию, чтобы она выполняла поиск вашей метаинформации.
  2. Или запустите другой запрос, чтобы проверить вашу метаинформацию и включить места за пределами сгенерированного радиуса - что-то вроде это.

Другими словами...

$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);
 1
Author: s_ha_dum, 2017-04-13 12:37:45

Вам необходимо объявить связь 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'
        )
    )
);
 0
Author: GhostToast, 2013-05-31 20:48:52