WP_Query使用派生变量作为order by

时间:2017-03-23 02:57:40

标签: php sql wordpress

我正在尝试通过获取用户的纬度/经度位置信息以及帖子的相同信息得出的值来对我的帖子进行排序。

我已经有了实现用户和发布距离的功能,所以不需要,但需要知道如何为wp_query编写我的args代码。

我的初始wp_query是

 array(
  "post_type" => "babysitters",
  "post_status" => "publish",
  "orderby" => "date",
  "order" => "DESC",
  "posts_per_page" => -1
);

我有一个函数返回当前用户和帖子之间的距离值,并希望使用此值来更改默认排序顺序。

这是我找到距离的代码(无问题)

function distance($lat1, $lon1, $lat2, $lon2, $unit) {

  $theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
  $unit = strtoupper($unit);

  if ($unit == "K") {
    return ($miles * 1.609344);
  } else if ($unit == "N") {
      return ($miles * 0.8684);
    } else {
        return $miles;
      }
}

function user_distance_compare() {

$user_id = bp_loggedin_user_id();
$user_location = get_user_meta($user_id, 'geocode_321', false); 
$user_loc = implode(',', $user_location);
$commapos = strpos($user_loc, ",");
$loc_len = strlen($user_loc);
$user_lat = substr($user_loc,0,$commapos);
$user_lng = substr($user_loc,($commapos + 1), ($loc_len - $commapos));
$post_id = get_the_ID();
$post_location = get_field('suburb', $post->ID);
$post_lat = $post_location['lat'];
$post_lng = $post_location['lng'];
//var_dump($user_lat);
//var_dump($user_lng);
//var_dump($post_lat);
//var_dump($post_lng);
$distance = distance($user_lat, $user_lng, $post_lat, $post_lng, "K");
return $distance;
}

如何指定返回的距离,使其与帖子ID匹配,然后我可以使用此派生距离进行排序?

IE 邮政距离

  • 1 - 33.4
  • 2 - 14.2
  • 3 - 1.7
  • 4 - 12.5

最后,我希望按距离顺序显示它,以便将它作为后期订单的3,4,2,1。

通过SQL它会读 选择DISTINCT post_id,distance(从帖子信息中导出的位置) 来自帖子 其中post_type ='保姆' 按距离排序

任何人都可以提供帮助吗?

1 个答案:

答案 0 :(得分:0)

如果您使用某个功能获得距离,我会建立一个按距离排序的帖子ID数组。然后使用' post__in' WP_Query的参数只能获取您想要的项目。您也可以使用' post__in'对于orderby参数。

$babysitters = array(
  '10' => 23,
  '12' => 345,
  '18' => '27
)

get_posts(array(
  'post_type' => 'babysitter',
  'posts_per_page' => -1,
  'post__in' => $babysitters,
  'orderby' => 'post__in'
));