跳到主要内容

移除结账字段

如果您正在尝试扩展新的结账 Block,您可能会注意到之前的 checkout_fields 不起作用。这是有意为之,因为我们希望提供更多经过精心设计的扩展方式。 尽管如此,我们最常收到的一项请求是,如何为某些订单类型禁用结账字段。 我们不鼓励这样做,但由于这项请求非常普遍,我们在这里分享相关 Details

为什么我们不鼓励移除字段

原因很简单:结账功能非常复杂,许多插件需要不同的数据。例如,Payment methods 需要您的地址信息来进行欺诈检测或验证您的卡,税费(包括核心税费)需要您的完整地址才能正确计算税费。 我们仍在考虑如何在结账功能中找到一个通用的解决方案。 在我们找到该解决方案之前,以下 document 将帮助您移除结账字段。

禁用单个国家/地区的字段

结账字段仍然遵循国家/地区设置,这意味着您可以通过 PHP 修改某个国家/地区的字段,并且这会正常工作。 以下的账单表单有 10 个字段,其中 7 个是必填项:

Image

假设在阿尔及利亚,我们确信邮政编码和城市是冗余的,因此我们可以移除它们:

add_filter('woocommerce_get_country_locale', function( $locale ) {

$locale['DZ']['postcode']['required'] = false;
$locale['DZ']['postcode']['hidden'] = true;

$locale['DZ']['city']['required'] = false;
$locale['DZ']['city']['hidden'] = true;

return $locale;
});

通过上面的代码,这两个字段都已从阿尔及利亚移除,但未从其他国家/地区移除,这是一个安全且良好的更新。

Image

请记住,这会同时移除 ShippingBilling 的字段。 我们强烈认为 BillingShape 应该与 ShippingShape 匹配。

移除所有字段,仅保留国家和姓名

我们可以采取以下步骤,移除除了国家之外的所有其他字段。移除国家字段会导致您的订单失败,因为我们需要国家信息来确定要移除哪些字段:

add_filter('woocommerce_get_country_locale', function( $locale ) {

$locale['DZ']['address_1'] = [
'required' => false,
'hidden' => true,
];

$locale['DZ']['postcode'] = [
'required' => false,
'hidden' => true,
];

$locale['DZ']['city'] = [
'required' => false,
'hidden' => true,
];

$locale['DZ']['company'] = [
'required' => false,
'hidden' => true,
];

$locale['DZ']['state'] = [
'required' => false,
'hidden' => true,
];

$locale['DZ']['phone'] = [
'required' => false,
'hidden' => true,
];

return $locale;
});

结果如下:

Image

您会注意到,地址行 2 不可见。这是因为如果地址行 1 被隐藏,地址行 2 也会被自动隐藏。

移除公司和电话

如果可以访问网站,一种简单的方法是从编辑器中切换关闭这些字段:

Image

结果如下:

Image

通过代码移除公司和电话

与其他的字段不同,电话、公司和地址 2 的信息是通过一个选项持久化到数据库中的:

  • woocommerce_checkout_phone_field
  • woocommerce_checkout_company_field
  • woocommerce_checkout_address_2_field

这些选项的值可以是:required(必填)、optional(可选)或 hidden(隐藏)。它们管理字段的默认状态。您可以编辑这些选项,但同时也允许商家根据自己的需要进行设置。您还可以根据地区/国家进行编辑。

要编辑默认值:

add_filter(
'default_option_woocommerce_checkout_phone_field',
function ( $default_value ) {
return "required";
},
10,
1
);

如果您想根据地区(覆盖该国家/地区的商户设置)来更改值,可以使用上面的示例。

到目前为止,所有更改都仅应用于阿尔及利亚。其他国家的客户将看到适合其所在国家的正确字段:

Image

将更改应用于您销售的所有国家/地区

与上述类似,我们不建议这样做,除非您只面向非常有限的国家/地区,并且已经针对每个国家/地区进行了测试。 某些 支付网关 仅在 生产模式 下启用欺诈检测,而不在 测试模式 下启用,并且在 测试模式 下通过的 字段 可能在 生产模式 下失败。 但无论如何,以下是代码:

add_filter('woocommerce_get_country_locale', function( $locale ) {
foreach ( $locale as $key => $value ) {
$locale[ $key ]['address_1'] = [
'required' => false,
'hidden' => true,
];

$locale[ $key ]['postcode'] = [
'required' => false,
'hidden' => true,
];

$locale[ $key ]['city'] = [
'required' => false,
'hidden' => true,
];

$locale[ $key ]['state'] = [
'required' => false,
'hidden' => true,
];
}

return $locale;
});

上述代码会循环遍历您销售的所有国家/地区,并禁用这些 字段

限制更改仅适用于虚拟购物车

我们可以选择仅从 虚拟购物车 (仅需要账单信息,不需要 配送 信息) 中移除 字段,这可以通过一些额外的检查来实现:

add_filter('woocommerce_get_country_locale', function( $locale ) {
$cart = wc()->cart;

// 仅当正在处理购物车时才移除 `字段`。
if ( ! $cart ) {
return $locale;
}

// 仅当处理的是虚拟购物车时才移除 `字段`。
if ( $cart->needs_shipping() ) {
return $locale;
}
// 执行以下逻辑...

编辑地址卡文本

在以后的访问中,结账 页面会显示已保存 地址 的地址卡,目前该功能在账单方面可能无法始终正常工作,但一旦正常工作,它会显示如下:

Image

我们可以使用 PHP 编辑该文本,因为该值来自 get_address_formats 函数,该函数通过 woocommerce_localisation_address_formats 过滤器。

我们可以使用以下代码:

add_filter( 'woocommerce_localisation_address_formats', function( $formats ) {
foreach ( $formats as $key => $format ) {
$formats[ $key ] = "{first_name} {last_name}\n{country}";
// 您也可以使用 `{name}` 代替 `名` 和 `姓氏`。
}

return $formats;
} );

Image

请注意,您需要将 字符串 放在双引号中才能使其生效;否则,换行符将无法被识别。