当前位置: 首页 > 知识库问答 >
问题:

WooCommerce-根据自定义字段添加费用

夏昊
2023-03-14

我正在尝试根据是否已选中自定义复选框向签出添加费用。我真的很接近让这项工作,但我有问题获得后的价值观,以确定是否应申请或不收费。

以下是我自定义字段的代码

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($\u POST['add\u gift\u message']),它会增加费用。我遇到的问题是确定该字段是否已检查-无论我做什么,我似乎都无法在woo_add_cart_fee中获取帖子值。

有人知道怎么让这个工作吗?谢谢你!!

共有1个答案

狄令
2023-03-14

您无法从$\u POST['add\u gift\u message']获取价值的原因是更新\u checkout是一个ajax事件,它将表单数据序列化到$\u POST['POST\u 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' );
}

如需参考,请参阅此帖子

 类似资料:
  • 我正试图在结帐时将定制费用计入订单总额。我在woocommerce中添加了一个复选框 包含一个自定义js文件,可用于处理事件 和一个php费用处理函数 由于某些原因,$_POST['state']的值没有被添加,当我给出一个硬编码值时,函数会工作,我尝试了很多选项,但无法让它工作。 我看过类似的帖子,但没有一个有答案。

  • 我使用更新费动态基于单选按钮在WooCommerce结账答案代码解决方案,工作非常好,我添加复选框字段与不同的价格为每一个,价格变化反映在结账。 但是我需要一些帮助:当我选择一种附加税的包装时,它会出现在订单区的后端,但只显示价格,我也想显示标题。 复选框选项有: 如何使其在订单上显示名称?是否可以将复选框改为选择字段?

  • 需要根据表单复选框元素添加自定义费用到购物车。基于购物车中产品类别的当前操作非常有效,并增加了自定义送货费,但客户可以选择免费提货。复选框选中交付触发器WooCommerce可以添加自定义费用操作吗? 使用例子从"执行一个动作对复选框选中或未选中的事件在html表单"可以. Change(函数)函数传递(id){如果(this.checked){add_action自定义购物车费用? 选中复选框时

  • 在WooCommerce 3.0发布之前,我的代码已经像魔法一样工作,将自定义值从购物车保存到结账时的订单中。但从那以后,我无法为订单创建自定义元。 环境:WordPress4.9。4.

  • WordPress-WooCommerce 我想做的是: null 邮件里什么也没印。 请解决。提前谢了。

  • 我正在使用wordpress 4.1与ACF v4。我有一个添加了自定义字段的自定义帖子类型,每次添加新类别时都需要添加新的自定义字段。如果我自动添加类别“轿车”,我必须添加自定义字段“轿车”。我可以使用插件函数执行此操作吗?或者我必须用代码,在数据库中插入来做到这一点?提前致谢!!