Я довольно новичок в кодировании WordPress и Php в целом, у меня есть относительно простая тема, с которой я работал, которая содержит настраиваемый тип сообщения, который хранит широту и долготу. Каждое сообщение представляет собой список отелей в каталоге. Тема, которую я использую, также интегрируется с FacetWP плагином для WordPress. Пользователь может выполнить поиск на сайте, набрав местоположение локализации, это происходит с помощью функции Google Maps Mapping. Когда поиск отправляется, параметры передаются на страницу архива:
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 и экспериментировать с этим, но, похоже, это не путь, поскольку расстояние не является хранимым значением, а скорее вычислением.
Я получил и отвечу на мой вопрос из Matt@wordpress.stackexchange. На самом деле есть крюк FacetWP, чтобы добавить расстояние до шаблонов страниц. Фильтр функций:
add_filter( 'facetwp_proximity_store_distance', '__return_true' );
и немного php, чтобы включить функциональность:
$distance = facetwp_get_distance(); if ( false !== $distance ) { echo round( $distance, 1 ); echo " miles"; }
Надеюсь, это поможет кому-то, спасибо снова Matt