-
-
Save BFTrick/d4a21524a8f7b25ec296 to your computer and use it in GitHub Desktop.
| <?php | |
| /** | |
| * Plugin Name: WooCommerce Enable Free Shipping on a Per Product Basis | |
| * Plugin URI: https://gist.github.com/BFTrick/d4a21524a8f7b25ec296 | |
| * Description: Enable free shipping for certain products | |
| * Author: Patrick Rauland & eugenf | |
| * Author URI: http://speakinginbytes.com/ | |
| * Version: 1.0.2 | |
| * | |
| * This program is free software: you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| * the Free Software Foundation, either version 3 of the License, or | |
| * (at your option) any later version. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU General Public License | |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| * | |
| */ | |
| if ( ! class_exists( 'WC_Enable_Free_Shipping' ) ) : | |
| class WC_Enable_Free_Shipping { | |
| protected static $instance = null; | |
| /** | |
| * Initialize the plugin. | |
| * | |
| * @since 1.0 | |
| */ | |
| private function __construct() { | |
| // add our check | |
| add_filter( 'woocommerce_shipping_free_shipping_is_available', array( $this, 'patricks_enable_free_shipping' ), 20 ); | |
| } | |
| /** | |
| * Enable free shipping for orders with products that have the free-shipping shipping class slug | |
| * | |
| * @param bool $is_available | |
| * @return bool | |
| * @since 1.0 | |
| */ | |
| public function patricks_enable_free_shipping( $is_available ) { | |
| global $woocommerce; | |
| // set the shipping classes that are eligible | |
| $eligible = array( 'free-shipping' ); | |
| // get cart contents | |
| $cart_items = $woocommerce->cart->get_cart(); | |
| // loop through the items checking to make sure they all have the right class | |
| foreach ( $cart_items as $key => $item ) { | |
| if ( ! in_array( $item['data']->get_shipping_class(), $eligible ) ) { | |
| // this item doesn't have the right class. return default availability | |
| return $is_available; | |
| } | |
| } | |
| // nothing out of the ordinary return true | |
| return true; | |
| } | |
| /** | |
| * Return an instance of this class. | |
| * | |
| * @return object A single instance of this class. | |
| * @since 1.0 | |
| */ | |
| public static function get_instance() { | |
| // If the single instance hasn't been set, set it now. | |
| if ( null == self::$instance ) { | |
| self::$instance = new self; | |
| } | |
| return self::$instance; | |
| } | |
| } | |
| add_action( 'init', array( 'WC_Enable_Free_Shipping', 'get_instance' ), 0 ); | |
| endif; |
Hi,
This looks just what I need. I have tried to install following the dowload zip file, unzip and install routine but get the following message
"The package could not be installed. PCLZIP_ERR_BAD_FORMAT (-10) : Unable to find End of Central Dir Record signature"
I'm afraid I'm not terribly tech savvy so don't know how to fix it, could someone help please.
Thanks
Stewart
I'm a novice and just implemented the code - it worked great! If I were to add a Shipping zone as an additional condition (i.e. only perform the per product "free shipping" function when the Shipping Zone is U. and the product is marked as free-shipping? if anyone has a suggestion I'm all ears..
I can't get this to work. I have free shipping zone for US orders, and a condition for coupon or minimum spend. I only have 2 products with the free-shipping shipping class. But the free shipping option shows up for all products above the minimum spend. Am I doing something wrong?
Is this suitable for use with Woo/Shipping Zones? I cannot seem to find the right combination of settings to enable the free shipping on a per product basis. When I add Free Shipping to the zone I live in, I cannot see the proper Free Shipping choice that uses the slug I added (product-specific-free-shipping). Ant ideas?