From 19713f8bc7688edcb7feb137672562f58e5d2969 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Tue, 19 Jul 2016 09:05:25 -0300 Subject: [PATCH] Improved free shipping method and fixed missing filters --- .../class-wc-shipping-free-shipping.php | 139 +++++++++++------- 1 file changed, 88 insertions(+), 51 deletions(-) diff --git a/includes/shipping/free-shipping/class-wc-shipping-free-shipping.php b/includes/shipping/free-shipping/class-wc-shipping-free-shipping.php index 815fe4da30e..a0cd732fb05 100644 --- a/includes/shipping/free-shipping/class-wc-shipping-free-shipping.php +++ b/includes/shipping/free-shipping/class-wc-shipping-free-shipping.php @@ -15,84 +15,118 @@ if ( ! defined( 'ABSPATH' ) ) { */ class WC_Shipping_Free_Shipping extends WC_Shipping_Method { - /** @var float Min amount to be valid */ + /** + * Min amount to be valid. + * + * @var integer + */ public $min_amount = 0; - /** @var string Requires option */ - public $requires = ''; + /** + * Requires option. + * + * @var string + */ + public $requires = ''; /** * Constructor. + * + * @param int $instance_id Shipping method instance. */ public function __construct( $instance_id = 0 ) { - $this->id = 'free_shipping'; - $this->instance_id = absint( $instance_id ); - $this->method_title = __( 'Free Shipping', 'woocommerce' ); - $this->method_description = __( 'Free Shipping is a special method which can be triggered with coupons and minimum spends.', 'woocommerce' ); - $this->supports = array( + $this->id = 'free_shipping'; + $this->instance_id = absint( $instance_id ); + $this->method_title = __( 'Free Shipping', 'woocommerce' ); + $this->method_description = __( 'Free Shipping is a special method which can be triggered with coupons and minimum spends.', 'woocommerce' ); + $this->supports = array( 'shipping-zones', 'instance-settings', 'instance-settings-modal', ); - $this->title = $this->get_option( 'title' ); - $this->min_amount = $this->get_option( 'min_amount', 0 ); - $this->requires = $this->get_option( 'requires' ); + $this->init(); + } + + /** + * Initialize free shipping. + */ + public function init() { + // Load the settings. + $this->init_form_fields(); + $this->init_settings(); + + // Define user set variables. + $this->title = $this->get_option( 'title' ); + $this->min_amount = $this->get_option( 'min_amount', 0 ); + $this->requires = $this->get_option( 'requires' ); + + // Actions. add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) ); } + /** + * Init form fields. + */ + public function init_form_fields() { + $this->instance_form_fields = array( + 'title' => array( + 'title' => __( 'Title', 'woocommerce' ), + 'type' => 'text', + 'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ), + 'default' => $this->method_title, + 'desc_tip' => true, + ), + 'requires' => array( + 'title' => __( 'Free Shipping Requires...', 'woocommerce' ), + 'type' => 'select', + 'class' => 'wc-enhanced-select', + 'default' => '', + 'options' => array( + '' => __( 'N/A', 'woocommerce' ), + 'coupon' => __( 'A valid free shipping coupon', 'woocommerce' ), + 'min_amount' => __( 'A minimum order amount', 'woocommerce' ), + 'either' => __( 'A minimum order amount OR a coupon', 'woocommerce' ), + 'both' => __( 'A minimum order amount AND a coupon', 'woocommerce' ), + ), + ), + 'min_amount' => array( + 'title' => __( 'Minimum Order Amount', 'woocommerce' ), + 'type' => 'price', + 'placeholder' => wc_format_localized_price( 0 ), + 'description' => __( 'Users will need to spend this amount to get free shipping (if enabled above).', 'woocommerce' ), + 'default' => '0', + 'desc_tip' => true, + ), + ); + } + /** * Get setting form fields for instances of this shipping method within zones. + * * @return array */ public function get_instance_form_fields() { wc_enqueue_js( " jQuery( function( $ ) { - $('#woocommerce_free_shipping_requires').change(function(){ + $( '#woocommerce_free_shipping_requires' ).change( function() { + var minAmountField = $( '#woocommerce_free_shipping_min_amount' ).closest( 'tr' ); if ( $(this).val() === 'coupon' || $(this).val() === '' ) { - $('#woocommerce_free_shipping_min_amount').closest('tr').hide(); + minAmountField.hide(); } else { - $('#woocommerce_free_shipping_min_amount').closest('tr').show(); + minAmountField.show(); } }).change(); }); " ); - return array( - 'title' => array( - 'title' => __( 'Title', 'woocommerce' ), - 'type' => 'text', - 'description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ), - 'default' => $this->method_title, - 'desc_tip' => true, - ), - 'requires' => array( - 'title' => __( 'Free Shipping Requires...', 'woocommerce' ), - 'type' => 'select', - 'class' => 'wc-enhanced-select', - 'default' => '', - 'options' => array( - '' => __( 'N/A', 'woocommerce' ), - 'coupon' => __( 'A valid free shipping coupon', 'woocommerce' ), - 'min_amount' => __( 'A minimum order amount', 'woocommerce' ), - 'either' => __( 'A minimum order amount OR a coupon', 'woocommerce' ), - 'both' => __( 'A minimum order amount AND a coupon', 'woocommerce' ), - ) - ), - 'min_amount' => array( - 'title' => __( 'Minimum Order Amount', 'woocommerce' ), - 'type' => 'price', - 'placeholder' => wc_format_localized_price( 0 ), - 'description' => __( 'Users will need to spend this amount to get free shipping (if enabled above).', 'woocommerce' ), - 'default' => '0', - 'desc_tip' => true - ) - ); + return parent::get_instance_form_fields(); } /** * See if free shipping is available based on the package and cart. - * @param array $package + * + * @param array $package Shipping package. * @return bool */ public function is_available( $package ) { @@ -127,19 +161,19 @@ class WC_Shipping_Free_Shipping extends WC_Shipping_Method { switch ( $this->requires ) { case 'min_amount' : $is_available = $has_met_min_amount; - break; + break; case 'coupon' : $is_available = $has_coupon; - break; + break; case 'both' : $is_available = $has_met_min_amount && $has_coupon; - break; + break; case 'either' : $is_available = $has_met_min_amount || $has_coupon; - break; + break; default : $is_available = true; - break; + break; } return apply_filters( 'woocommerce_shipping_' . $this->id . '_is_available', $is_available, $package ); @@ -147,12 +181,15 @@ class WC_Shipping_Free_Shipping extends WC_Shipping_Method { /** * Called to calculate shipping rates for this method. Rates can be added using the add_rate() method. + * * @uses WC_Shipping_Method::add_rate() + * + * @param array $package Shipping package. */ public function calculate_shipping( $package = array() ) { $this->add_rate( array( 'label' => $this->title, - 'cost' => 0, + 'cost' => 0, 'taxes' => false, 'package' => $package, ) );