2016-04-02 4 views
2

Я выполняю дистанцию ​​мудрый сортировать по сообщениям. сценарий выглядит так: пользователь вводит название города, я получаю координаты для города. Каждое сообщение также имеет некоторые координаты в качестве постмета. Мне нужно найти расстояние между этими двумя точками и отсортировать сообщения, такие как сообщение с минимальным расстоянием, будет показано первым.Wordpress Сортировка сообщений, возвращаемых WP_Query

Я пробовал использовать следующий код для расчета расстояния, который отлично работает. Моя проблема связана с этим расстоянием до сообщений. Я попытался добавить свойство к объекту post. Но тогда как сортировать эти сообщения?

Мне нужен объект WP_Query с отсортированными сообщениями.

$ prop_selection = новый WP_Query ($ args);

while ($prop_selection->have_posts()): $prop_selection->the_post(); 

    $property_lat = get_post_meta($post->ID,'property_latitude',true); 
    $property_lng = get_post_meta($post->ID,'property_longitude',true); 

    $distancefromcity=distance($property_lat,$property_lng,$city_lat,$city_lng,"K"); 
    $distancefromcity=round($distancefromcity,2); 

    $post = (array)$post; 
    $post['distance'] = $distancefromcity; 
    $post = (object)$post; 

endwhile; 

ответ

1

Я сделал это следующим образом. Это хорошо или есть лучший способ?

while ($prop_selection->have_posts()): $prop_selection->the_post(); 

     $property_lat = 0; 
     $property_lng = 0; 

     $property_lat = get_post_meta($post->ID,'property_latitude',true); 
     $property_lng = get_post_meta($post->ID,'property_longitude',true); 

     $distancefromcity=distance($property_lat,$property_lng,$city_lat,$city_lng,"K"); 
     $distancefromcity=round($distancefromcity,2); 
     $distance_array[]= array('ID' => $post->ID, 
           'distance' => $distancefromcity); 

    endwhile; 


    usort($distance_array, function ($item1, $item2) { 
     if ($item1['distance'] == $item2['distance']) return 0; 
     return $item1['distance'] < $item2['distance'] ? -1 : 1; 
    }); 


    $sorted_posts = array(); 

    foreach($distance_array as $key) 
    { 
     $sorted_posts[]=$key['ID']; 
    } 


    $args = array(
     'cache_results'   => false, 
     'update_post_meta_cache' => false, 
     'update_post_term_cache' => false, 
     'post_type'    => 'estate_property', 
     'post_status'    => 'publish', 
     'paged'     => $paged, 
     'posts_per_page'   => $prop_no, 
     'post__in'    => $sorted_posts, 
     'orderby'     => 'post__in' 
    ); 

    $prop_selection = new WP_Query($args); 
+0

Я думаю, что это нормально. Но помните, что вы будете делать эту сортировку для каждого запроса, сделанного для вашего сайта, который, по моему мнению, является излишним накладным. Если вы использовали метод метаданных post, это только один запрос для каждого запроса. –

+1

Фактически пользователь будет искать несколько городов. поэтому добавление postmeta может добавить дополнительные накладные расходы (когда я сказал, что «пользователь вводит название города», я имею в виду, что он будет искать несколько раз, а не в первый раз.) –

+0

В этом случае ваш путь имеет больше смысла! –

2
  1. Добавить $distancefromcity на посты meta-data

  2. Сделать заказ запроса на выборку и сортировку по расстоянию. См http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

+0

Спасибо. Я сделал это по-другому. Я отправил его в ответ. Пожалуйста, дайте какое-либо предложение по этому поводу. –

Смежные вопросы