gpt4 book ai didi

php - 在 WooCommerce 3.3 中使用 Google Map API 计算结帐距离

转载 作者:行者123 更新时间:2023-12-01 03:59:49 25 4
gpt4 key购买 nike

我发布了a similar problem a few months back我得到了帮助来解决这个问题。在 Woocommerce 版本 3.1.2 之前它一直运行良好。我一直在更新到 WooCommerce 的最新版本,希望问题能够得到解决。

我将根据结账时客户的 billing_area(自定义下拉菜单)与卖家的 billing_city(在用户个人资料中设置)的值之间的差异添加动态费用。我使用的代码如下 -

这是运行以获取更改后的 billing_area 值的 jQuery 脚本:

add_action( 'woocommerce_after_checkout_form', 'custom_checkout_jquery_script', 10 );
function custom_checkout_jquery_script() {
?>
<script type="text/javascript">
(function($){
$( 'form.checkout' ).on( 'change', '#billing_area', function(){
var location = $('#billing_area option:selected').val();
document.cookie="cusarea="+location;

// Browser console output (Just for testing)
function readCookie(n){ for(var r=n+"=",t=document.cookie.split(";"),e=0;e<t.length;e++){
for(var i=t[e];" "==i.charAt(0);)i=i.substring(1,i.length);
if(0==i.indexOf(r))return i.substring(r.length,i.length)}return null}
$('body').trigger('update_checkout');
console.log('Selected Area: '+location+' | Cookie: '+readCookie("cusarea"));

//$('#order_review').load(document.URL + ' #order_review');
//window.location.reload(true)
});
})(jQuery);
</script>
<?php
}

这是计算费用的代码:

add_action( 'woocommerce_cart_calculate_fees', 'distance_shipping_fee', 30, 1 );
function distance_shipping_fee( $wc_cart ){

if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

if( empty($_COOKIE ['cusarea']) ) return;
else $cookie = $_COOKIE ['cusarea'];

// Encoding the customer's location for Google API
$customer_area = rawurlencode( $cookie );

// Getting billing city of vendors
foreach( $wc_cart->get_cart() as $cart_item ){
$vendor_id = get_post_field( 'post_author', $cart_item['product_id'] );
$vendors[$vendor_id] = get_user_meta($vendor_id, 'billing_city', true);
}

foreach( $vendors as $vend_loc){

// Setting Google API URL ##
$gapi_key = MY_APY; // Set HERE your google api key
$shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$vend_loc";
$shippingurl .= "+dhaka+bangladesh&destinations=$customer_area+dhaka+bangladesh&key=$gapi_key";

// Now fetching json response from googleapis:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $shippingurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);

// If google responds with a status of OK: Extract the distance text:
if($response['status'] == "OK")
$dist = $response['rows'][0]['elements'][0]['distance']['text'];

$dist_array[] = preg_replace("/[^0-9\.]/", '', $dist);
}


// Get the bigger distance
$dist_ance = max($dist_array);
$dist_abs = abs ($dist_ance);

if ( $dist_abs < 5) {
$wc_cart->add_fee( "Delivery - Distance Rate", 10 , true);
} else {
$wc_cart->add_fee( "Delivery - Distance Rate", 20 , true);
}
}

问题是 - 它不再工作了。

如果我转储该值,它会返回 $dist_abs 的值(类似于 5.4,即卖家位置与客户区域之间的距离)。但是,不会向购物车添加任何费用。

有时,当服务器或网站速度较慢时,我会在订单审核中看到标签(配送 - 距离率),但一旦页面正确加载,该标签就会消失。

谁能告诉我为什么它不再工作了?我有什么遗漏的吗?

最佳答案

我已经找到了使用 ajax 而不是 cookie 使其工作的方法......所以请尝试以下操作:

add_action( 'woocommerce_after_checkout_form', 'custom_checkout_jquery_script', 30 );
function custom_checkout_jquery_script() {
if( ! is_checkout() ) return;
?>
<script type="text/javascript">
jQuery(function($){
// wc_checkout_params is required to continue
if ( typeof wc_checkout_params === 'undefined' )
return false;

var a = '#billing_myfield5', b = a+' option:selected';
$( 'form.checkout' ).on( 'change', a, function(){
console.log('Chosen area: '+$(b).html()); // To be removed (testing)

// Ajax: send the chosen customer location to php
$.ajax({
type: 'POST',
url:.ajax_url,
data: {
'action': 'set_customer_area',
'customer_area': $(b).html(),
},
success: function (response) {
$(document.body).trigger('update_checkout');
console.log('Response: '+response); // To be removed (testing)
}
});
});
});
</script>
<?php
}

// Wordpress Ajax: Saved the selected customer location to WC_Session
add_action( 'wp_ajax_nopriv_set_customer_area', 'set_customer_area_in_wc_sessions' );
add_action( 'wp_ajax_set_customer_area', 'set_customer_area_in_wc_sessions' );
function set_customer_area_in_wc_sessions() {
if( ! isset($_POST['customer_area']) ) return;

// Encoding the customer's location for Google API
$customer_area_enc = rawurlencode( $_POST['customer_area'] );

// Set the chosen customer location in WC_Sessions
WC()->session->set('customer_area', rawurlencode($_POST['customer_area']) );

// To be removed (testing: Send back the data to jQuery)
echo json_encode( WC()->session->get('customer_area' ) );

die(); // To avoid server error 500
}

// Add a fee based on the highest distance between customer and vendors
add_action( 'woocommerce_cart_calculate_fees', 'distance_shipping_fee', 30, 1 );
function distance_shipping_fee( $cart ){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;

// Get Url encoded customer area that is saved in WC_Session by ajax
$customer_area = WC()->session->get('customer_area' );

// Only when customer area has been selected
if( empty($customer_area) )
return;

// Getting billing city of vendors
foreach( $cart->get_cart() as $cart_item ){
$vendor_id = get_post_field( 'post_author', $cart_item['product_id'] );
$vendors[$vendor_id] = get_user_meta($vendor_id, 'billing_city', true);
}
$dist_array = array();

// Loop through vendors locations
foreach( $vendors as $vend_loc){

// Setting Google API URL ##
$gapi_key = MY_APY; // Set HERE your google api key
$shippingurl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$vend_loc";
$shippingurl .= "+dhaka+bangladesh&destinations=$customer_area+dhaka+bangladesh&key=$gapi_key";

// Now fetching json response from googleapis:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $shippingurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);

// If google responds with a status of OK: Extract the distance text:
if($response['status'] == "OK")
$dist = $response['rows'][0]['elements'][0]['distance']['text'];

$dist_array[] = preg_replace("/[^0-9\.]/", '', $dist);
}

// Get the bigger distance
$distance = max ($dist_array);
$distance = abs ($distance);

$fee = $distance < 5 ? 10 : 20;

if ( $distance && $fee > 0 )
$cart->add_fee( "Delivery - Distance Rate", $fee , true);
}

代码位于事件子主题(或事件主题)的 function.php 文件中。经过测试并有效。

工作后,您必须使用 //Testing ==> To be returned 删除所有相关行

关于php - 在 WooCommerce 3.3 中使用 Google Map API 计算结帐距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50102637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com