WooCommerce条件自定义结帐字段

在WooCommerce中,我目前正在尝试在Checkout中添加一个条件自定义字段,该字段显示一个复选框,如果选中该复选框,则会显示一个输入字段以插入意大利语财务代码(Codice Fiscale)。

感谢各种指南和插件代码,我能够在结帐时显示它,但我做错了代码并有几个问题:

  1. 默认情况下,我希望它是非必需字段,只有在检查它必须是必需的。
  2. 如果我尝试继续购物车插入有效或非抄本fiscale我得到此错误“语法错误:在位置0的JSON中的意外令牌<”我的主题通常显示结帐错误。
  3. 仅以意大利语显示所有这些(使用WPML)
  4. 我无法解决进一步的错误,而我无法解决前两点。

注意:意大利法律要求如果私人客户要求发票,他必须同时插入他的(有效) “codice fiscale” (财政代码)

为了避免复杂化,我没有插入任何高级检查工具(这将需要更多的字段,如生日)。 相反,我通过模式标记设置了这个简短的控件:

jQuery('#cf_in').prop('pattern', "^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$"); 

我在互联网上找到它,但不知道它是否可行。 我也有这个:

 function isCodiceFiscaleValid($valore,$codice_fiscale = true){ $espressione = "^[az]{6}[0-9]{2}[az][0-9]{2}[az][0-9]{3}[az]$"; if(!$codice_fiscale){ $espressione = "^[0-9]{11}$"; } if ( eregi($espressione, $valore) ) { return true; } return false; } 

检查后,一旦插入“Codice fiscale” (财政代码)好,我们就可以继续结账,为客户显示并管理这个“codice fiscale”。

我还需要使用WooCommerce PDF Invoices&Packing Slips Pro插件(商业版)在PDF发票上打印。

这里的参考文献(不幸的是只能发布2):

  • Link1(自定义插件) ,
  • Link2(JS检查,注意在同一个网站上也有php检查)

这里的代码(在我的主题的functions.php文件中添加)

 add_filter( 'woocommerce_checkout_fields' , 'cbi_cf_chkbox' ); function cbi_cf_chkbox ( $fields ) { if ( ICL_LANGUAGE_CODE=='it' ) $fields['billing']['checkbox_trigger'] = array( 'type' => 'checkbox', 'label' => __('Voui la fattura? (solo per privati)', 'cbi-custom-parts'), 'class' => array('form-row-wide'), 'clear' => true ); $fields['billing']['cf_in'] = array( 'label' => __('Inserisci il codice fiscale', 'cbi-custom-parts'), 'placeholder' => _x('RSSMRA85T10A562S', 'placeholder', 'cbi-custom-parts'), 'class' => array('display-none form-row-wide'), 'clear' => true ); return $fields; } add_action( 'woocommerce_after_checkout_form', 'cbi_cf_conditionally_hide_show', 6); function cbi_cf_conditionally_hide_show() { if ( ICL_LANGUAGE_CODE=='it' ) ?>  jQuery('input#checkbox_trigger').change(function(){ if (this.checked) { jQuery('#cf_in_field').fadeIn(); jQuery('#cf_in_field').attr('required', true); jQuery('#cf_in').prop('pattern', "^[a-zA-Z]{6}[0-9]{2}[a-zA-Z][0-9]{2}[a-zA-Z][0-9]{3}[a-zA-Z]$"); } else { jQuery('#cf_in_field').fadeOut(); jQuery('#cf_in_field input').val(''); jQuery('#cf_in_field').attr('required', false); } });  user_id, 'cf_in', sanitize_text_field( $_POST['cf_in'] ) ); } } /* * This method shows the value of Partita Iva field after billing address */ add_action( 'woocommerce_admin_order_data_after_billing_address', 'cbi_cf_admin_order_data_after_billing_address', 10, 1 ); function cbi_cf_admin_order_data_after_billing_address($order){ echo '

'.__('Codice Fiscale', 'cbi-cf-invoice').': ' . get_post_meta( $order->id, 'cf_in', true ) . '

'; }

如果你能在这里帮助我,我将非常感激。

在这个答案中,我不能处理PDF发票,所以你会到这里:

  • 解决条件“必需”字段的问题(第1点)
  • 解决json错误的问题(第2点)
  • 仅显示意大利语(第3点)

另外我有:

  • 重新审视了所有代码并纠正了许多小错误。
  • 添加了显示和编辑后端用户配置文件自定义字段值“codice fiscale”的代码:

    在此处输入图像描述

这是代码:

 add_filter( 'woocommerce_checkout_fields' , 'cbi_cf_chkbox' ); function cbi_cf_chkbox ( $fields ) { if ( ICL_LANGUAGE_CODE !='it' ) return $fields; // Only for Italy $fields['billing']['checkbox_cf'] = array( 'type' => 'checkbox', 'label' => __('Voui la fattura? (solo per privati)', 'cbi-custom-parts'), 'class' => array('form-row-wide'), 'clear' => true ); $fields['billing']['cf_in'] = array( 'label' => __('Inserisci il codice fiscale', 'cbi-custom-parts'), 'placeholder' => _x('RSSMRA85T10A562S', 'placeholder', 'cbi-custom-parts'), 'class' => array('form-row-wide'), 'clear' => true ); return $fields; } add_action( 'woocommerce_after_checkout_form', 'cbi_cf_conditionally_hide_show', 6); function cbi_cf_conditionally_hide_show() { if ( ICL_LANGUAGE_CODE !='it' ) return; // Only for Italy $required = esc_attr__( 'required', 'woocommerce' ); ?>  user_id, 'codice_fiscale', sanitize_text_field( $_POST['cf_in'] ) ); update_post_meta( $order_id, '_codice_fiscale', sanitize_text_field( $_POST['cf_in'] ) ); } // Backend : Display in Order edit pages, after billing address, the custom field value "codice fiscale" add_action( 'woocommerce_admin_order_data_after_billing_address', 'cbi_cf_admin_order_data_after_billing_address', 10, 1 ); function cbi_cf_admin_order_data_after_billing_address( $order ){ $codice_fiscale = get_post_meta( $order->get_id(), '_codice_fiscale', true ); if( ! empty( $codice_fiscale ) ) echo '

'.__('Codice Fiscale', 'cbi-cf-invoice').': ' . $codice_fiscale . '

'; } // Backend: Display and edit user profile custom field value "codice fiscale" Only for Italy add_action( 'show_user_profile', 'add_extra_user_codice_fiscale', 1, 1 ); add_action( 'edit_user_profile', 'add_extra_user_codice_fiscale', 1, 1 ); function add_extra_user_codice_fiscale( $user ) { //if( get_user_meta( $user->ID, 'billing_country', true ) != 'IT' ) return; // Only for Italy $codice_fiscale = get_user_meta( $user->ID, 'codice_fiscale', true ); if( empty( $codice_fiscale ) ) $codice_fiscale = ''; ?>


代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

所有代码都在Woocommerce 3+上进行测试并且有效。