Вопрос или проблема
Существует ли способ запроса постов для “цикла”? Но с добавлением фильтра на результаты на основе функции mySQL, такой как St_Distance_Sphere? Или преобразовать wpdb->query в форму, аналогичную “циклу”?
У меня есть координаты WordPress, хранящиеся в базе данных WordPress. Я перебираю посты на своих шаблонах и надеюсь использовать функцию St_Distance_Sphere в этом запросе для фильтрации постов. Этот пример SQL — просто то, что я взял, чтобы продемонстрировать St_Distance_Sphere.
select
address_id
from
geo_data
where
(
ST_Distance_Sphere(
point(longitude, latitude), -- Столбцы в таблице geo_data
point(-97.745363, 30.324014) -- Фиксированная опорная точка
) *.000621371192
) <= 1;
Я надеюсь каким-то образом добавить этот предикат WHERE к моему существующему запросу постов, чтобы включить его в шаблон, аналогично добавлению аргументов к запросу постов WordPress для “цикла”.
Ответ или решение
Для того чтобы выполнить запрос постов в WordPress с использованием функции MySQL ST_Distance_Sphere
, вам нужно будет использовать пользовательский запрос и интегрировать его в цикл WordPress. Поскольку стандартные WP_Query не поддерживают прямую работу с пользовательскими SQL-функциями, мы можем использовать wpdb
для выполнения нашего запроса и затем преобразовать полученные результаты в формат, совместимый с циклом WordPress.
Вот шаги, как это можно сделать:
-
Получите необходимые координаты: Сначала вам нужно будет определить точку, вокруг которой вы будете искать, а также параметры запроса (например, максимальное расстояние).
-
Напишите свой SQL-запрос: Используйте
wpdb
для выполнения запроса сST_Distance_Sphere
. -
Преобразуйте идентификаторы постов: После выполнения SQL-запроса вы получите идентификаторы постов, которые нужно обработать для использования в цикле WordPress.
-
Используйте WP_Query для выполнения цикла: С помощью полученных идентификаторов постов создайте новый запрос с использованием
WP_Query
.
Вот пример кода, который показывает, как это реализовать:
global $wpdb;
// Координаты вашего местоположения
$latitude = 30.324014;
$longitude = -97.745363;
$max_distance = 1; // Максимальное расстояние в милях
// Запрос для получения идентификаторов постов в пределах заданного радиуса
$query = $wpdb->prepare("
SELECT address_id
FROM geo_data
WHERE (
ST_Distance_Sphere(
POINT(longitude, latitude),
POINT(%f, %f)
) * 0.000621371192
) <= %d
", $longitude, $latitude, $max_distance);
// Выполняем запрос
$post_ids = $wpdb->get_col($query);
// Проверяем, нашли ли мы посты
if (!empty($post_ids)) {
// Преобразуем массив идентификаторов постов в строку
$post_ids_string = implode(',', array_map('intval', $post_ids));
// Создаем новый объект WP_Query
$args = array(
'post_type' => 'post', // Здесь укажите нужный тип поста
'post__in' => $post_ids,
'orderby' => 'post__in' // Сортировка по идентификаторам постов
);
$custom_query = new WP_Query($args);
// Запускаем цикл по нашим постам
if ($custom_query->have_posts()) {
while ($custom_query->have_posts()) {
$custom_query->the_post();
// Ваш код для отображения поста
the_title('<h2>', '</h2>');
the_excerpt();
}
// Сбрасываем данные поста
wp_reset_postdata();
} else {
echo 'Посты не найдены.';
}
} else {
echo 'Посты не найдены.';
}
Объяснение кода:
- Мы используем
$wpdb->prepare()
для безопасного выполнения SQL-запроса с подстановкой координат и максимального расстояния. - Метод
get_col()
возвращает массив идентификаторов постов из результата запроса. - Если идентификаторы не пустые, мы создаем новый
WP_Query
, который фильтрует посты по полученным идентификаторам. - После этого мы запускаем стандартный цикл WordPress, чтобы отобразить посты.
Таким образом, используя данные подходы, вы сможете успешно интегрировать функцию ST_Distance_Sphere
с циклом WordPress.