为新客户在Woocommerce购物车上应用百分比折扣

时间:2018-12-19 05:56:41

标签: php jquery ajax wordpress woocommerce

我们正在使用Klarna Checkout(第三方插件)来为我们的WooCommerce平台处理付款。

将产品添加到购物车后,将显示Klarna Checkout表格,其中包含所需的详细信息,例如电子邮件联系电话

当用户输入电子邮件时,我会确定这是不是要给予 50%折扣的新电子邮件:

our-custom.js

  var j = jQuery.noConflict();
  // check every second if email is filled
  var check_is_email_done = setInterval(function() {
    var is_email_done = j('.klarna-widget-form-user .email').text();

    if(is_email_done.length > 0) {
      console.log('email is filled: ' + is_email_done);
      var notFound = j('.fortnox-users td').filter(function(){ 
        return j(this).text() == is_email_done;
      }).get();

      var token = notFound.length;
      if(token > 0) {
        console.log('Old customer..');
      } else { 

        console.log('New customer..');

        // call new_customer_discount() method in functions.php
        j.ajax({
          type: 'GET',
          url: ajaxurl,
          cache: false,
          data: { action: 'newcustomerdiscount'},
          success: function(data) {

            console.log('newcustomerdiscount' + data);

          },
          error: function(xhr,status,error) {
            console.log('newcustomerdiscount error:'+error);

          }
        });

      }

      clearInterval(check_is_email_done);
    }

  },1000);

functions.php

function new_customer_discount() {
  //echo "new_customer_discount123";
  $my_total = wc_format_decimal(WC()->cart->total, 2);

  echo 'Total: '.$my_total;


  do_action('woocommerce_calculate_totals', function($cart) {

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

    print_r($cart);  
    $computed_price = 0;

    // Loop Through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // Get the product id (or the variation id)
        $product_id = $cart_item['data']->get_id();

        // GET THE NEW PRICE (code to be replace by yours)
        if($computed_price > 0)
          $prod_price = $computed_price * .50; // 50% discount

        // Updated cart item price
        $cart_item['data']->set_price( $prod_price );
    }


  });

}

上面的代码流是在确定客户是否是新客户时,我在 functions.php 中调用new_customer_discount()方法,然后执行带有回调的do_action

您知道如何正确地在functions.php中执行以上钩子吗?任何帮助是极大的赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

由于我无法测试您的jQuery代码,因此说jQuery Ajax请求有效。现在,要更改购物车项目的价格,您需要使用woocommerce_before_calculate_totals来代替,在php Ajax中,您将使用WC_Session

在jQuery代码上,您可能需要在success部分添加以下行:

j('body').trigger('update_checkout'); // Refresh checkout

因此您的PHP代码将是:

add_action('wp_ajax_nopriv_newcustomerdiscount', 'ajax_customer_discount');
add_action('wp_ajax_newcustomerdiscount', 'ajax_customer_discount');
function ajax_customer_discount() {
    WC()->session->set('new_customer', true);
}



add_action('woocommerce_before_calculate_totals', 'set_new_customer_discount', 100, 1 );
function set_new_customer_discount( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // If it's not a new customer we exit
    if( ! WC()->session->get('new_customer') )
        return; // Exit

    // Loop Through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // 50% items discount
        $cart_item['data']->set_price( $cart_item['data']->get_price() / 2 ); 
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以在WC()->session->get('new_customer')true的情况下工作……