如果地理定位失败,请禁用 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 );