不允许客户在 WooCommerce 结帐中更改国家/地区

Posted

技术标签:

【中文标题】不允许客户在 WooCommerce 结帐中更改国家/地区【英文标题】:Disallow customer to change country in WooCommerce checkout 【发布时间】:2021-01-18 05:49:19 【问题描述】:

我正在寻找可以在 woocommerce 结帐页面中找到用户所在国家/地区的解决方案。我是通过地理定位来做的。但是,用户可以更改它。我想限制它。

我正在使用付费插件向特定国家/地区的用户提供优惠券。该国家/地区被完美加载,并根据国家/地区应用或拒绝优惠券。但是,用户可以在结帐页面手动更改国家并享受折扣。我的服务是在线的,因此没有实物交付,因此输入错误的国家不会对用户造成任何影响。

我尝试了 2-3 种不同的优惠券限制插件,但都有相同的问题。有没有人遇到过类似的问题?

【问题讨论】:

【参考方案1】:

更新

您可以禁用结帐国家下拉字段(只读),如下所示:

add_filter( 'woocommerce_checkout_fields', 'checkout_country_fields_disabled' );
function checkout_country_fields_disabled( $fields ) 
    $fields['billing']['billing_country']['custom_attributes']['disabled'] = 'disabled';
    $fields['billing']['shipping_country']['custom_attributes']['disabled'] = 'disabled';

    return $fields;

由于未发布禁用的选择字段,您还需要以下重复的隐藏字段,并设置正确的值。这将避免错误通知通知国家必填字段值为空。所以也添加这个:

// Mandatory for disable fields (hidden billing and shipping country fields with correct values)
add_filter( 'woocommerce_after_checkout_billing_form', 'checkout_country_hidden_fields_replacement' );
function checkout_country_hidden_fields_replacement( $fields ) 
    $billing_country = WC()->customer->get_billing_country();
    $shipping_country = WC()->customer->get_shipping_country();
    ?>
    <input type="hidden" name="billing_country" value="<?php echo $billing_country; ?>">
    <input type="hidden" name="shipping_country" value="<?php echo $shipping_country; ?>">
    <?php

代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。


注意事项:

如果未完成,您将需要在购物车页面中禁用运费计算器。

如果您想让国家/地区下拉列表在结帐和我的帐户编辑地址中也只读,请改用以下内容:

add_filter( 'woocommerce_billing_fields', 'checkout_billing_country_field_disabled' );
function checkout_billing_country_field_disabled( $fields ) 
    $fields['billing_country']['custom_attributes']['disabled'] = 'disabled';

    return $fields;


add_filter( 'woocommerce_shipping_fields', 'checkout_shipping_country_field_disabled' );
function checkout_shipping_country_field_disabled( $fields ) 
    $fields['shipping_country']['custom_attributes']['disabled'] = 'disabled';

    return $fields;


// Mandatory for disable fields (hidden billing and shipping country fields with correct values)
add_filter( 'woocommerce_after_checkout_billing_form', 'checkout_country_hidden_fields_replacement' );
function checkout_country_hidden_fields_replacement( $fields ) 
    $billing_country = WC()->customer->get_billing_country();
    $shipping_country = WC()->customer->get_shipping_country();
    ?>
    <input type="hidden" name="billing_country" value="<?php echo $billing_country; ?>">
    <input type="hidden" name="shipping_country" value="<?php echo $shipping_country; ?>">
    <?php

【讨论】:

我试过这个。该国正在适当地禁用。但是,当我下订单时,我收到了这个错误。计费国家/地区是必填字段。 感谢好友的快速回复。对不起,我没有给出完整的图片。应用您的代码后,国家/地区被禁用。它根据地理位置显示正确的国家/地区,并且州下拉列表也正确填充(基于地理位置国家/地区)。在我提交的下一步中,我收到此错误。正如我在问题中提到的,我想限制用户更改国家/地区。您的解决方案完美运行,但如果用户无法完成订单,那么它就没有用了。 似乎地理位置设置正确。如果我检查国家元素,我可以看到印度被选中。州列表也根据国家来填充。现在我不知道完成订单所需的计费国家变量是否与屏幕上显示的不同。如果我使用 unset($fields['billing']['billing_country']); unset($fields['shipping']['shipping_country']);然后整个功能都在工作。唯一的问题是用户无法查看所选国家/地区。 禁用的字段将不会被提交。这是在下订单时给出错误的问题。 ***.com/questions/368813/… 谢谢哥们。该解决方案最初不起作用。但是经过一番谷歌搜索后,我将钩子从 woocommerce_after_checkout_shipping_form 更改为 woocommerce_after_checkout_billing_form 并且它起作用了。从现在开始,我将继续进行。但是有一个漏洞我需要解决。用户可以从浏览器的开发者工具中删除禁用属性,更改国家并继续。我会努力的。感谢您的时间和精力。

以上是关于不允许客户在 WooCommerce 结帐中更改国家/地区的主要内容,如果未能解决你的问题,请参考以下文章

更改 Woocommerce 结帐端点以显示订单摘要详细信息

如何在 WooCommerce 中更改结帐国家/地区选择的悬停颜色?

WooCommerce 在输入邮政编码之前阻止结帐

在 Woocommerce 中更改结帐帐单字段占位符

如何在自定义 woocommerce 结帐字段中显示 $_SESSION 变量?

允许在 Woocommerce 中继续结帐非混合定义的产品类别