WooCommerce条件自定义结帐字段 [英] WooCommerce conditional custom checkout fields

查看:100
本文介绍了WooCommerce条件自定义结帐字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In WooCommerce, I'm currently trying to add a conditional custom field in the Checkout that shows a checkbox which if is checked displays an input field to insert an italian fiscal code (Codice Fiscale).

由于使用了各种指南和插件代码,因此我能够在结帐时显示该代码,但是我在代码中做错了一些事情,并遇到了一些问题:

Thanks to various guides and plugin codes I was able to show it in the checkout but i'm doing something wrong with the code and having several issues:

  1. 默认情况下,我希望将其设置为NON必填字段,前提是必须选中它为必填字段.
  2. 如果我尝试继续购物车插入有效或非编码的收款人,则会收到此错误"SyntaxError:意外令牌<在位置0的JSON中",我的主题通常显示结帐错误.
  3. 仅使用意大利语(使用WPML)显示所有这些内容
  4. 当我无法解决前两点时,我不知道进一步的错误.

注意:意大利法律要求,如果私人客户要求开具发票,则他还必须插入其(有效)"codice财务"""(财政代码).

Note: The Italian law requires that if a private customer asks for an invoice he must insert also his (valid) "codice fiscale" (fiscal code).

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

To avoid complications, I didn't insert any advanced checking tools (that would require more fields, such as birthday). Instead I've set this short control via pattern tag:

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]$");

我已经在互联网上找到了它,但真的不知道它是否可以工作.我也也有这个:

I've found it on internet but don't really know if it can work. I have alslo this one too:

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

检查后,一旦插入的"Codice财务信息" (财务代码)正确,我们就可以进行结帐,为客户显示并管理此"Codice财务信息".

After checking, once the inserted "Codice fiscale" (fiscal code) is good, we can proceed to checkout, displaying for customer and admin this "codice fiscale".

我还需要使用 WooCommerce PDF发票和凭证将其打印在PDF发票上. Packing Slips Pro 插件(商业版).

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

References here (unfortunately can only post 2):

  • Link1 (custom plugin),
  • Link2 (JS check, note there's also php check in the same website)

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

Here the code (added in my theme's functions.php file):

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' )
  ?>
    <script type="text/javascript">
        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);
            }
        });
    </script>
    <?php
}
function isCodiceFiscaleValid($valore,$codice_fiscale = true){
    $espressione = "^[a-z]{6}[0-9]{2}[a-z][0-9]{2}[a-z][0-9]{3}[a-z]$";
    if(!$codice_fiscale){
        $espressione = "^[0-9]{11}$";
    }
    if ( eregi($espressione, $valore) )
    {
        return true;
    }
    return false;
}

/*
 * This method processes fields of checkout form
 */
add_action('woocommerce_checkout_process', 'cbi_cf_process');
function cbi_cf_process() {
    if (! empty($_POST['cf_in']) ){
        $valid_codice_fiscale = isCodiceFiscaleValid($_POST['cf_in'],true);

        if( (!$valid_codice_fiscale) ){
            wc_add_notice( 'Wrong data in Codice Fiscale/Partita Iva field', 'error' );
        }
    }
}

/*
 * This method saves codice fiscale data in order meta and in user meta
 */
add_action( 'woocommerce_checkout_update_order_meta', 'cbi_cf_in_update_order_meta' );
function cbi_cf_in_update_order_meta ( $order_id ) {
    if ( ! empty( $_POST['cf_in'] ) ) {
        update_post_meta( $order_id, 'cf_in', sanitize_text_field( $_POST['cf_in'] ) );
        $order = new WC_Order($order_id);
        update_user_meta($order->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 '<p><strong>'.__('Codice Fiscale', 'cbi-cf-invoice').':</strong> ' . get_post_meta( $order->id, 'cf_in', true ) . '</p>';
}

如果您能在这里帮助我,我将不胜感激.

I will really appreciate if you could help me here.

推荐答案

在此答案中,我无法处理PDF发票,因此您将在这里找到:

In this answer I can't treat PDF invoice, so you will get here:

  • 解决有条件的必填" 字段(第1点)的问题
  • 解决错误的问题(点2)
  • 仅显示意大利语(第3点)
  • Solving the problem of conditional "required" field (point 1)
  • Solving the problem of the json error (point 2)
  • Displayed only for italian language (point 3)

另外,我有:

  • 重新访问您的所有代码并更正了许多小错误.
  • 添加了显示和编辑后端用户配置文件自定义字段值"codice taxe"的代码:

这是代码:

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' );
    ?>
    <script type="text/javascript">
        (function($){
            var required = '<abbr class="required" title="<?php echo $required; ?>">*</abbr>'; // Required html

            $('#cf_in_field > #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]$"); // Doesn't seem to do something
            $('#cf_in_field').hide();

            $('input#checkbox_cf').change(function(){
                if (this.checked) {
                    $('#cf_in_field').fadeIn("fast", function(){
                        $(this).addClass("validate-required");
                        $('#cf_in_field > label').append(required);
                    });
                } else {
                    $('#cf_in_field').fadeOut("fast", function(){
                        $(this).removeClass("validate-required");
                        $('#cf_in_field > label > .required').remove();
                    });
                }
                $('#cf_in_field').val('');
                $('#cf_in_field').removeClass("woocommerce-validated");
                $('#cf_in_field').removeClass("woocommerce-invalid woocommerce-invalid-required-field");
            });
        })(jQuery);
    </script>
    <?php
}

// Utility function checking "codice fiscale" validity
function is_cf_valid( $valore, $codice_fiscale = true ){
    $espressione = "^[a-z]{6}[0-9]{2}[a-z][0-9]{2}[a-z][0-9]{3}[a-z]$";
    if( ! $codice_fiscale ) $espressione = "^[0-9]{11}$";
    return eregi( $espressione, $valore ) ? true : false;
}

// Check custom fields value "codice fiscale" when submit and return error notices (if needed)
add_action('woocommerce_checkout_process', 'cbi_cf_process');
function cbi_cf_process() {
    if ( isset($_POST['checkbox_cf']) && $_POST['checkbox_cf'] == 1 ) {
        if( empty( $_POST['cf_in'] ) ) {
            wc_add_notice( __( "Please don't forget to enter your Codice Fiscale/Partita Iva", "cbi-custom-parts" ), "error" );
        } else {
            $valid_codice_fiscale = is_cf_valid( $_POST['cf_in'] );
            if( ( ! $valid_codice_fiscale ) )
                wc_add_notice( __( "Wrong data in Codice Fiscale/Partita Iva field", "cbi-custom-parts" ), "error" );
        }
    }
}

// Save the custom field value "codice fiscale" in order meta and in user meta
add_action( 'woocommerce_checkout_update_order_meta', 'cbi_cf_in_update_order_meta' );
function cbi_cf_in_update_order_meta ( $order_id ) {
    if ( empty( $_POST['cf_in'] ) ) return;

    $customer_id = get_post_meta( $order_id, '_customer_user', true );
    $user_codice_fiscale = get_user_meta( $order_id, 'codice_fiscale', true );

    if( ! empty( $user_codice_fiscale ) )
        update_user_meta($order->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 '<p><strong>'.__('Codice Fiscale', 'cbi-cf-invoice').':</strong> ' . $codice_fiscale . '</p>';
}

// 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 = '';
    ?>
        <h3><?php _e( "Codice fiscale", "cbi-custom-parts" ); ?></h3>
        <table class="form-table"><tr>
            <th><label for="codice_fiscale"><?php _e( "Codice fiscale", "cbi-custom-parts" ); ?></label></th>
            <td><input type="text" name="codice_fiscale" value="<?php echo esc_attr($codice_fiscale); ?>" class="regular-text" /></td>
        </tr></table><br />
    <?php
}

// Backend: Save edited user profile custom field value "codice fiscale" Only for Italy
add_action( 'personal_options_update', 'save_extra_user_codice_fiscale' );
add_action( 'edit_user_profile_update', 'save_extra_user_codice_fiscale' );
function save_extra_user_codice_fiscale( $user_id )
{
    if( ! empty( $_POST['codice_fiscale'] ) )
        update_user_meta( $user_id, 'codice_fiscale', sanitize_text_field( $_POST['codice_fiscale'] ) );
}

代码会出现在活动的子主题(或主题)的function.php文件中,也可能会出现在任何插件文件中.

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

所有代码都在Woocommerce 3+上进行了测试,并且可以正常工作.

All code is tested on Woocommerce 3+ and works.

这篇关于WooCommerce条件自定义结帐字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆