WooCommerce-根据自定义字段添加费用
WooCommerce - Add fee based on custom field
我正试图根据我添加的自定义复选框是否选中来向结账添加费用。我真的很接近实现这一点,但我在获取帖子价值以确定是否应该申请费用时遇到了问题。
这是我的自定义字段的代码:
add_action( 'woocommerce_after_checkout_billing_form', 'my_custom_fields' );
function my_custom_fields( $checkout ) {
echo '<div id="message_fields"><h3>' . __('Add a Message') . '</h3>';
woocommerce_form_field( 'add_gift_message', array(
'type' => 'checkbox',
'class' => array('gift_message form-row-wide'),
'label' => __('5x7 Enclosed Personal Message - $4'),
'placeholder' => __(''),
), $checkout->get_value( 'add_gift_message' ));
woocommerce_form_field( 'gift_message', array(
'type' => 'textarea',
'class' => array('gift_message_text form-row-wide'),
'label' => false,
'placeholder' => __('Your message'),
), $checkout->get_value( 'gift_message' ));
echo '</div>';
}
这很有效,田地也很完美。
在我的主题form-checkout.php的底部,我添加了这个javascript来更新它检查的字段时的购物车总数:
<script type="text/javascript">
jQuery( document ).ready(function( $ ) {
$('#add_gift_message').click(function(){
if ( $(this).is(':checked') ) {
$('#gift_message_field').show();
var gift_message= true;
} else {
$('#gift_message_field').hide();
var gift_message = false;
}
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: $( 'form.checkout' ).serialize(),
success: function( response ) {
if ( response ) {
var order_output = $(response);
$( '#order_review' ).html( $.trim( order_output ) );
$('body').trigger('update_checkout');
}
},
error: function(code){
},
dataType: 'html'
});
});
});
</script>
这将更新订单总额并运行以下代码(这就是问题所在):
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $data ){
global $woocommerce;
if ( isset($_POST['add_gift_message']) )
$woocommerce->cart->add_fee( 'Personal Gift Message', '4.00', true, 'standard' );
}
我知道这部分正在被调用,因为如果我去掉if(isset($_POST['add_gift_message']),它会增加费用。我遇到的问题是确定字段是否已被检查——无论我做什么,我似乎都无法在woo_ad_cart_fee中获得POST值。
有人知道如何让它发挥作用吗?非常感谢。
无法从$_POST['add_gift_message']
获取值的原因是update_checkout
是一个ajax事件,它将表单数据串行化为$_POST['post_data']
。因此,为了满足在(ajax)用户结账之前和(非ajax)用户结帐期间获取值的需要,您可以使用以下代码获取:
if ( isset( $_POST['post_data'] ) ) {
parse_str( $_POST['post_data'], $post_data );
} else {
$post_data = $_POST; // fallback for final checkout (non-ajax)
}
if ( isset( $post_data['add_gift_message'] ) ) {
$woocommerce->cart->add_fee( 'Personal Gift Message', '4.00', true, 'standard' );
}
作为参考,可以看到这篇文章
相关文章:
- JS动态添加字段-删除按钮不起作用
- 向laravel表单动态添加字段
- MaskMoney.js无法处理动态添加字段
- 流星:在创建帐户上添加字段
- 使用DB值动态添加字段到Form,php
- 使用object.freeze()扩展函数对象-can't添加字段
- 在ASP.Net web窗体/MVC中动态加载和添加字段
- 如何在使用Knex.JS添加字段时捕捉错误
- KendoUI 网格:动态向数据源添加字段
- Jquery- 动态添加字段 - 防止删除最后一个项目
- JQuery 无法获取动态添加字段的值
- 扩展 Ext.data.Model(动态添加字段)
- 如何使用角度 JS 添加嵌套的添加字段
- 如何在 CKeditor 上传中向 POST 值添加字段
- 在流星中向用户集合添加字段的正确方式
- 按数组分组并在主数组中添加字段和子数组
- 如何在JavaScript中为HTML上的动态添加字段执行乘法
- 如何在javascript中为html上的动态添加字段匹配id
- 在具有嵌套属性的轨道中动态添加字段
- 使用jquery添加字段