Запрос постов WordPress на русском с использованием пользовательского нативного MySQL, подобного St_Distance_Sphere

Вопрос или проблема

Существует ли способ запроса постов для “цикла”? Но с добавлением фильтра на результаты на основе функции 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.

Вот шаги, как это можно сделать:

  1. Получите необходимые координаты: Сначала вам нужно будет определить точку, вокруг которой вы будете искать, а также параметры запроса (например, максимальное расстояние).

  2. Напишите свой SQL-запрос: Используйте wpdb для выполнения запроса с ST_Distance_Sphere.

  3. Преобразуйте идентификаторы постов: После выполнения SQL-запроса вы получите идентификаторы постов, которые нужно обработать для использования в цикле WordPress.

  4. Используйте 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.

Оцените материал
Добавить комментарий

Капча загружается...