woocommerce 自定义结帐字段以添加订购 ajax 的费用 [英] woocommerce custom checkout field to add fee to order ajax

查看:24
本文介绍了woocommerce 自定义结帐字段以添加订购 ajax 的费用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在结帐时向订单总额添加自定义费用.我在 woocommerce 中添加了一个复选框

add_action('woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout');函数 add_box_option_to_checkout( $checkout ) {echo '

';woocommerce_form_field( 'add_gift_box', array('类型' =>'复选框','类' =>数组('add_gift_box 表单行宽'),'标签' =>__('Ilość pudełek ozdobnych - 25 PLN/szt'),'占位符' =>__(''),), $checkout->get_value( 'add_gift_box' ));}

包含一个可以处理事件的自定义 js 文件

jQuery( document ).ready(function( $ ) {$('#add_gift_box').click(function(){变量数据 = {动作:'woocommerce_add_gift_box',状态:'200',};jQuery.ajax({类型:'POST',网址:wc_checkout_params.ajax_url,数据:数据,成功:功能(代码){控制台日志(代码);jQuery('body').trigger('update_checkout');},数据类型:'html'});});});

还有一个php手续费处理功能

function woo_add_cart_fee( $data ){if ( is_admin() && !defined( 'DOING_AJAX' ) || ! $_POST ) return;$额外成本= 0;如果 (isset($_POST['state'])) {$extracost = intval($_POST['state']);}WC()->购物车->add_fee('Ozdobne pudełka:', $extracost );}add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);

由于某些原因,没有添加 $_POST['state'] 的值,当我给出硬编码值时,该函数可以工作,我已经尝试了很多选项,但无法使其正常工作.

我看过类似的帖子,但都没有答案.

解决方案

post 数据由 'post_data' 中的 AJAX 函数发送,序列化.所以要得到你的复选框的值,你只需要parse_str()这个!

parse_str( $_POST['post_data'], $post_data );

然后您可以从 $post_data['add_gift_box'] 获取您的add_gift_box"选项.请注意,订单完成后,此post_data"元素不再可用,所有内容都在 $_POST 中.

完整示例,基于您的代码:

<小时>

1) 在结帐时添加复选框

add_action('woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout');函数 add_box_option_to_checkout( $checkout ) {echo '

';woocommerce_form_field( 'add_gift_box', array('类型' =>'复选框','类' =>数组('add_gift_box 表单行宽'),'标签' =>__('Ilość pudełek ozdobnych - 25 PLN/szt'),'占位符' =>__(''),), $checkout->get_value( 'add_gift_box' ));回声'</div>';}

2) 单击复选框时更新购物车的脚本(无需额外的 AJAX 请求!)

add_action('wp_footer', 'woocommerce_add_gift_box');函数 woocommerce_add_gift_box() {如果(is_checkout()){?><script type="text/javascript">jQuery( 文档 ).ready(function( $ ) {$('#add_gift_box').click(function(){jQuery('body').trigger('update_checkout');});});<?php}}

3) 添加费用的动作

add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');函数 woo_add_cart_fee( $cart ){if ( !$_POST || ( is_admin() && !is_ajax() ) ) {返回;}如果 ( isset( $_POST['post_data'] ) ) {parse_str( $_POST['post_data'], $post_data);} 别的 {$post_data = $_POST;//最终结帐的回退(非 ajax)}如果(isset($post_data['add_gift_box'])){$额外成本= 25;//不知道你为什么使用 intval($_POST['state']) ?WC()->购物车->add_fee('Ozdobne pudełka:', $extracost );}}

I'm trying to ad a custom fee to the order total upon checkout. I've added a checkbox within woocommerce

add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout ) {
    echo '<div id="message_fields">';
    woocommerce_form_field( 'add_gift_box', array(
        'type'          => 'checkbox',
        'class'         => array('add_gift_box form-row-wide'),

        'label'         => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
        'placeholder'   => __(''),
        ), $checkout->get_value( 'add_gift_box' ));
}

Included a custom js file which schould handle the event

jQuery( document ).ready(function( $ ) {

  $('#add_gift_box').click(function(){
        var data = {
            action: 'woocommerce_add_gift_box',
            state: '200',
        };
        jQuery.ajax({
            type: 'POST',
            url: wc_checkout_params.ajax_url,
            data: data,
            success: function (code) {
                console.log(code);
                jQuery('body').trigger('update_checkout');
            },
            dataType: 'html'
        });

  });
});

And a php fee handling function

function woo_add_cart_fee( $data ){
  if ( is_admin() && ! defined( 'DOING_AJAX' ) || ! $_POST )  return;

  $extracost = 0;
  if (isset($_POST['state'])) {
    $extracost = intval($_POST['state']);
  }
  WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );

}
add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );


add_action('wp_ajax_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);
add_action('wp_ajax_nopriv_woocommerce_add_gift_box', 'woo_add_cart_fee', 10);

For some reasons the value of $_POST['state'] isn't added, the function works when I give a hard coded value, I've tried many option but cant get this to work.

I've seen similar posts but none of them had the answer.

解决方案

The post data is sent by the AJAX functions in 'post_data', serialized. So to get the value of your checkbox, you only need to parse_str() this!

parse_str( $_POST['post_data'], $post_data );

then you can get your 'add_gift_box' option from $post_data['add_gift_box']. Note that upon order completion, this 'post_data' element is not available anymore and everything is in $_POST.

Complete example, based on your code:


1) adding the checkbox to the checkout

add_action( 'woocommerce_after_checkout_billing_form', 'add_box_option_to_checkout' );
function add_box_option_to_checkout( $checkout ) {
    echo '<div id="message_fields">';
    woocommerce_form_field( 'add_gift_box', array(
        'type'          => 'checkbox',
        'class'         => array('add_gift_box form-row-wide'),

        'label'         => __('Ilość pudełek ozdobnych - 25 PLN/szt'),
        'placeholder'   => __(''),
        ), $checkout->get_value( 'add_gift_box' ));
        echo '</div>';
}

2) script to update cart when checkbox clicked (no need for extra AJAX requests!)

add_action( 'wp_footer', 'woocommerce_add_gift_box' );
function woocommerce_add_gift_box() {
    if (is_checkout()) {
    ?>
    <script type="text/javascript">
    jQuery( document ).ready(function( $ ) {
        $('#add_gift_box').click(function(){
            jQuery('body').trigger('update_checkout');
        });
    });
    </script>
    <?php
    }
}

3) action to add the fee

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
        if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
        return;
    }

    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_box'])) {
        $extracost = 25; // not sure why you used intval($_POST['state']) ?
        WC()->cart->add_fee( 'Ozdobne pudełka:', $extracost );
    }

}

这篇关于woocommerce 自定义结帐字段以添加订购 ajax 的费用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆