woocommerce 自定义结帐字段以增加订购 ajax 的费用

Posted

技术标签:

【中文标题】woocommerce 自定义结帐字段以增加订购 ajax 的费用【英文标题】:woocommerce custom checkout field to add fee to order ajax 【发布时间】:2015-11-14 03:26:18 【问题描述】:

我正在尝试在结帐时将自定义费用添加到订单总额中。 我在 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'] 的值没有被添加,当我给出一个硬编码的值时,该函数可以工作,我尝试了很多选项,但无法让它工作。

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

【问题讨论】:

你有想过这个吗? 还没有 - 找到答案后我会发布更新,现在我使用结帐插件来实现这一点 【参考方案1】:

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


【讨论】:

谢谢。我会检查一下。 这很棒!但出于好奇,jquery trigger('update_checkout') 是如何触发函数 woo_add_cart_fee 的? update_checkout 会将所有结帐表单数据发送到 WooCommerce 并更新总数。此更新期间触发的操作之一(服务器端)是woocommerce_cart_calculate_fees,因此它正在执行woo_add_cart_fee() 完美运行。如何将其应用到添加到购物车部分而不是结帐页面的下方? 完美。我花了两个小时试图让这样的东西起作用。我不知道 update_checkout【参考方案2】:

这太棒了!非常感谢。我已经对其进行了一些更改以添加百分比。我知道这不是一个更好的答案,但我没有声誉来推动你的答案。对于像我一样被卡住的人..

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' ); function woo_add_cart_fee( $cart )
  global $woocommerce;

    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'])) 

$percentage = 0.01;
$surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;    
$woocommerce->cart->add_fee( 'Surcharge', $surcharge, true, '' );



【讨论】:

以上是关于woocommerce 自定义结帐字段以增加订购 ajax 的费用的主要内容,如果未能解决你的问题,请参考以下文章

根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用

php [使用操作和过滤器自定义结帐字段]保存WooCommerce自定义结帐字段

php [使用操作和过滤器自定义结帐字段]验证WooCommerce自定义结帐字段

自定义 woocommerce 结帐表单字段

在 Woocommerce 中的购物车和结帐总计上插入自定义总计行

Woocommerce 中特定支付网关的结帐附加字段