2

I modified this script to make a shortcode that shows how much the customer need to spend to get free shipping.

 /** 
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.9
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */
 
add_shortcode ('woo_freeshipping_target', 'woo_freeship_target' );
  
function woo_freeship_target() {
  ob_start();
    
   $min_amount = 279; //change this to your free shipping threshold
   
   $current = WC()->cart->subtotal;
  
   if ( $current < $min_amount ) {
      $added_text = wc_price( $min_amount - $current );
      $notice = sprintf( $added_text );
      echo '<span> You need to add '.$notice.'</span>';
   }
    
     else if ( $current >= $min_amount ) {
      echo '<span>Free Shipping!</span>';
   }
  
    return ob_get_clean();
    
}

But I cannot figure out how can I make it to auto update when the items quantity is modified. Any idea?

0

1 Answer 1

3

To ajaxify your message so it updates when the subtotal change (via ajax) use the woocommerce_add_to_cart_fragments filter hook

So you get:

function custom_message() {
    // Initialize
    $message = __( 'Default message', 'woocommerce' );
    
    // True
    if ( WC()->cart ) {
        // Change this to your free shipping threshold
        $min_amount = 279;
        
        // Get cart subtotal
        $subtotal = WC()->cart->get_subtotal();

        if ( $subtotal < $min_amount ) {
            $message = sprintf( __( 'You need to add %s to get free shipping', 'woocommerce' ), wc_price( $min_amount - $subtotal ) );
        } else {
            $message = __( 'Free shipping', 'woocommerce' );
        }
    }
    
    return $message;
}

// Refreshing on cart ajax events
function filter_woocommerce_add_to_cart_fragments( $fragments ) {    
    $fragments['div.display-message'] = '<div class="display-message">' . custom_message() . '</div>';
    
    return $fragments;
}
add_filter( 'woocommerce_add_to_cart_fragments', 'filter_woocommerce_add_to_cart_fragments', 10, 1 );

// Shortcode
function display_my_message() {
    return '<div class="display-message">' . custom_message() . '</div>';
} 
// Register shortcode
add_shortcode( 'display_message', 'display_my_message' );

SHORTCODE USAGE

In an existing page:

[display_message]

Or in PHP:

echo do_shortcode("[display_message]");


Related: WooCommerce shortcode to ajaxify message that display: "Buy X more products to get a discount"

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.