WordPress查询按临时变量进行定制排序

时间:2020-03-30 作者:Alt C

我已经创建了位置接近功能。我有一个WP_Query 为名为Instructor. 每个讲师都有一个地址,因此如果有人输入邮政编码,它会使用谷歌的API为每个自定义讲师帖子计算距离。它成功地计算了每个帖子的距离,但其动态数据未保存在数据库中。

我创建了另一个wp_query 在主循环之前循环以获取列表,因此我有如下数据:

$result = array (
 \'223\' => \'1.99\'
 \'136\'  =>  \'1.82\',
 \'166\' => \'1.93\',
);
钥匙在哪里post id 价值是distance. 是否有任何方法可以根据在实际查询之前进行的查询中的数据显示最近的讲师?

1 个回复
最合适的回答,由SO网友:HU ist Sebastian 整理而成

更新:用户已经在我的答案的评论中澄清了这个请求,所以我在我的原始答案上方添加了一些信息。原始答案仍然有效;)

要使用外部数据进行“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;
}
快乐的编码!

相关推荐

WooCommerce:如何使用WooCommerce_Order_Item_Meta_end在电子邮件确认中显示项目元数据

我们的商店销售软件,我们正在为每个购买的软件添加一个软件凭证代码。购买完成后(通过woocommerce_payment_complete hook)我们生成凭证代码并将其添加到通过wc_add_order_item_meta 方法汇总代码:add_filter(\'woocommerce_payment_complete\', \'add_voucher_code\'); function add_voucher_code( $order_id ) { $or