Skip to content

Instantly share code, notes, and snippets.

@mikejolley
Last active September 5, 2018 10:59
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save mikejolley/6713608 to your computer and use it in GitHub Desktop.
Save mikejolley/6713608 to your computer and use it in GitHub Desktop.
WooCommerce Shipping Method Skeleton Plugin
<?php
/*
Plugin Name: Your Shipping plugin
Plugin URI: http://woothemes.com/woocommerce
Description: Your shipping method plugin
Version: 1.0.0
Author: WooThemes
Author URI: http://woothemes.com
*/
/**
* Check if WooCommerce is active
*/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
function your_shipping_method_init() {
if ( ! class_exists( 'WC_Your_Shipping_Method' ) ) {
class WC_Your_Shipping_Method extends WC_Shipping_Method {
/**
* Constructor for your shipping class
*
* @access public
* @return void
*/
public function __construct() {
$this->id = 'your_shipping_method'; // Id for your shipping method. Should be uunique.
$this->method_title = __( 'Your Shipping Method' ); // Title shown in admin
$this->method_description = __( 'Description of your shipping method' ); // Description shown in admin
$this->enabled = "yes"; // This can be added as an setting but for this example its forced enabled
$this->title = "My Shipping Method"; // This can be added as an setting but for this example its forced.
$this->init();
}
/**
* Init your settings
*
* @access public
* @return void
*/
function init() {
// Load the settings API
$this->init_form_fields(); // This is part of the settings API. Override the method to add your own settings
$this->init_settings(); // This is part of the settings API. Loads settings you previously init.
// Save settings in admin if you have any defined
add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
}
/**
* calculate_shipping function.
*
* @access public
* @param mixed $package
* @return void
*/
public function calculate_shipping( $package ) {
$rate = array(
'id' => $this->id,
'label' => $this->title,
'cost' => '10.99',
'calc_tax' => 'per_item'
);
// Register the rate
$this->add_rate( $rate );
}
}
}
}
add_action( 'woocommerce_shipping_init', 'your_shipping_method_init' );
function add_your_shipping_method( $methods ) {
$methods['your_shipping_method'] = 'WC_Your_Shipping_Method';
return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_your_shipping_method' );
}
@Sunsvision
Copy link

Hello! Great! thanks for this! Just one question. When i activated this plugin i saw the "Your Shipping Method (Free!)" in woocommerce_checkout page. How to remove "(Free!)" from the shipping option title?

@keyrise
Copy link

keyrise commented Mar 27, 2014

Genius! Saved my bacon today.

@boutzamat
Copy link

Uhm.. tried to use this plugin but no options was available? The method appears correct, but when i go to change the settings (i.e. price of method) its empty...

@harisrozak
Copy link

Please update this example for WooCommerce 2.6.0

@rpocc
Copy link

rpocc commented Jul 9, 2016

Check out my fork:
https://gist.github.com/rpocc/06f63d9383b5e742705e921e8e46f193

It it compatible with WooCommerce 2.6.0

Some Shipping Class-related code was just copied from Flat Rate shipping method, but initialization of the class is also different.

  1. Initialization functions should be inside a class
  2. Nested classes are not supported by php and because of that you need to use separate files
  3. shipping method is now being kept not in a simple indexed array, but in keyed array.

I'm a third-party developer and can't explain everything I've done, but empirically I've managed to make my own plug-in work using very similar code. I hope my additions will help to update almost any good shipping method plugin before official updated example will appear.

Dmitry Shtatnov.

@alordiel
Copy link

Hi @mikejolley, there are a few changes that have to be made to this code to work. Could you please update whenever you have the time. Here are the updates that need to be done:

  1. There should be an argument passed to the constructor like __construct( $instance_id = 0 ) and then in the body of the constructor: $this->instance_id = absint( $instance_id );

  2. Also the calculate_shipping method should be with predefined argument as so: public function calculate_shipping( $package = array())

  3. If you would like to have option to edit your shipping method from a single settings page, or to see it in the options with the other shipping methods in the shipping zone page you will need to add in the constructor the following code:

$this->supports = array(
         'shipping-zones',//make your shipping method available for the shipping zones
         'settings', //use this for separate settings page
         'instance-settings', //add options for to edit the settings of your shipping method for a single zone
         'instance-settings-modal',
       );

For everyone interest in full working demo, please check here.

@owlyowl
Copy link

owlyowl commented Apr 29, 2018

I was wondering how to get a shipping method to just appear under zones under the shipping zones section and not as a separate section

The reason I ask is because this shows up in my list of shipping options
uk1

And I'd only like the shipping zones options to appear not the UK Flat Rate as well?

Is that possible?

@watcharametm2spop
Copy link

Many thanks, Alordiel.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment