从FaceWP邻近度函数中提取距离显示在WordPress模板中

时间:2015-10-30 作者:Paul Brown

我对Wordpress&;Php编码一般来说,我有一个相对简单的主题,其中包含存储纬度和经度的自定义帖子类型。每个帖子都是一个目录中的酒店列表。我使用的主题还与WordPress的FacetWP和FacetWP插件集成。用户可以通过键入自己的定位位置来搜索网站,这是使用谷歌地图功能实现的。提交搜索时,参数将传递到存档页:

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

解码结果如下:

43.653226,-79.3831842999998,10,多伦多%2C%20,加拿大%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并在post循环中使用:

global $wp_query, $post;
$distance = $wp_query->locations[$post->ID];
但根据var dump的说法,这似乎并没有返回任何信息,我正在使用Listify主题,而该主题的开发人员——Astonify并没有提供太多支持。这似乎是一个太小的要求,无法向开发人员简要介绍,因为他们希望有人能帮助我。如果有帮助的话,很乐意为贝宝捐款吗?

谢谢

保罗

1 个回复
SO网友:Matt

有一个关于此确切功能的教程:https://facetwp.com/proximity-facet-show-post-distance/

邻近方面现在内置到FacetWP核心中。本教程至少需要FacetWP 2.2.7和Listify 1.0.7。如果尚未升级,请升级。