更新:用户已经在我的答案的评论中澄清了这个请求,所以我在我的原始答案上方添加了一些信息。原始答案仍然有效;)
要使用外部数据进行“main”查询,可以使用pre_get_posts
钩
使用方法如下:
add_action(\'pre_get_posts\',\'get_radius_instructors_for_my_posts\');
function get_radius_instructors_for_my_posts($query){
if($query->is_main_query() && !is_admin()){
if($query->is_search()){
//use your function to get the post ids that are in radius
$post_ids = do_whatever_to_get_the_post_ids();
$query->set(\'post__in\',$post_ids);
$query->set(\'orderby\',\'post__in\');
}
}
}
你的意思是说你使用谷歌地图地理编码服务对每个页面上的讲师地址进行地理编码吗?这不是一件明智的事情,因为有两个原因:1)表现。如果每次搜索都要对每个地址进行地理编码,那会很慢。2) 成本。Googles API每月仅在特定用途以下免费提供。
更好的方法是在Post类型Save上对讲师地址进行地理编码,在数据库中保存纬度和经度,在搜索zip时,使用zip的地理编码功能根据搜索者的纬度和经度进行自定义查询。
因为我不知道你是如何保存地址的,所以我不能帮你。但我可以给你一个函数,从你的用户位置获取特定半径内的帖子:(这假设你的帖子类型键是“讲师”,他们地址的纬度和经度存储在帖子元键“lat”和“lng”中)
function get_posts_in_radius($center_lat,$center_lng,$radius_in_km=50){
$multiplier=3959; //miles
$multiplier=($multiplier*1.609344); //use km instead
$sql = $wpdb->prepare("SELECT $wpdb->posts.ID, pm1.post_id, pm1.meta_value AS lat,
pm2.meta_value AS lng,
(%f * ACOS( COS( RADIANS(%f) ) * COS( RADIANS( pm1.meta_value ) ) * COS( RADIANS( pm2.meta_value ) - RADIANS(%f) ) + SIN( RADIANS(%f) ) * SIN( RADIANS( pm1.meta_value ) ) ) ) AS distance
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta pm1
ON $wpdb->posts.ID = pm1.post_id
INNER JOIN $wpdb->postmeta pm2
ON pm1.post_id = pm2.post_id
AND pm1.meta_key = \'lat\'
AND pm2.meta_key = \'lng\'
WHERE $wpdb->posts.post_status = \'publish\' AND $wpdb->posts.post_type = \'instructor\' HAVING distance < %d ORDER BY distance ASC",$multiplier,$center_lat,$center_lng,$center_lat,$radius_in_km);
$response = array();
if($rows = $wpdb->get_results($sql,ARRAY_A)){
foreach($rows as $row){
$response[] = array(
\'id\' => $row[\'post_id\'],
\'title\' => get_the_title($row[\'post_id\']),
\'lat\' => $row[\'lat\'],
\'lng\' => $row[\'lng\'],
\'distance\' => $row[\'distance\']
);
}
}
return $response;
}
快乐的编码!