首页 > 解决方案 > WooCommerce - 从我的帐户页面中删除国家/地区字段可防止保存地址

问题描述

我只向一个国家销售和运送产品,因此我不想向客户显示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 中。但是后来,我的帐单和送货地址类搞砸了!

我的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% 宽度。它适用于电子邮件和电话,但城市和邮政编码保持 100% 宽度。它应该替换form-row-wideclass intoform-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属性,但是,下面的元素很好,并且他的类被替换了:

<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删除它。

但是....它在我的帐户页面上修复了我的帐单和送货地址中的课程!我仍然不知道这怎么把我的表格弄得这么乱。

标签: phpwordpresswoocommercehook-woocommerce

解决方案


无需编写任何代码即可获得相同的结果。

  1. 在 Wordpress 管理面板中,转到WooCommerce > Settings > General
  2. Selling location(s)字段中,选择Sell to specific countries
  3. Sell to specific countries字段中,仅输入您要销售的国家/地区。
  4. 发货地点字段中选择发货到您销售到的所有国家/地区选项。

在此处输入图像描述

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

客户将无法修改它们。

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


推荐阅读