Detekce existence WooCommerce

Kdykoliv píšete nějaký kód, u kterého jeho funkčnost závisí na kódu třetí strany, musíte počítat s tím, že nebude dostupný. Proto je nezbytné u kódu pro WooCommerce řešit to, zda je vůbec plugin nainstalován a aktivní.

Zase nejde o nic složitého, ideální pro ukázku bude nějaký plugin, který si vyrobíme.

Vzal jsem kód ze včerejšího návodu https://musilda.cz/jak-vytvorit-vlastni-typ-produktu/ a udělal z něj malý plugin.

Bohužel, je plně závislý na WooCommerce, takže při pokusu o aktivaci se stane toto:

To je ta lepší varianta, plugin nejde aktivovat. V případě, že je již aktivní a někdo vypne WooCommerce, chyba sundá celý web. A tomu teď zabráníme.

Můžeme použít dvě PHP funkce:

  • class_exists
  • function_exists

Pokaždé, když se WooCommerce načte, tak se použije třída woocommerce a objekt je přístupný přes funkci WC().

Takže můžete psát:

if ( class_exists( 'woocommerce') ) {
    //váš kód
} 

nebo



if ( function_exists( 'WC') ) {
    //váš kód
}

Tento postup se ale hodí do šablon, nebo do funkcí, které jsou zaregistrovány v nějakém hooku. Nezaručují vám totiž, že v tu chvíli, kdy se WordPress dostane k vašemu kódu, je již WooCommerce načtená, i když je na webu aktivní.

Na webech dost často najdetenásledující kód:

include_once(ABSPATH . 'wp-admin/includes/plugin.php');
if (is_plugin_active('woocommerce/woocommerce.php')) {
    //váš kód
}

Což také funguje (všimněte si vložení souboru plugin.php, který je normálně dostupný jen v adminu), ale opět, je zde jeden problém.

Plugin sice může být aktivní, ale WordPress načítá plugin podle abecedy a když máte nějakou třídu, která je extended třídy ve WooCommerce, nemusí být tato třída ještě načtená.

Čtěte  Jak upravit počet souvisejících produktů ve WooCommerce

Takže tuto funkci použijeme pro zobrazení notice v adminu, ale pro plugin potřebujeme jiný postup.

WooComerce má akci, která se jmenuje woocommerce_loaded a tu použijeme pro načtení našeho kódu.

Nejprve tedy informaci o tom, že WooCommerce není aktivní:

include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( !is_plugin_active( 'woocommerce/woocommerce.php' ) ) {

	/**
	 * Admin notice
	 * 
	 * @since 1.0
	 */
	add_action('admin_notices', 'musilda_admin_notice_wc_not_active');
  	function musilda_admin_notice_wc_not_active() {
    	$class = 'notice notice-error';
    	printf(
      		'<div class="error" style="background:red; color:#fff;"><p>%s</p></div>',
      		__( 'You Must Install WooCommerce Plugin before activating EventPress ', 'musilda-eventpress' )
    	);
  	}
  
}

Plugin již jde activovat, ale v adminu se nám zobrazí krásná hláška:

Takže tohle máme vyřešené, ale co s kódem, který bude v pluginu?

Uzavřeme jej do takovéto funkce:

/**
 * Load plugin code, when WooCommerce is loaded
 * 
 * @since 1.0
 */
add_action( 'woocommerce_loaded', 'load_eventpress' );
function load_eventpress() {
     //vás kód
}

Tím je zajištěno, že vše co je potřeba pro fungování pluginu bude načteno až když bude načten kód WooCommerce a vše nám bude bezpečně fungovat:

Protože si s pluginem budeme trochu hrát v dalších návodech, vytvořil jsem veřejný repositář, kde bude celý kód dostupný https://github.com/Musilda/musilda-eventpress

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

Přidejte komentář

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