在WooCommerce结账国家/地区字段中仅显示地理位置的用户国家/地区

时间:2020-06-18 作者:hormigaz

What I\'m NOT trying to do:

  • 删除或隐藏签出(账单/发货)国家/地区字段

    What I\'m trying do to:

    • 根据地理位置(地理位置已完成),在结帐(帐单/发货)国家/地区字段中仅显示一个国家/地区,或者从结帐(帐单/发货)国家/地区字段中删除我不想向用户显示的国家/地区

      Facts:

      <我的Woocommerce销售地点是:德国、安道尔、奥地利、保加利亚、比利时、克罗地亚、丹麦、斯洛伐克、斯洛文尼亚、西班牙、爱沙尼亚、芬兰、法国、希腊、匈牙利、爱尔兰、拉脱维亚、立陶宛、卢森堡、摩纳哥、荷兰、波兰、葡萄牙、英国、捷克共和国、罗马尼亚、瑞典和瑞士,因此,从销售地点列表中删除国家并不是一个解决方案

    What have I\'ve done so far:

    <我已经尝试了几种挂钩/过滤器来实现这一点:woocommerce_checkout_get_value, woocommerce_shipping_fields, woocommerce_billing_fields, woocommerce_default_address_fieldswoocommerce_checkout_fields. 它们似乎都不起作用

Code I\'ve written:

// NOT WORKING! SHOWS ALL Selling Location(s) (allowed countries)
function override_checkout_fields( $fields ) {
    $fields[\'shipping\'][\'shipping_country\'] = array(
        \'type\'         => \'country\',
        \'label\'        => __( \'Country / Region\', \'woocommerce\' ),
        \'required\'     => true,
        \'class\'        => array( \'form-row-wide\', \'address-field\', \'update_totals_on_change\' ),
        \'autocomplete\' => \'country\',
        \'priority\'     => 40,
        \'options\'      => array( $user_country_code => __( $user_country_name, \'woocommerce\' ) )
    );
    
    //Same for billing_country...
    
    return $fields;
}
add_filter( \'woocommerce_checkout_fields\' , \'override_checkout_fields\', 10, 1 );

// NOT WORKING! SHOWS ALL Selling Location(s) (allowed countries)
function edit_billing_fields( $fields ) {
    $fields[\'billing\'][\'billing_country\'] = array(
        \'type\'         => \'country\',
        \'label\'        => __( \'Country / Region\', \'woocommerce\' ),
        \'required\'     => true,
        \'class\'        => array( \'form-row-wide\', \'address-field\', \'update_totals_on_change\' ),
        \'autocomplete\' => \'country\',
        \'priority\'     => 40,
        \'options\'      => array( $user_country_code => __( $user_country_name, \'woocommerce\' ) )
    );
    return $fields;
}
add_filter( \'woocommerce_billing_fields\', \'edit_billing_fields\' );

... And more
NOTE: 如果我改变\'type\' => \'country\' 通过\'type\' => \'select\' 这是可行的,但如果我更改了国家(显示两个国家进行测试),则状态下拉列表不会更新新选定国家的状态。此外,将显示下拉列表,但不显示Select2 Appearence。

Further Explanation:我现在向28个国家销售。例如,如果用户从法国访问web,当用户到达结账表时,我只想让您将产品发送到法国。这就是为什么我想在(计费/发货)国家/地区下拉列表中仅显示用户国家/地区(以前地理位置)。

我会感谢你的帮助!谢谢

2 个回复
SO网友:ViralP

如果\'type\' => \'select\' 然后为您解决状态选择问题,您可以尝试woocommerce_stateswoocommerce_countries_allowed_country_states 筛选以仅列出用户所在国家/地区的状态。

参考号:https://wordpress.stackexchange.com/a/320548/163113

SO网友:hormigaz

我设法通过关注不同的过滤器来解决这个问题,这个过滤器不必直接用于结账。有问题的过滤器是woocommerce_countries_allowed_countries. 此筛选器位于get_allowed_countries() 功能并获取商店销售到的国家。因此,限制商店销售的国家,我在结帐时解决了国家列表问题。这样,法国用户只能看到法国在该国的下拉列表,澳大利亚用户只能看到澳大利亚在该国的下拉列表,以此类推。。。代码如下:

/**
 * @param array $countries
 * @return array
 */
function custom_update_allowed_countries( $countries ) {

    // Only on frontend
    if( is_admin() ) return $countries;

    if( class_exists( \'WC_Geolocation\' ) ) {
        $location = WC_Geolocation::geolocate_ip();

        if ( isset( $location[\'country\'] ) ) {
            $countryCode = $location[\'country\'];
        } else {
            // If there is no country, then return allowed countries
            return $countries;
        }
    } else {
        // If you can\'t geolocate user country by IP, then return allowed countries
        return $countries;
    }

    // If everything went ok then I filter user country in the allowed countries array
    $user_country_code_array = array( countryCode );

    $intersect_countries = array_intersect_key( $countries, array_flip( $user_country_code_array ) );

    return $intersect_countries;
}
add_filter( \'woocommerce_countries_allowed_countries\', \'custom_update_allowed_countries\', 30, 1 );

相关推荐

Calling hooks in functions

我习惯于使用主题挂钩,定期添加功能,但难以使用插件挂钩来过滤内容。这是我所知的极限,我试图理解这个过程,但没有用。我正在使用GigPress 管理事件。它允许您添加一个节目(基于日期),并将该节目与帖子(标准WP帖子)关联。我已经创建了一个自定义的帖子类型—productions—来关联节目,而不仅仅是一般的博客帖子。插件有一个钩子-gigpress_related_post_types —允许您用自己选择的任何CPT交换帖子。如果我直接编辑插件,它就会工作,将“帖子”替换为“产品”。如果我添加了我希望是