Извлечение расстояния от функции близости FacetWP до отображения в шаблоне WordPress

Я довольно новичок в WordPress & PHP-кодирование в целом, у меня есть относительно простая тема, с которой я работал, которая содержит собственный тип записи, который хранит широту и долготу. Каждый пост представляет собой список отелей в каталоге. Тема, которую я использую, также интегрируется с FacetWP плагином для WordPress. Пользователь может выполнить поиск по сайту, введя местоположение для определения местоположения, это происходит с помощью функции картирования Googles. При выполнении поиска параметры передаются на страницу архива:

HTTP: // локальный: 8888 / wowgoddess / объявления / fwp_location = 43,653226% 2C-+79,38318429999998% 2C10% 2CToronto% 252C% 2520ON% 252C% 2520Canada&fwp_sort = расстояние

расшифровывается так:

43.653226, -79.38318429999998,10, Торонто% 2C% 20ON% 2C% 20Canada

Таким образом, форма передает архив центральной широте и долготе, а также в радиусе (10 миль).

Затем архив использует эту информацию для запроса списков типов постов, чтобы найти близлежащие места.

Что я действительно хочу сделать, это отобразить расстояние каждого поста от центрального местоположения на странице обзора архива / поста.

Это должно быть возможно, поскольку у темы есть опция сортировки по расстоянию. Я просто не могу понять, как получить вычисленное значение и отобразить его в теле страницы. PHP для функции близости:

<?php

if ( class_exists( 'FacetWP_Facet_Proximity' ) ) {
return;
}

class FacetWP_Facet_Proximity
{

/**
* The ordered array of post IDs
*/
public $ordered_posts = array();


/**
* An array containing each post ID and its distance
*/
public $distance = array();


function __construct() {
$this->label = __( 'Proximity', 'fwp' );

add_filter( 'facetwp_index_row', array( $this, 'index_latlng' ), 10, 2 );
add_filter( 'facetwp_sort_options', array( $this, 'sort_options' ), 1, 2     );
add_filter( 'facetwp_filtered_post_ids', array( $this, 'sort_by_distance' ), 10, 2 );
}


/**
* Generate the facet HTML
*/
function render( $params ) {

$output = '';
$facet = $params['facet'];
$value = $params['selected_values'];
$unit = empty( $facet['unit'] ) ? 'mi' : $facet['unit'];

$lat = empty( $value[0] ) ? '' : $value[0];
$lng = empty( $value[1] ) ? '' : $value[1];
$chosen_radius = empty( $value[2] ) ? '' : $value[2];
$location_name = empty( $value[3] ) ? '' : urldecode( $value[3] );

$radius_options = apply_filters( 'facetwp_proximity_radius_options', array( 10, 25, 50, 100, 250 ) );

ob_start(); ?>
<input type="text" id="facetwp-location" value="<?php echo $location_name;     ?>" placeholder="<?php _e( 'Enter location', 'fwp' ); ?>" />

<select id="facetwp-radius">
<?php foreach ( $radius_options as $radius ) : ?>
<?php $selected = ( $chosen_radius == $radius ) ? ' selected' : ''; ?>
<option value="<?php echo $radius; ?>"<?php echo $selected; ?>><?php echo "$radius $unit"; ?></option>
<?php endforeach; ?>
</select>

<div style="display:none">
<input type="text" class="facetwp-lat" value="<?php echo $lat; ?>" />
<input type="text" class="facetwp-lng" value="<?php echo $lng; ?>" />
</div>
<?php
return ob_get_clean();
}


/**
* Filter the query based on selected values
*/
function filter_posts( $params ) {
global $wpdb;

$facet = $params['facet'];
$selected_values = $params['selected_values'];
$unit = empty( $facet['unit'] ) ? 'mi' : $facet['unit'];
$earth_radius = ( 'mi' == $unit ) ? 3959 : 6371;

if ( empty( $selected_values ) || empty( $selected_values[0] ) ) {
return 'continue';
}

$lat = (float) $selected_values[0];
$lng = (float) $selected_values[1];
$radius = (int) $selected_values[2];

$sql = "SELECT DISTINCT post_id,
( $earth_radius * acos( cos( radians( $lat ) ) * cos( radians( facet_value ) ) * cos( radians( facet_display_value ) - radians( $lng ) ) + sin( radians( $lat ) ) * sin( radians( facet_value ) ) ) ) AS distance
FROM {$wpdb->prefix}facetwp_index
WHERE facet_name = '{$facet['name']}'
HAVING distance < $radius
ORDER BY distance";

$this->ordered_posts = array();
$this->distance = array();

if ( apply_filters( 'facetwp_proximity_store_distance', false ) ) {
$results = $wpdb->get_results( $sql );
foreach ( $results as $row ) {
$this->ordered_posts[] = $row->post_id;
$this->distance[ $row->post_id ] = $row->distance;
}
}
else {
$this->ordered_posts = $wpdb->get_col( $sql );
}

return $this->ordered_posts;
}

Буду признателен за любую помощь, которую вы можете предложить, я попытался прочитать wpquery и поэкспериментировать с этим, но, похоже, это не тот путь, по которому расстояние не является сохраненным значением, скорее это расчет.

2

Решение

Я получил ответ на мой вопрос от [email protected]. На самом деле есть хук FacetWP для добавления расстояния до шаблонов страниц. Фильтр функций:

add_filter( 'facetwp_proximity_store_distance', '__return_true' );

и немного php для включения функциональности:

$distance = facetwp_get_distance();
if ( false !== $distance ) {
echo round( $distance, 1 );
echo " miles";
}

Надеюсь, это кому-нибудь поможет, еще раз спасибо, Мэтт

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]