在结帐自定义字段中检索产品自定义字段值

时间:2017-03-28 12:13:58

标签: php wordpress woocommerce checkout product

我在单个产品页面中有一个表单,用户可以在其中插入信息(姓名,电话,国家/地区,年龄......),我需要做的是在结算明细中显示此信息。

所以,我所做的是在单个产品中为表单添加了2个字段,这里是代码:

<div class="col-md-6">
                <div class="form-group">
                    <input class="form-control alt" name="billing_vol" type="text"
                           placeholder="<?php esc_html_e( 'N° Vol : *', 'rentcar' ); ?>" >
                </div>
            </div>
            <div class="form-group">
                <input class="form-control alt" type="text" name="billing_cli_age"
                       placeholder="<?php esc_html_e( 'Age *', 'rentcar' ); ?>"
                     "
                >
            </div><div class="col-md-6">
                <div class="form-group">
                    <?php 
                        global $woocommerce;
                        $countries_obj   = new WC_Countries();
                        $countries   = $countries_obj->__get('countries');
                    ?>

                    <?php 
                        woocommerce_form_field('billing_country', array(
                        'type'       => 'select',
                        'class'      => array( 'chzn-drop' ),
                        'placeholder'    => __('Country'),
                        'options'    => $countries
                        )
                        );
                    ?>

                </div>
            </div>

然后我做了相同的事情在结帐页面的结算明细表格中,我添加了这2个字段。这是代码:

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );

function custom_override_checkout_fields( $fields ) {

    $fields['billing']['billing_cli_age'] = array(
        'label'         => __('Age ', 'woocommerce'),
        'placeholder'   => _x('Age ', 'placeholder', 'woocommerce'),
        'required'      => false,
        'class'         => array('form-row-wide'),
        'clear'         => true
    );

    $fields['billing']['billing_vol'] = array(
        'label'         => __('N° vol', 'woocommerce'),
        'placeholder'   => _x('N° vol', 'placeholder', 'woocommerce'),
        'required'      => false,
        'class'         => array('form-row-wide'),
        'clear'         => true
    );
    return $fields;
}

现在我卡住了,我不知道如何将用户在表单中添加的信息(我在单个产品中)发送到结帐页面的结算明细表。

我怎样才能做到这一点?

感谢。

1 个答案:

答案 0 :(得分:1)

以下是获取产品自定义字段的完整功能代码,该字段在添加到购物车时将提交我们的结帐自定义字段时提交的值。

第一个功能仅用于我的测试目的。但是,您的产品自定义字段代码应该在“添加到购物车”表单中,以使其正常工作。

WARNING: Encountered a resource object with type "artemis-forum-disputes", but no model was found for model name "artemis-forum-dispute" (resolved model name using 'apollo-enterprise@serializer:application:.modelNameFromPayloadKey("artemis-forum-disputes")').

这是缺少的钩子函数,它会将您的产品自定义字段值传递到购物车:

add_action( 'woocommerce_before_add_to_cart_button', 'action_before_add_to_cart_button',20 );
function action_before_add_to_cart_button() {
    ?>
        <div class="col-md-6">
            <div>
                <input class="form-control alt" name="billing_vol" type="text"
                       placeholder="<?php esc_html_e( 'N° Vol : *', 'rentcar' ); ?>">
            </div>
            <div>
                <input class="form-control alt" type="text" name="billing_cli_age"
                       placeholder="<?php esc_html_e( 'Age *', 'rentcar' ); ?>">
            </div>
            <div class="form-group">
            <?php
                // Getting the countries (simplified)
                $countries   = WC()->countries->get_countries();

                woocommerce_form_field('billing_country', array(
                    'type'       => 'select',
                    'class'      => array( 'chzn-drop' ),
                    'placeholder'    => __('Country'),
                    'options'    => $countries
                ) );
            ?>
            </div>
        </div>
    <?php
}

由于您可以拥有多个购物车商品,因此您需要打破循环,才能获得第一个商品自定义值:

// Store the data fields to cart
add_filter( 'woocommerce_add_cart_item_data', 'action_save_my_custom_product_fields', 10, 2 );
function action_save_my_custom_product_fields( $cart_item_data, $product_id ) {
    $bool = false;
    $data = array();
    if( isset( $_REQUEST['billing_vol'] ) ) {
        $cart_item_data['custom_data']['billing_vol'] = $_REQUEST['billing_vol'];
        $data['billing_vol'] = $_REQUEST['billing_vol'];
        $bool = true;
    }
    if( isset( $_REQUEST['billing_cli_age'] ) ) {
        $cart_item_data['custom_data']['billing_cli_age'] = $_REQUEST['billing_cli_age'];
        $data['billing_cli_age'] = $_REQUEST['billing_cli_age'];
        $bool = true;
    }
    if( isset( $_REQUEST['billing_country'] ) ) {
        $cart_item_data['custom_data']['billing_country'] = $_REQUEST['billing_country'];
        $data['billing_country'] = $_REQUEST['billing_country'];
        $bool = true;
    }
    if( $bool ) {
        // below statement make sure every add to cart action as unique line item
        $unique_key = md5( microtime().rand() );
        $cart_item_data['custom_data']['unique_key'] = $unique_key;
        $data['unique_key'] = $unique_key;
        WC()->session->set( 'custom_data', $data );
    }
    return $cart_item_data;
}

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

此代码经过测试并有效。

  

对于国家/地区而言很安静很复杂,因为Javascript / Ajax也参与其中......使用独特的&#34;选择&#34; &#34;选项&#34;它有效,但有多个选择选项,它不会。