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

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

http:// localhost:8888/wowgoddess/listings/?fwp_location=43.653226%2C-79.38318429999998%2C10%2CToronto%252C%2520ON%252C%2520Canada&fwp_sort=distance

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

43.653226,-79.38318429999998,10,Торонто%2C%20ON%2C%20Канада

Таким образом, форма передает архиву центральную широту и долготу, а также радиус (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 и поэкспериментировать с этим, но, похоже, это не тот путь, поскольку расстояние не является сохраненным значением, а скорее вычисляется.


person Paul Brown    schedule 28.10.2015    source источник


Ответы (1)


Я получил ответ на свой вопрос от [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";
}

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

person Paul Brown    schedule 01.11.2015