【问题标题】:WooCommerce - removing country field from my-account page prevents from saving addressWooCommerce - 从我的帐户页面中删除国家/地区字段可防止保存地址
【发布时间】:2021-01-25 03:03:58
【问题描述】:

我只向一个国家/地区销售和运送产品,因此我不想向客户显示 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-wide 类替换为 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 属性,但是,下面的元素很好并且他的类被替换了:

<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 将其删除。

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

【问题讨论】:

  • 我也使用filter hooks,而且你的做法是正确的。所以有什么问题?运行这些钩子时,您是否遇到任何错误?
  • @Ruvee 没有错误,在调试模式下一切都清楚,不知道是什么问题。我检查了整个主题,没有发现任何错误。所以我继续将字段隐藏在 css 中,它并不满足我,但它就是这样。

标签: php wordpress woocommerce hook-woocommerce


【解决方案1】:

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

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

这样,在您帐户的结帐页面和地址页面上,您将看到 Billing countryShipping country 字段为纯文本(而不是选项列表)。

客户将无法修改它们。

不过,如果你想隐藏它,你可以通过 css 代码进行干预。

【讨论】:

  • 谢谢,我想这是唯一可能的解决方案。
猜你喜欢
  • 2018-08-08
  • 2016-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 2015-04-09
  • 2011-08-14
  • 2021-10-27
  • 1970-01-01
相关资源
最近更新 更多