Переупорядочить результаты публикации по расстоянию в WordPress

ОБНОВЛЕНО
окончательный код здесь. и я думаю, что это работает отлично.

<?php
$my_query = new WP_Query($args_places_cafe);
$locations = array();
if ($my_query->have_posts()) { ?>
<div class="yelp_bussines_wrapper"><div class="yelp_icon"><i class="icon-paw"></i></div>
<h4 class="yelp_category">Cafe</h4>
<?php while ($my_query->have_posts()):$my_query->the_post();

$locationp = get_field('place_address');
$lat1 = $locationp['lat'];
$lon1 = $locationp['lng'];
$lat2 = $gmap_lat;
$lon2 = $gmap_long;
$dist = distance($lat1, $lon1, $lat2, $lon2, "K");
$title = get_the_title();
$locations[] = array(
'title'    => $title,
'dist'     => round($dist, 1)
);
endwhile;

usort( $locations, 'sort_locations' );

foreach( array_slice($locations, 0, 3) AS $location ) {
print '<div class="yelp_unit"><h5 class="yelp_unit_name">'.$location['title'].'</h5>';
print '<span class="yelp_unit_distance"> ('.$location['dist'].' km)</span></div>';
}
}

function sort_locations( $a, $b ) {
if ( $a['dist'] == $b['dist'] ) {
return 0;
}

return ($a['dist'] < $b['dist'] ) ? -1 : 1;
}
wp_reset_query();
?>

1

Решение

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

Вот ваш код с примененными принципами. Обратите внимание, что, поскольку вы не дали достаточно информации для нас, чтобы построить / протестировать это, это только ключевые понятия — вам, возможно, придется настроить вещи, чтобы они работали, учитывая ваши данные и т. д.

// Load places into a custom WP query
$my_query = new WP_Query( $args_places );
// create an array to store the locations in....
$locations = array();
// loop over the query results
if ( $my_query->have_posts() ) {
while ($my_query->have_posts()):
$my_query->the_post();
$location = get_field('place_address');
$lat1 = $location['lat'];
$lon1 = $location['lng'];
$lat2 = $gmap_lat;
$lon2 = $gmap_long;
$dist = distance($lat1, $lon1, $lat2, $lon2, "K");
$title = get_the_title();
// load the values into the array so it's available for sorting
$locations[] = array(
'title'    => $title,
'location' => $location
'dist'     => $dist
);
endwhile;

// sort the array by distance
usort( $locations, 'sort_locations' );

// NOW you can output the locations, as they are sorted by distance
foreach( $locations AS $location ) {
echo $location['title'];
echo $location['dist'] . 'km';
// ...etc
}
}

// callable for usort.  Sorts the array based on the 'dist' array value
function sort_locations( $a, $b ) {
if ( $a['dist'] == $b['dist'] ) {
return 0;
}

return ($a['dist'] < $b['dist'] ) ? -1 : 1;
}
0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector