WP Cron a Action Scheduler jsou dva způsoby, jak ve WordPressu plánovat úlohy. První z nich je obsažený ve WordPressu a druhý je distribuován s WooCommerce.
O to com co je a jak funguje WP Cron jsem již psal dříve. Dnes se podíváme, jak funguje Action Scheduler.
Scheduled Actions
V případě, že používáte WooCommerce, mohli jste od jisté verze zaznamenat v Nástrojích novou položku nazvanou Scheduled actions.
WooCommerce ji používá na naplánování úloh, které chce v budoucnu provést. V některém z dalších článcích budu psát o lookup tabulkách produktů, v kterých jsou nově uložena data produktů.
Ta byla původně v postmeta tabulce a vývojáři WooCommerce se rozhodli, přesunout tato data do vlastní tabulky.
Určitě jste po aktualizaci zaznamenali upozornění, že je třeba provést aktualizaci databáze WooCommerce a když jste aktualizaci spustili, zobrazilo se info, že aktualizace bude probíhat na pozadí.
Pokud by jste se v tu chvíli podívali do Scheduled actions, viděli by jste seznam naplánovaných úloh, s aktualizacemi dat produktů, nastavených na dávky. Tím WooCommerce dosáhla toho, že přesun dat probíhal postupně a výkon e-shopu to nijak neovlivnilo.
Action Scheduler
Když si ve WooCommerce pluginu otevřete složku includes/libraries, najdete knihovnu scheduleru. Kromě toho, že je knihovna distribuována s Woo, můžete ji použít jako samostatnou knihovnu do svého pluginu, nebo jako plugin a ve vlastních pluginech, nebo šabloně jenom plánovat úlohy.
K čemu se dá scheduler využít? WooCommerce přes něj plánuje opakované platby, aktualizace stavu objednávek, e-maily, které se mají odeslat s nějakou prodlevou, nebo aktualizace databáze po updatu.
Instalace scheduleru
Scheduler je dostupný na GitHubu, kde si můžete stáhnout zip soubor s releasem, který potřebujete – https://github.com/woocommerce/action-scheduler/releases. Pak stačí aktivovat jako obyčejný WordPress plugin.
Další možností je vložit knihovnu do pluginu, nebo šablony. Knihovnu pak musíte v kódu inicializovat:
require_once( plugin_dir_path( __FILE__ ) . '/libraries/action-scheduler/action-scheduler.php' );
Protože action scheduler zaregistruje sám sebe do hooku plugins_loaded s prioritou 0, vy musíte zavěsit require souboru do plugins_loaded před prioritu 0, například -10 ( negativní priorita ).
Použití scheduleru
Použití je podobné, jako použití WP Cron úlohy. Kompletní přehled najdete zde https://actionscheduler.org/api/ , my si ukážeme příklad a naplánujeme si odeslání e-mailu za 10 minut od vytvoření tasku.
Nejprve zaregistrujeme úlohu:
as_schedule_single_action( time() + 600, 'musilda_scheduled_mail_action', array( 'message' => $message ) );
Tato funkce vytvoří task, který se provede jednou, někdy v budoucnu. Například as_schedule_reccuring_action vytváří opakované úlohy.
Funkce přijímá čtyři argumenty
- $time – termín provedení úlohy
- $hook – akci, do které zavěsíme callback
- $args – hodnoty, které chceme předat do callbacku
- $groups – zde nepoužijeme, jde jen o sdružování úloh do skupin
Zaregistrujeme hook s callbackem:
add_action( 'musilda_scheduled_mail_action', 'musilda_scheduled_mail', 10, 1 );
Vytvoříme callback:
function musilda_scheduled_mail( $message ){
mail( 'musilekmail@seznam.cz', 'Scheduler test', $message );
}
Celý kód:
function musilda_scheduled_mail( $message ){
mail( 'musilekmail@seznam.cz', 'Scheduler test', $message );
}
add_action( 'musilda_scheduled_mail_action', 'musilda_scheduled_mail', 10, 1 );
$message = 'Test e-mailu.';
as_schedule_single_action( time() + 600, 'musilda_scheduled_mail_action', array( 'message' => $message ) );
Následně se nám úloha zobrazí ve Scheduled actions:
A do e-mailové schránky přijde e-mail:
Proč používat Action Scheduler?
První otázka která vás napadne, bude, proč to používat? Vždyť WordPress má WP Cron.
To je pravda, ale scheduler byl vyvinut s ohledem na výkon. Díky tomu, že jej používá WooCommerce, má grafické rozhraní, které WP Cron nemá a je určen k provádění množství náročných úloh, bez toho, aby to významně omezovalo chod webu.
Oproti běžnému WordPress webu, je e-shop poměrně rozsáhlý, nezřídka s deseti tisíci položkami, tisíci objednávkami a množstvím obrázků.
Action scheduler nespustí další úlohu pokud:
- je paměť využita více než z 90ti %
- by zpracování následujích tří úloh mělo překročit 30 vteřin požadovaného času
Zvýšení časového limitu
Scheduler umožňuje pomocí action_scheduler_queue_runner_time_limit
zvýšit time limit, ale i tak jste omezení nastavením php na vašem serveru (hostingu).
Zvýšení délky dávky
Vy výchozím nastavení pouští scheduler dávky o délce 25 úloh. V případě, že víte, že vaše úlohy jsou drobného rázu, můžete zvýšit délku dávky pomocí action_scheduler_queue_runner_batch_size
.
Také je k dispozici možnost spouštět souběžně více dávek, což v základu nelze. To ale může mít dopad na výkon vašeho webu. takže s tím opatrně.
Ukládání dat úloh
Věčným tématem WordPressu je jeho databáze a ukládání dat. Scheduler vychází z návrhu data storage WooCommerce 3.+, takže jsou všechna data ukládána do zvláštních tabulek a nemusíte mít starost se zaplňováním tabulek, jako jsou post, postmeta a options. Data storage třídy navíc umožňují přepsat umístění dat, takže si můžete vytvořit i vlastní tabulky, ale myslím si, že to je zbytečné.