我想做的是根据 2 个坐标之间的距离过滤一堆 wordpress 帖子。在 URL 中传递了用户输入的坐标、范围和类别,如下所示:
/?cat=0&s=5041GW&range=250&lat=51.5654368&lon=5.071263999999928
然后有一些帖子(不是所有帖子)都有我使用高级自定义字段插件创建的纬度和经度字段。这些是我传递给 get_posts 以获取按类别过滤的帖子的参数:
$args = array(
'posts_per_page' => 24,
'category' => $_GET["cat"],
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'adressen',
'post_status' => 'publish',
);
现在我要做的是修改它,以便在实际传递范围和位置时,帖子将被过滤以仅返回位置在用户搜索位置范围(以公里为单位)内的帖子为了。我似乎无法为此找到一个好的解决方案,因为我很难使用 wordpress 及其拥有的插件。我真的很感激我能理解的解决方案。
最佳答案
这在计算上可能相当昂贵。最直接的方法是获取所有符合条件的帖子,然后遍历所有帖子,丢弃指定范围之外的帖子。
困难的出现是因为米和纬度/经度之间没有线性映射。这取决于你在地球上的哪个位置。参见 this question了解详情。 PHPcoord library存在为您进行此计算,但由于我提出的答案略微近似,我将使用 this website 中描述的近似方法。使用 Haversine formula .
我将使用以下公式:
计算两个纬度/经度坐标之间的距离(以公里为单位):
x = Δλ ⋅ cos φm
y = Δφ
d = R ⋅ √(x² + y²)
其中 φ 是以弧度为单位的纬度,λ 是以弧度为单位的经度,R 是地球的半径(平均半径 = 6,371 公里)
在给定起始经纬度、距离和方位角的情况下计算目的地:
φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )
其中 θ 是方位角(从北顺时针方向),δ 是角距离 d/R,d 是行进的距离。参见 atan2 .
因此,我们将定义以下辅助函数:
const R = 6371; // km
function distance_between_points_rad($lat1, $lng1, $lat2, $lng2){
// latlng in radians
$x = ($lng2-$lng1) * cos(($lat1+$lat2)/2);
$y = ($lat2-$lat1);
// return distance in km
return sqrt($x*$x + $y*$y) * R;
}
function get_destination_lat_rad($lat1, $lng1, $d, $brng){
return asin( sin($lat1)*cos($d/R) +
cos($lat1)*sin($d/R)*cos($brng) );
}
function get_destination_lng_rad($lat1, $lng1, $d, $brng){
$lat2 = get_destination_lat_rad($lat1, $lng1, $d, $brng);
return $lng1 + atan2(sin($brng)*sin($d/R)*cos($lat1),
cos($d/R)-sin($lat1)*sin($lat2));
}
function get_bounding_box_rad($lat, $lng, $range){
// latlng in radians, $range in km
$latmin = get_destination_lat_rad($lat, $lng, $range, 0);
$latmax = get_destination_lat_rad($lat, $lng, $range, deg2rad(180));
$lngmax = get_destination_lng_rad($lat, $lng, $range, deg2rad(90));
$lngmin = get_destination_lng_rad($lat, $lng, $range, deg2rad(270));
// return approx bounding latlng in radians
return array($latmin, $latmax, $lngmin, $lngmax);
}
function distance_between_points_deg($lat1, $lng1, $lat2, $lng2){
// latlng in degrees
// return distance in km
return distance_between_points_rad(
deg2rad($lat1), deg2rad($lng1), deg2rad($lat2), deg2rad($lng2) );
}
function get_bounding_box_deg($lat, $lng, $range){
// latlng in degrees, $range in km
return array_map(rad2deg,
get_bounding_box_rad(deg2rad($lat), deg2rad($lng), $range));
}
现在,一般流程应该是:
您要使用的查询应包含元信息: 见here对于其中一些元查询的有用指南
$lat1 = $_GET['lat']; // degrees
$lng1 = $_GET['lng']; // degrees
$range = $_GET['range']; // km
// get the approximate bounding box
$bbox = get_bounding_box_deg($lat1, $lng1, $range);
// query the posts
$args = array(
'posts_per_page' => 24,
'category' => $_GET["cat"],
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'adressen',
'post_status' => 'publish',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'lat',
'value' => array( $bbox[0], $bbox[1] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'lng',
'value' => array( $bbox[2], $bbox[3] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
$the_query = new WP_Query( $args );
然后帖子在循环中被过滤掉:
// Then filter the posts down in the loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$custom_fields = get_post_custom();
if (isset($custom_fields['lat']) && isset($custom_fields['lng'])){
$lat2 = $custom_fields['lat'];
$lng2 = $custom_fields['lng'];
$dist = distance_between_points_deg($lat1, $lng1, $lat2, $lng2);
if ($dist <= $range){
// post is in range
} else {
// post out of range, discard
}
} else {
// post has no latlng coords
}
}
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
WordPress 代码未经测试,如果仍然存在错误,我们深表歉意。不过,一般概念是正确的。
关于php - 按坐标之间的距离过滤 wordpress 帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752033/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
我仍然收到标题中的“错误”消息,但不知道如何解决。在ApplicationController中,classApplicationController在routes.rb#match'set_activity_account/:id/:value'=>'users#account_activity',:as=>:set_activity_account--thisdoesn'tworkaswell..resources:usersdomemberdoget:action_a,:action_bendcollectiondoget'account_activity'endend和User
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking