【问题标题】:WooCommerce conditional custom checkout fieldsWooCommerce 条件自定义结帐字段
【发布时间】:2017-09-19 11:34:21
【问题描述】:

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

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

  1. 默认情况下,我希望它是非必填字段,只有当它被选中时,它必须成为必填字段。
  2. 如果我尝试继续在购物车中插入有效的或非编码的财务,我会收到此错误“SyntaxError: Unexpected token
  3. 仅以意大利语显示所有这些内容(使用 WPML)
  4. 我不知道更多的错误,但我无法解决前两点。

注意:意大利法律规定,如果私人客户索要发票,他还必须插入他的(有效)“codice financee”(财政代码)

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

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 = "^[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 accountinge”(财政代码)是好的,我们就可以进行结账,向客户和管理员显示这个“codice accountinge”。

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

参考这里(可惜只能发2条):

这里是代码(添加到我的主题的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' )
  ?>
    <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>';
}

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

【问题讨论】:

    标签: php jquery wordpress woocommerce checkout


    【解决方案1】:

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

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

    另外我还有:

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

    代码如下:

    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 文件或任何插件文件中。

    所有代码都在 Woocommerce 3+ 上进行了测试并且可以运行。

    【讨论】:

    • 首先:非常感谢您帮助我并花时间帮助我解决这个问题。你简直太善良和天使了。 :) 我已经尝试了您的修改后的代码,并且可以按我的意愿工作,但是,无论我放什么代码,或者如果我用一些字符填充它,都会给我错误“SyntaxError: Unexpected token icosaedro.it/cf-pi/vedi-codice.cgi?f=cf-php.txt 这可以工作吗?你已经做了很多,所以如果你不能回答这个问题,我会理解的。谢谢:)
    • 您好!再次感谢您的帮助,我已经成功地删除了最终不需要的支票。现在我正在尝试在感谢页面上显示该字段,但该字段仍然是白色的。这是我的最新结果:pastebin.com/fHHKrdXD 希望你有时间检查一下 :) 知道了这一点,我也会知道如何将字段添加到电子邮件中 ​​:) 再次感谢
    • 嘿伙计,抱歉还是 S.O. 的新手。 ,现在我确实接受了你的回答。好的,关于 ACF 稍后我将添加更多信息。非常感谢您的投入和帮助! :)
    猜你喜欢
    • 2021-07-02
    • 2023-04-10
    • 2018-08-07
    • 1970-01-01
    • 2017-03-21
    • 2013-07-07
    • 2015-12-16
    • 2015-04-20
    相关资源
    最近更新 更多