Posts_orderby 未执行

Posts_orderby not executed

我想在搜索表单中输入位置后按最近的位置订购产品。我使用来自 ACF 的 Google 地图为产品分配位置,该字段称为 "address"。我还 Google 为我的表单和 ACF google 地图半径搜索插件放置了自动完成功能。我的搜索表单重定向到带有 lat 和 lng 变量的 URL:

/?s=&post_type=product&lat=43.26768079999999&lng=6.640710899999931

该插件应该从这个 url 订购产品。纬度和经度在 URL.

中传递良好

插件的两个功能如下:

// Join for searching metadata
function acf_google_maps_search_join_to_WPQuery($join) {

    global $wpdb;

    $acf_gms = new acf_gms; 
    $table_name = $acf_gms->table_name();

    if ( 
        isset($_GET['lat']) && !empty($_GET['lat']) 
        && isset( $_GET['lng']) && !empty($_GET['lng']) 
         ) {

        $join .= " LEFT JOIN {$table_name} AS acf_gms_geo ON {$wpdb->posts}.ID = acf_gms_geo.post_id ";

    }

    return $join;

}
add_filter('posts_join', 'acf_google_maps_search_join_to_WPQuery');



// ORDER BY DISTANCE
function acf_google_maps_search_orderby_WPQuery($orderby) {


     if ( 
        isset($_GET['lat']) && !empty($_GET['lat']) 
        && isset( $_GET['lng']) && !empty($_GET['lng']) 
         ) {

        $lat = sanitize_text_field( $_GET['lat'] );
        $lng = sanitize_text_field( $_GET['lng'] );

        $orderby = " (POW((acf_gms_geo.lng-{$lng}),2) + POW((acf_gms_geo.lat-{$lat}),2)) ASC";

    }

    return $orderby;

}
add_filter('posts_orderby', 'acf_google_maps_search_orderby_WPQuery');

不幸的是,尽管 posts_join 在 sql 查询中可见,但 posts_orderby 未传输。

这是我的结果页面的 sql 查询:

   SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts 
INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) 
INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) 
INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id ) 
LEFT JOIN wp_acf_google_map_search_geodata AS acf_gms_geo ON wp_posts.ID = acf_gms_geo.post_id WHERE 1=1 AND wp_posts.ID NOT IN (968) AND (
    wp_posts.ID NOT IN (
    SELECT object_id
    FROM wp_term_relationships
    WHERE term_taxonomy_id IN (10)
    )
    ) AND (
    wp_postmeta.meta_key = ‘total_sales’
    AND
    (
    (
    ( mt1.meta_key = ‘flash_sale_start’ AND CAST(mt1.meta_value AS DATE) <= ‘20180125’ )
    AND
    ( mt2.meta_key = ‘flash_sale_end’ AND CAST(mt2.meta_value AS DATE) >= ‘20180125’ )
    )
    )
    ) 
AND wp_posts.post_type = ‘product’ 
AND (wp_posts.post_status = ‘publish’ 
OR wp_posts.post_status = ‘complete’ 
OR wp_posts.post_status = ‘paid’ 
OR wp_posts.post_status = ‘confirmed’ 
OR wp_posts.post_status = ‘unpaid’ 
OR wp_posts.post_status = ‘pending-confirmation’ 
OR wp_posts.post_status = ‘cancelled’ 
OR wp_posts.post_status = ‘private’) 
GROUP BY wp_posts.ID 
ORDER BY wp_postmeta.meta_value+0 DESC, wp_posts.post_date DESC LIMIT 0, 100

我认为没有考虑 orderby 因为 woocomerce 在 sql 查询中已经有一个默认的 orderby...

你知道如何让它工作吗?

谢谢

我成功了!!由于 woocommerce 有自己的产品订购功能,因此只需要编写这样的函数即可:

if(isset($_GET['lat']) and $_GET['lat'] != "" and isset($_GET['lng']) and $_GET['lng'] != "")
{
add_filter( 'woocommerce_default_catalog_orderby', 'custom_woocommerce_get_catalog_ordering_args' 

);
}
function custom_woocommerce_get_catalog_ordering_args( $args ) {

    $lat = sanitize_text_field( $_GET['lat'] );
    $lng = sanitize_text_field( $_GET['lng'] );

        $args['orderby'] = ' (POW((acf_gms_geo.lng-{$lng}),2) + POW((acf_gms_geo.lat-

{$lat}),2))';
        $args['order'] = 'ASC';
        $args['meta_key'] = '';

    return $args;
}