我在单个产品页面中有一个表单,用户可以在其中插入信息(姓名,电话,国家/地区,年龄......),我需要做的是在结算明细中显示此信息。
所以,我所做的是在单个产品中为表单添加了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;
}
现在我卡住了,我不知道如何将用户在表单中添加的信息(我在单个产品中)发送到结帐页面的结算明细表。
我怎样才能做到这一点?
感谢。
答案 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;它有效,但有多个选择选项,它不会。