【问题标题】:Retrieving custom field value from Checkout page从结帐页面检索自定义字段值
【发布时间】:2016-04-25 16:06:49
【问题描述】:

在 WooCommerce 结帐页面上,我添加了一个额外的字段,客户必须输入才能结帐。

我想在 woocommerce_cart_calculate_fees 操作挂钩中访问此字段的值。

我已经尝试了几种使用 woocommerce->客户数据和订单数据的方法,但无法获得价值。非常感谢任何帮助。

/* WooCommerce Add Extra Fees */
add_action( 'woocommerce_cart_calculate_fees','endo_handling_fee' );
function endo_handling_fee() {
 global $woocommerce, $post;

 if ( is_admin() && ! defined( 'DOING_AJAX' ) )
      return;

 // Get the order ID
 $order = new WC_Order($post->ID);
 // to escape # from order id 
 $order_id = trim(str_replace('#', '', $order->get_order_number()));

 // Here is where I want to get the field value
 $orderFee = get_post_meta( $order_id, 'decedents_name_field', true );

}

【问题讨论】:

  • 您必须向我们展示您是如何添加自定义字段的。请向我们展示该代码,我们可以告诉您如何获取该自定义字段。
  • 当您计算购物车费用时,尚未创建订单,因此您不能指望get_post_meta() 来自不存在的订单。
  • 这个有什么更新吗?我正在寻找类似的解决方案。

标签: php wordpress woocommerce


【解决方案1】:

我遇到了同样的问题。如果购物车中的产品数量少于一定数量并且用户想要送货(我的自定义字段),我需要收取送货费。我最终解决这个问题的方法是通过 AJAX 将数据发送到服务器,如下所示:

jQuery("select#delivery_pickup_field").change(function(e) {
    var data = {
        action: 'woocommerce_delivery_fee',
        security: wc_checkout_params.apply_delivery_nonce,
        delivery_option: this.value 
    };

    jQuery.ajax({
        type: 'POST',
        url: wc_checkout_params.ajax_url,
        data: data,
        success: function (code) {
            if (code === '0') {
                jQuery('body').trigger('update_checkout');
            }
            console.log(code);
        },
        dataType: 'html'
    });
    return false;
});

然后获取该数据并将其放入 SESSION 变量中

// Give server access to status of delivery select
add_action('wp_ajax_woocommerce_delivery_fee', 'ajax_add_delivery_fee', 10);
add_action('wp_ajax_nopriv_woocommerce_delivery_fee', 'ajax_add_delivery_fee', 10);
function ajax_add_delivery_fee() {
    if(isset($_POST['delivery_option'])) {
        session_start();
        $_SESSION['delivery_option'] = $_POST['delivery_option'];
        return 1;
    }
    return 0;
}

从那里,您的服务器现在可以访问您的自定义字段具有的任何值。

// Adding delivery fee if fewer than 6 items is in cart
add_action( 'woocommerce_cart_calculate_fees', 'minimum_delivery_fee' );
function minimum_delivery_fee($instance) {
    global $woocommerce;
    @session_start();
    $order_meta = $_SESSION['delivery_option'];

    if(($woocommerce->cart->cart_contents_count < 6) && ($order_meta == 'delivery')) {
        $woocommerce->cart->add_fee( __('Delivery Fee', 'woocommerce'), 15 );
    }
}

正如 helgatheviking 所指出的,订单尚未提交且不存在。我可以看到您获得所需数据的唯一方法是通过 AJAX 将其发送到服务器。

如果这令人困惑,请查看我使用的source 了解更多信息。

【讨论】:

  • 感谢您的回答。我将来会使用这个。但是,我无法验证此方法是否有效,因为此时我并未根据我的问题在该网站上工作。
【解决方案2】:

找到不需要 AJAX 的解决方案: 字段值存储在: WC()->checkout()->get_value('post_data')

在我的情况下,我必须添加 2% 的付款费用(第二次及以上);

我在账单文件中添加了一个自定义字段,注意使用类 update_totals_on_change 来触发购物车重新计算以添加费用。

function number_of_payments_select($fields ){
    //print_b($checkout);


    $cartTotal=WC()->cart->get_cart_contents_total();
    //echo $cartTotal;
    $paymentsArray=array();
        for ($i=1; $i<=12 ;$i++){
            $paymentsArray[strval($i)]= $i.' Payments(amount to pay: '.($cartTotal/$i+$cartTotal/$i*($i-1)*1.02).'currency)';
        }



    $fields ['billing_number_of_payments']= array(
        'type'          => 'select',
        'class'         => array('number_of_payments form-row-wide update_totals_on_change'),
        'label'         => 'Number of payments',
        'required'    => true,
        'options'     => $paymentsArray);

        return $fields;

}
add_action( 'woocommerce_billing_fields', 'number_of_payments_select', 10, 1 );

然后我通过解析(WC()->checkout()->get_value('post_data')得到选择的支付次数

    function add_payments_fee(){
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }


    parse_str (WC()->checkout()->get_value('post_data'),$post_data);
    $number_of_payments=$post_data['billing_number_of_payments'];
    if ($number_of_payments>1) {
        $cartTotal=WC()->cart->get_cart_contents_total();
        $payment_fee=$cartTotal/$number_of_payments*($number_of_payments-1)*0.02;
        WC()->cart->add_fee('fee', $payment_fee);
    }
}
add_action('woocommerce_cart_calculate_fees','add_payments_fee');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2021-06-24
    • 1970-01-01
    • 2013-03-09
    • 2017-02-23
    • 2016-07-29
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多