我想在搜索表单中输入位置后按最近的位置订购产品。我使用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;
}