在 PhP、Wordpress 和 MySQL 中,查找最近的位置的功能不适用于自定义表

Posted

技术标签:

【中文标题】在 PhP、Wordpress 和 MySQL 中,查找最近的位置的功能不适用于自定义表【英文标题】:In PhP, Wordpress and MySQL, function to find nearest locations not working on a custom table 【发布时间】:2021-03-07 00:37:38 【问题描述】:

我调整了以下函数,因为我需要使用具有较少行和字段的表。该函数使用的 wordpress 中的表是 wp_postswp_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;

【问题讨论】:

短时间启用通用日志并查看服务器实际收到的内容我也更喜欢***.com/a/61531608/5193536 ST_DISTANCE_SPHERE 谢谢,我实际上没有通过日志在数据库上看到对该表 wp_lat_long 的任何请求。 请看我的回答 更多性能见postmetafind nearest 【参考方案1】:

你忘了执行你准备好的语句

$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://***.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

【讨论】:

不幸的是,当我添加执行时,它一直在 Web 界面上旋转,但我看不到日志中正在运行的查询。 我还在 mysql 中创建了一个表,镜像我称为 wp_postmeta2 的同一个 wp_postmeta 表。当我从 wp_postmeta 更改 wp_postmeta2 时,它不再起作用。看起来我直接在数据库中创建的自定义表无法被 wordpress 应用程序或类似的东西识别【参考方案2】:

好的,我已经解决了。我需要通过$wpdb-&gt;base_prefix 而不是$wpdb-&gt;

【讨论】:

以上是关于在 PhP、Wordpress 和 MySQL 中,查找最近的位置的功能不适用于自定义表的主要内容,如果未能解决你的问题,请参考以下文章

编译的 PHP 7 在 WordPress 中缺少 mysql 扩展

使用php通过wordpress在mysql数据库中添加新行

在 docker-compose、nginx、mysql 和 php 上运行 wordpress

渗透---WordPress网站

渗透--WordPress网站

Wamp 和 Xampp “您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展。” [复制]