Posts_orderby not executed



我想在搜索表单中输入位置后按最近的位置订购产品。我使用ACF的谷歌地图为产品分配位置,该字段称为"地址"。我也有谷歌为我的表单和ACF谷歌地图半径搜索插件放置自动完成。我的搜索表单重定向到带有纬度和 lng 变量的 URL:

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

该插件应该从此 URL 订购产品。纬度和 lng 在 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

我认为没有考虑排序,因为 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;
}

最新更新