Apply percentage discount on Woocommerce cart item

2019-08-28 22:01发布

We are using Klarna Checkout(3rd party plugin) to handle payments for our WooCommerce platform.

When the product is added to cart, Klarna Checkout Form appears with the details needed like email and contact number.

When a user enters their email, I determine if it's a new email to give 50% discount:

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


  });

}

The flow of my code above is when I determine if a customer is new, I call the new_customer_discount() method in functions.php then execute do_action with callback

Do you know how can I execute hook above in functions.php properly? Any help is greatly appreciated. Thanks

1条回答
劫难
2楼-- · 2019-08-28 22:40

As I can't test your jQuery code, Let say that jQuery Ajax request works. Now to change cart items prices you need to use woocommerce_before_calculate_totals instead and in your php Ajax you will use WC_Session

On your jQuery code, you might need to add on the success part the following line:

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

So your PHP code will be:

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

Code goes in function.php file of your active child theme (or active theme). Tested and works when WC()->session->get('new_customer') is true

查看更多
登录 后发表回答