Tento snippet, podobně, jako ostatní, vznikl z potřeby vyřešení problému. Konkrétně bylo nutné ze šablony přenést funkce do pluginu a zajistit, aby se nahrál, jako poslední.
Proč poslední?
Protože, pokud píšete plugin, jenž má upravovat fungování, nebo zobrazování jiného pluginu, může se stát, že globální proměnné, nebo konstanty, nejsou dostupné.
Tento případ nastane, pokud je váš plugin načten dříve, než ten „zdrojový“.
Aby jsme náš plugin načetli poslední, musíme změnit pole, v option active_plugins.
Nejprve vytvoříme path našeho pluginu:
$path = str_replace( WP_PLUGIN_DIR . '/', '', __FILE__ );
WordPress totiž ukládá aktivní plugin do pole, kde hodnoty pole jsou složka pluginu + název hlavního souboru pluginu:
muj-plugin/muj-plugin.php
Nyní musíme načíst seznam aktivních pluginů:
$plugins = get_option( 'active_plugins' );
Protože vím, že plugin je aktivní a je uložen v poli, najdeme jeho klíč:
$key = array_search( $path, $plugins );
Protože jsme získali klíč, záznam smažeme:
array_splice( $plugins, $key, 1 );
Vezmeme náš $path a „přilepíme“ ho na konec pole, jako poslední záznam:
$plugins[] = $path;
A nakonec přeuložíme option:
update_option( 'active_plugins', $plugins );
Celá funkce pak vypadá následovně:
function my_plugin_load_last() { $path = str_replace( WP_PLUGIN_DIR . '/', '', __FILE__ ); if ( $plugins = get_option( 'active_plugins' ) ) { if ( $key = array_search( $path, $plugins ) ) { array_splice( $plugins, $key, 1 ); $plugins[] = $path; update_option( 'active_plugins', $plugins ); } } }
A samozřejmě, musíme funkci „zavěsit“ do příslušného hooku:
add_action( 'activated_plugin', 'my_plugin_load_last' );
Tím jsme docílil, že se náš plugin načte až úplně poslední.