[英]In PhP, Wordpress and MySQL, function to find nearest locations not working on a custom table
我有以下 function 進行了調整,因為我需要使用具有較少行和字段的表。 function 使用的 wordpress 中的表是wp_posts和wp_postmeta (見下文),但它的行太多,性能很差。 我創建了一個名為wp_lat_long的精選表,其中僅包含我需要的信息。 我正在嘗試優化以根據用戶的要求(半徑、位置)計算哪些 Posts_ID 在半徑內。 問題是使用此自定義表時我沒有得到任何結果。 在數據庫上運行的查詢有效。 wp_lat_long表有以下列:ID、緯度、經度。
我是 PHP 的新手。
add_filter('houzez_radius_filter', 'houzez_radius_filter_callback', 10, 6);
if( !function_exists('houzez_radius_filter_callback') ) {
function houzez_radius_filter_callback( $query_args, $search_lat, $search_long, $search_radius, $use_radius, $location ) {
global $wpdb;
if ( ! ( $use_radius && $search_lat && $search_long && $search_radius ) || ! $location ) {
return $query_args;
}
$radius_unit = houzez_option('radius_unit');
if( $radius_unit == 'km' ) {
$earth_radius = 6371;
} elseif ( $radius_unit == 'mi' ) {
$earth_radius = 3959;
} else {
$earth_radius = 6371;
}
$sql = $wpdb->prepare( "SELECT $wpdb->lat_long.ID,
( %s * acos(
cos( radians(%s) ) *
cos( radians( $wpdb->lat_long.latitude ) ) *
cos( radians( $wpdb->lat_long.longitude ) - radians(%s) ) +
sin( radians(%s) ) *
sin( radians( $wpdb->lat_long.latitude ) )
) )
AS distance, $wpdb->lat_long.latitude AS latitude, $wpdb->lat_long.longitude AS longitude
FROM $wpdb->lat_long
HAVING distance < %s
ORDER BY distance ASC
Limit 200",
$earth_radius,
$search_lat,
$search_long,
$search_lat,
$search_radius
);
$post_ids = $wpdb->get_results( $sql, OBJECT_K );
if ( empty( $post_ids ) || ! $post_ids ) {
$post_ids = array(0);
}
$query_args[ 'post__in' ] = array_keys( (array) $post_ids );
return $query_args;
}
}
您忘記執行准備好的語句
$sql = $wpdb->prepare( "SELECT $wpdb->lat_long.ID,
( %s * acos(
cos( radians(%s) ) *
cos( radians( $wpdb->lat_long.latitude ) ) *
cos( radians( $wpdb->lat_long.longitude ) - radians(%s) ) +
sin( radians(%s) ) *
sin( radians( $wpdb->lat_long.latitude ) )
) )
AS distance, $wpdb->lat_long.latitude AS latitude, $wpdb->lat_long.longitude AS longitude
FROM $wpdb->lat_long
HAVING distance < %s
ORDER BY distance ASC
Limit 200",
$earth_radius,
$search_lat,
$search_long,
$search_lat,
$search_radius
);
$wpdb->execute(); <------ this here is missing
$post_ids = $wpdb->get_results( $sql, OBJECT_K );
但你可以像這里一樣使用ST_DISTANCE_SPHERE
https://stackoverflow.com/a/61531608/5193536
SELECT
id,
ST_DISTANCE_SPHERE(POINT(- 82.337036, 29.645095), POINT(`longitude`, `latitude`)) / 1000 AS distance
FROM
users u
WHERE
id <> 1
HAVING distance < 5000
ORDER BY distance DESC
LIMIT 20
好的,所以我已經解決了。 我需要傳遞{$wpdb->base_prefix}
而不是$wpdb->
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.