如果地理定位失败,请禁用 WooCommerce 中的默认国家/地区
Disable default country in WooCommerce if geolocation fails
WooCommerce 为客户设置了默认国家/地区。它可以被禁用、设置为商店地址国家或按地理位置设置。
我的问题是,当使用地理定位选项时,如果无法return商店允许的国家/地区,它现在将恢复使用商店地址国家/地区。
我想要的是当地理定位失败时没有默认选择的国家。
我知道这应该可以通过 functions.php 中的一些代码实现。我使用过更改默认国家/地区的代码,例如 here。它还具有测试它是否是帐户上有国家/地区的现有客户的优势(我想包括在内)。我还找到了一些代码来测试地理定位是否设置了国家,例如:
function get_customer_geo_location_country(): ?string {
if ( class_exists( 'WC_Geolocation' ) ) {
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
}
}
return null;
}
来源:答案代码。
我试过将这些东西拼凑起来,但没用。
例如
add_filter( 'default_checkout_billing_country', 'change_default_checkout_country', 10, 1 );
function change_default_checkout_country( $country ) {
// If the user already exists, don't override country
if ( WC()->customer->get_is_paying_customer() ) {
return $country;
}
elseif ( class_exists( 'WC_Geolocation' ) ) {
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
}
}
else {
return null;
}
}
这没有用。虽然我怀疑它很接近。我对 PHP 的了解相当基础,所以我可能犯了一些明显的错误。
您的代码本身没有任何问题,只是 如果满足 elseif 条件,而不是 elseif 中的 if 条件,您不应该假设您的else条件被执行。
基本上,您的 elseif 条件中缺少一个 else
所以你得到:
function filter_default_checkout_billing_country( $default ) {
// If the user already exists, don't override country
if ( WC()->customer->get_is_paying_customer() ) {
return $default;
} elseif ( class_exists( 'WC_Geolocation' ) ) {
// Get location country
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
} else {
$default = null;
}
} else {
$default = null;
}
return $default;
}
add_filter( 'default_checkout_billing_country', 'filter_default_checkout_billing_country', 10, 1 );
WooCommerce 为客户设置了默认国家/地区。它可以被禁用、设置为商店地址国家或按地理位置设置。
我的问题是,当使用地理定位选项时,如果无法return商店允许的国家/地区,它现在将恢复使用商店地址国家/地区。
我想要的是当地理定位失败时没有默认选择的国家。
我知道这应该可以通过 functions.php 中的一些代码实现。我使用过更改默认国家/地区的代码,例如 here。它还具有测试它是否是帐户上有国家/地区的现有客户的优势(我想包括在内)。我还找到了一些代码来测试地理定位是否设置了国家,例如:
function get_customer_geo_location_country(): ?string {
if ( class_exists( 'WC_Geolocation' ) ) {
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
}
}
return null;
}
来源:
我试过将这些东西拼凑起来,但没用。
例如
add_filter( 'default_checkout_billing_country', 'change_default_checkout_country', 10, 1 );
function change_default_checkout_country( $country ) {
// If the user already exists, don't override country
if ( WC()->customer->get_is_paying_customer() ) {
return $country;
}
elseif ( class_exists( 'WC_Geolocation' ) ) {
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
}
}
else {
return null;
}
}
这没有用。虽然我怀疑它很接近。我对 PHP 的了解相当基础,所以我可能犯了一些明显的错误。
您的代码本身没有任何问题,只是 如果满足 elseif 条件,而不是 elseif 中的 if 条件,您不应该假设您的else条件被执行。
基本上,您的 elseif 条件中缺少一个 else
所以你得到:
function filter_default_checkout_billing_country( $default ) {
// If the user already exists, don't override country
if ( WC()->customer->get_is_paying_customer() ) {
return $default;
} elseif ( class_exists( 'WC_Geolocation' ) ) {
// Get location country
$location = WC_Geolocation::geolocate_ip();
if ( isset( $location['country'] ) ) {
return $location['country'];
} else {
$default = null;
}
} else {
$default = null;
}
return $default;
}
add_filter( 'default_checkout_billing_country', 'filter_default_checkout_billing_country', 10, 1 );