Jak vytvořit vlastní dopravní metodu ve WooCommerce

Výchozí dopravní metody, které jsou ve WooCommerce k dispozici, nejsou vždy využitelné, pro konkrétní požadavky na dopravu zboží. Někdy si proto musíte vytvořit vlastní dopravní metodu.

Původně jsem sem chtěl jenom „plácnout“ hotovu třídu a hotovo. Lepší to ale bude vzít bod po bodu.

Vlastní dopravu vytvoříte tak, že si uděláte plugin, který bude obsahovat třídu dopravy.

Nejprve si musíte vytvořit soubor pluginu, můžete jej nazvat třeba custom-shipping.php a uložit jej do složky plugins.

Na začátek pluginu přidáte hlavičku, aby WordPress poznal, že jde o plugin:

/**
 * @wordpress-plugin
 * Plugin Name:       Custom shipping
 * Plugin URI:        
 * Description:       
 * Version:           1.0
 * Author:            
 * Author URI:        
 * Text Domain:       custom-shipping
 * License:           GPL-2.0+
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Domain Path:       /languages
 */

V druhém kroku přidáte funkci woocommerce_custom_shipping_init, která se bude přes hook plugin_loaded provádět po načtení pluginu a která obsahuje třídu custom dopravy. Na konec souboru přidáme funkci, pomocí které přidáme do pole dostupných doprav dopravní metodu. Klíč položky pole je id dopravy, hodnotou je název třídy.

function woocommerce_custom_shipping_init(){
	
	if ( !class_exists( 'WC_Shipping_Method' ) ) {
      	return;
	}

	if ( ! class_exists( 'WC_Custom_Shipping_Method' ) ) {
	
		class WC_Custom_Shipping_Method extends WC_Shipping_Method {
		
		}
	
	}

}
add_action('plugins_loaded', 'woocommerce_custom_shipping_init');

function add_woo_custom_shipping_method( $methods ) {
	$methods['custom'] = 'WC_Custom_Shipping_Method';
	return $methods;
}
add_filter( 'woocommerce_shipping_methods', 'add_woo_custom_shipping_method' );

Třetí krok je vytvoření konstruktoru.

V něm musíme definovat

  • id dopravy – musí odpovídat hodnotě ve funkci add_woo_custom_shipping_method
  • instance id – nastaví se automaticky při vytvoření objektu
  • název dopravy – zobrazeno v administraci
  • popis dopravy – zobrazeno v administraci
  • co doprava podporuje
  • vygenerujeme si formulář nastavení
  • povoleno nastavíme na ano
  • z option si načteme název dopravy – zobrazuje se na pokladně
  • popis dopravy- zobrazuje se na pokladně
  • dostupnost dopravy
  • na závěr akce pro uložení formuláře nastavení
/**
 * Constructor for your shipping class
 *
 * @access public
 * @return void
 */
public function __construct( $instance_id = 0 ) {

	$this->id                 = 'custom'; 
	$this->instance_id        = absint( $instance_id );
	$this->method_title       = __( 'Custom shipping', 'custom-shipping' );
	$this->method_description = __( 'Custom shipping for WooCommerce', 'custom-shipping' );
				
	$this->supports           = array(					
              'shipping-zones',							
              'instance-settings',								
              'instance-settings-modal',
	);

	$this->init_form_fields();

	$this->enabled            = "yes";
	$this->title              = $this->get_option( 'title' );
	$this->description        = $this->get_option( 'description' );
	$this->availability       = $this->get_option( 'availability' );
				
	add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
		
}

Přidáme formulář nastavení:

/**
 * Init form fields
 *
 * @access public
 */
public function init_form_fields() {
					
	$this->instance_form_fields = array(
		'enabled'     => array(
			'title'       => __( 'Enable', 'custom-shipping' ),
			'type' 	      => 'checkbox',
			'label'       => __( 'Enable custom shippng', 'custom-shipping' ),
			'default'     => 'yes',
		),
		'title'       => array(
			'title'       => __( 'Title', 'custom-shipping' ),
			'type'        => 'text',
			'description' => __( 'Method title', 'custom-shipping' ),
			'default'     => __( 'Custom shipping', 'custom-shipping' ),
		),
		'description' => array(
			'title'       => __( 'Description', 'custom-shipping' ),
			'type'        => 'text',
			'description' => __( 'Shipping description', 'custom-shipping' ),
			'default'     => __( 'Custom shipping for WooCommerce', 'custom-shipping' ),
		),
		'cost'        => array(
			'title'       => __( 'Price', 'custom-shipping' ),
			'type'        => 'text'
		),
	);

}

Tato metoda je jen jedno velké pole, kde každá položka je jedno formulářové políčko v administraci:

Takže, pokud budete chtít přidávat další nastavení, s kterým budete chtít v dopravě pracovat, stačí jen rozšířit toto pole.

K hodnotám se pak přistupuje přes $this->get_option( id_pole );

A nakonec vytvoříme dvě metody, které jsou velmi důležité, protože v nich budeme určovat, kolik doprava stojí a zda se může aktivně zobrazovat:

/**
 * Calculate_shipping function.
 *
 * @access public
 */
public function calculate_shipping( $package = array() ) {
								
	$cost = $this->get_option( 'cost' );
		
	$rate = array(
		'id' 		=> $this->id,
		'label' 	=> $this->title,
		'calc_tax'	=> 'per_order',
		'cost' 		=> $cost
	);

	$this->add_rate( $rate );           
		
}                
	
/**
 * Is available shipping
 *
 * @access public
 */                    
public function is_available( $package ) {
	
	if ( 'no' == $this->enabled ) {
		return false;
	}

	return apply_filters( 'woocommerce_shipping_' . $this->id . '_is_available', true, $package );
	
}

V těchto dvou metodách pak můžete udělat podmínky, kdy se má doprava zobrazovat, zda se bude měnit její cena, na základě hmotnosti a podobně.

Jakmile to celé poskládáme – kompletní kód nejdete zde https://github.com/Musilda/woocommerce-custom-shipping/blob/main/custom-shipping.php a nahrajete soubor do složky plugins, zobrazí se vám v plugine pro aktivaci.

Nastavíte stejně jako každou jinou dopravu a máte ji k dispozici na pokladně:

A to je vše. Nyní máte vytvořenou vlastní dopravu, kterou můžete upravovat jak budete chtít. Pro vytvoření další dopravy, stačí vzít třídu, zduplikovat ji a změnit její název a id.

V případě, že budete potřebovat pomoci s implementací vlastní custom dopravy, napište mi na musilda@musilda.cz.

About The Author

Zajímá mne Wordpress, responsivní šablony a zkrátka vše kolem tohoto skvělého redakčního systému.

Související články

1 Comments

  1. Marek Klusák

    V návodu je jedna drobná nepřesnost – „popis dopravy – zobrazuje se na pokladně“ … toto bohužel neplatí. A přitom by se taková dovysvětlující informace k volbě dopravy opravdu hodila (nějaké instrukce, …). Moje řešení je hooknout se na `woocommerce_after_shipping_rate` a popisek či cokoli jiného vypsat svou funkcí, ale i to bylo kupodivu hodně komplikované, protože jsem nenašel způsob, jak se dostat k proměnným oné instance dopravní metody, a to pokud možno nějak elegantně … nakonec mám funkční řešení, kdy si načtu ona data přímo z wp_options. Popsáno zde: https://stackoverflow.com/questions/44042952/how-to-add-custom-description-field-in-shipping-methods-backend/64064609#64064609

    Odpověď

Přidejte komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *