File: /home/thuexe247c/public_html/wp-content/themes/flatsome/inc/woocommerce/class-shipping.php
<?php
/**
* Shipping class.
*
* @package Flatsome\WooCommerce
*/
namespace Flatsome\WooCommerce;
defined( 'ABSPATH' ) || exit;
/**
* Class Shipping
*
* @package Flatsome\WooCommerce
*/
final class Shipping {
/**
* The single instance of the class.
*
* @var Shipping
*/
protected static $instance = null;
/**
* Shipping constructor.
*/
private function __construct() {
if ( get_theme_mod( 'catalog_mode' ) ) {
return;
}
add_action( 'wp_loaded', [ $this, 'init' ] );
add_filter( 'woocommerce_add_to_cart_fragments', [ $this, 'fragments' ] );
add_filter( 'woocommerce_update_order_review_fragments', [ $this, 'fragments' ] );
}
/**
* Main instance.
*
* @deprecated in favor of get_instance()
* @return Shipping
*/
public static function instance() {
_deprecated_function( __METHOD__, '3.19.0', 'get_instance()' );
return self::get_instance();
}
/**
* Main instance.
*
* @return Shipping
*/
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Initialize.
*
* @return void
*/
public function init() {
if ( get_theme_mod( 'header_cart_shipping' ) ) {
add_action( 'flatsome_before_mini_cart_total', array( $this, 'free_shipping' ) );
}
if ( get_theme_mod( 'cart_shipping' ) ) {
add_action( 'woocommerce_before_cart_table', array( $this, 'free_shipping' ) );
}
if ( get_theme_mod( 'checkout_shipping' ) ) {
add_action( 'woocommerce_checkout_order_review', array( $this, 'free_shipping' ) );
}
}
/**
* Render free shipping html.
*
* @return void
*/
public function free_shipping() {
if ( ! WC()->cart->needs_shipping() || ! WC()->cart->show_shipping() ) {
return;
}
$free_shipping_threshold = 0;
$subtotal = WC()->cart->get_displayed_subtotal();
$classes = array( 'ux-free-shipping' );
$free_shipping_by_coupon = false;
$ignore_discounts = false;
// Check shipping packages.
$packages = WC()->cart->get_shipping_packages();
$package = reset( $packages );
$zone = wc_get_shipping_zone( $package );
foreach ( $zone->get_shipping_methods( true ) as $method ) {
if ( 'free_shipping' === $method->id ) {
$free_shipping_threshold = $method->get_option( 'min_amount' );
if ( in_array( $method->get_option( 'requires' ), array( 'min_amount', 'either', 'both' ), true ) ) {
$ignore_discounts = $method->get_option( 'ignore_discounts' ) === 'yes'; // Apply minimum order rule before coupon discount option.
}
}
}
// WPML.
if ( class_exists( 'woocommerce_wpml' ) && ! class_exists( 'WCML_Multi_Currency_Shipping' ) ) {
global $woocommerce_wpml;
$multi_currency = $woocommerce_wpml->get_multi_currency();
if ( ! empty( $multi_currency->prices ) && method_exists( $multi_currency->prices, 'convert_price_amount' ) ) {
$free_shipping_threshold = $multi_currency->prices->convert_price_amount( $free_shipping_threshold );
}
}
// Check coupons.
if ( $subtotal && wc_coupons_enabled() ) {
$coupons = WC()->cart->get_coupons();
foreach ( $coupons as $coupon ) {
if ( ! $coupon->is_valid() ) continue;
if ( $coupon->get_free_shipping() ) {
$free_shipping_by_coupon = true;
break;
}
$discount_amount = WC()->cart->get_coupon_discount_amount( $coupon->get_code(), WC()->cart->display_cart_ex_tax );
if ( ! $ignore_discounts && $subtotal >= $discount_amount ) {
$subtotal -= $discount_amount;
}
}
}
$free_shipping_threshold = apply_filters( 'flatsome_shipping_free_shipping_threshold', $free_shipping_threshold );
if ( ! $free_shipping_threshold ) {
return;
}
if ( $subtotal < $free_shipping_threshold && ! $free_shipping_by_coupon ) :
$percent = floor( ( $subtotal / $free_shipping_threshold ) * 100 );
?>
<div class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>">
<div class="ux-free-shipping__notice ux-free-shipping__notice--threshold">
<?php
$threshold = wc_price( $free_shipping_threshold - $subtotal );
printf(
/* translators: %s: The threshold */
esc_html__( 'Add %s to cart and get free shipping!', 'flatsome' ),
$threshold // phpcs:ignore WordPress.Security.EscapeOutput
);
?>
</div>
<div class="ux-free-shipping__bar ux-free-shipping__bar--striped">
<span class="ux-free-shipping__bar-progress" style="width:<?php echo $percent; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>%;"></span>
</div>
</div>
<?php else : // Success message. ?>
<div class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>">
<div class="ux-free-shipping__notice ux-free-shipping__notice--success"><?php esc_html_e( 'Your order qualifies for free shipping 🎉', 'flatsome' ); ?></div>
<div class="ux-free-shipping__bar ux-free-shipping__bar--striped">
<span class="ux-free-shipping__bar-progress" style="width:100%;"></span>
</div>
</div>
<?php
endif;
}
/**
* Fragments.
*
* @param array $fragments_array Fragments.
*
* @return array
*/
public function fragments( $fragments_array ) {
ob_start();
$this->free_shipping();
$fragments_array['div.ux-free-shipping'] = ob_get_clean();
return $fragments_array;
}
}