php - woocommerce 自定义结帐字段添加费用以订购 ajax

标签 php jquery ajax wordpress woocommerce

我正在尝试在结帐时将自定义费用添加到订单总额中。 我在 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' ));
}

包含一个应该处理事件的自定义 js 文件

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'
        });

  });
});

还有一个php费用处理函数

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);

由于某些原因,未添加 $_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' );
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) 单击复选框时更新购物车的脚本(不需要额外的 AJAX 请求!)

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) 添加费用的操作

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 );
    }

}

关于php - woocommerce 自定义结帐字段添加费用以订购 ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32119053/

相关文章:

javascript - 单击按钮/文本/链接以按字母顺序对列表项 <li> 进行排序

javascript - 如何替换浏览器快捷键默认值

jquery - 按下提交时,按钮的左侧图标变为 Loading ajax icon using fontawesome

php - jQuery使用数据库的ajax从元素中删除ID并刷新

php - 为什么我无法从 AJAX 调用的 PHP 脚本访问 session 变量?

php - heroku 上的 Imagick - 这可能吗?

php - 在另一个 PHP 类中使用许多不同的对象实例的最佳方法是什么?

php - PSR-0 自动加载器 : Namespaces and the directory structure

PHP:如何告诉 Eclipse/Netbeans 一个对象属于某个类,以启用 Intellisense

javascript - 如何获取调用函数的代码行号