WooCommerce - 从我的帐户页面中删除国家字段会阻止保存地址

WooCommerce - removing country field from my-account page prevents from saving address

我只向一个国家/地区销售和运送产品,所以我不想显示 billing_countryshipping_country 字段给客户。 我使用 unset($fields['billing_country']).

从结帐和我的帐户地址页面中删除了字段

结帐工作正常,但在我从我的帐户页面中删除这些字段后,我无法在我的帐户地址页面上保存或编辑任何地址。 该页面将简单地刷新自己而不改变任何东西。

这是我的 functions.php 我的主题。

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );

function custom_override_checkout_fields( $fields ) {
   unset($fields['billing']['billing_country']);
   unset($fields['shipping']['shipping_country']);
   unset($fields['billing']['billing_address_2']);
   unset($fields['shipping']['shipping_address_2']);
   unset($fields['shipping']['shipping_phone']);
   return $fields;
}

add_filter( 'woocommerce_billing_fields' , 'custom_override_billing_fields' );

function custom_override_billing_fields( $fields ) {
  unset($fields['billing_country']);
  unset($fields['billing_address_2']);
        
  return $fields;
}

add_filter( 'woocommerce_shipping_fields' , 'custom_override_shipping_fields' );
function custom_override_shipping_fields( $fields ) {
  unset($fields['shipping_country']);
  unset($fields['shipping_address_2']);
  unset($fields['shipping_phone']);
        
  return $fields;
}

如果我注释掉 unset($fields['billing_country']);unset($fields['shipping_country']); 一切正常,它保存了所有地址。取消设置其他字段也有效。我做错了什么,还有其他方法可以删除这些字段吗?谢谢。

更新:

警告 - 长话短说

最奇怪的事情发生了。我使用 css 隐藏了这些字段,并将它们设置在 functions.php 中。但是后来,我的账单地址和送货地址 classes 搞砸了!

我的 woocommerce_billing_fields 过滤器挂钩中有这些行:

      $fields['billing_city']['class'] = array('form-row-last');
      $fields['billing_postcode']['class'] = array('form-row-first');
      $fields['billing_email']['class'] = array('form-row-last');
      $fields['billing_phone']['class'] = array('form-row-first');

这应该使这 4 个字段占据帐单地址表单中行的 50% 宽度。 它适用于电子邮件和 phone,但城市和邮政编码保持 100% 宽度。它应该将 form-row-wide class 替换为 form-row-first/last 并且它确实这样做了,但仅限于两个。

所以我查看了浏览器,发现这两个元素以某种方式具有 data-o_class 属性。

这是我发现的:

<p class="form-row validate-required validate-postcode form-row-wide address-field" 
id="billing_postcode_field" data-priority="65" 
data-o_class="form-row form-row-first validate-required validate-postcode"></p>

上面的元素有问题并且这个 data-o_class 属性包含所有 classes,但是下面的 元素没问题 并替换了他的 class:

<p class="form-row form-row-first validate-required validate-phone" 
id="billing_phone_field" 
data-priority="100"></p>

当我使用 unset($fields['billing_country']) 删除国家字段时,问题消失了,但我还是无法保存地址。

为了修复它,我不得不使用另一个过滤器 - woocommerce_default_address_fields - 这就是我在 functions.php:

中所做的
  add_filter( 'woocommerce_default_address_fields','custom_override_default_address_fields' );
  function custom_override_default_address_fields( $fields ){
    unset($fields['country']);
    return $fields;
  }

它做的更好!

它使国家字段再次出现在结帐和我的帐户页面上,即使它仍然未设置与其他过滤器那里。但是它没有以正确的顺序出现,它没有样式并且在表单的末尾。所以我不得不再次使用 css.

删除它

但是...它修复了我帐户页面上我的账单地址和送货地址中的 classes!我仍然不知道这怎么让我的表格变得如此混乱。

不用写一行代码也能得到同样的结果。

  1. 在 Wordpress 管理面板中转到 WooCommerce > 设置 > 常规.
  2. 在字段中 销售地点 select 销售到特定国家/地区.
  3. 销往特定国家/地区字段中,仅输入您要销售的国家/地区。
  4. 送货地点字段select选项送货到您销售的所有国家

这样,在您帐户的结帐页面和地址页面上,您将看到账单国家发货国家字段为纯文本(而不是选项列表)。

客户将无法修改。

但是,如果你想隐藏它,你可以使用 css 代码进行干预。