Активація/деактивація плагіна
Хуки для активації та деактивації плагіна WordPress забезпечують виконання PHP дій, коли плагін активується або деактивується, а також є хук для видалення плагіна, але він трохи відрізняється від поточних і про нього поговоримо в іншому розділі.
При активації зазвичай потрібно запустити процедуру встановлення плагіна, щоб, наприклад:
- додати опції (налаштування) за замовчуванням
- встановити таблиці бази даних
- додати правила ЧПУ
- створити директорії
- і т.д.
При деактивації зазвичай очищають тимчасові дані:
- кеш у часових опціях
- файли у тимчасових каталогах. Наприклад, плагін сторінки кешування WP Super Cache при дезактивації видаляє всі створені файли кеша.
Хук деактивації іноді плутають із хуком деінсталяції (видалення) , проте це зовсім різні хуки, вони працюють по-різному і сфера їх застосування теж різна. При видаленні зазвичай видаляються всі дані плагіна, включаючи опції, таблиці БД і т.д. Про деінсталяцію всі дані видаляються, процедура включення хука інша про неї ми ще поговоримо…
Щоб викликати PHP функцію під час активації, використовуйте register_activation_hook() в основному файлі плагіна:
register_activation_hook( __FILE__, 'myplugin_activation');
Щоб викликати PHP функцію при деактивації, використовуйте register_deactivation_hook() , також в основному файлі плагіна:
register_deactivation_hook( __FILE__, 'myplugin_function_to_run');
Перший параметр у кожній функції – це шлях до основного файлу плагіна – це файл із заголовками плагіна .
Як правило, ці функції викликаються в основному файлі плагіна . Якщо функції поміщаються в інший файл, необхідно змінити перший параметр, вказавши в ньому шлях до основного файлу плагіна. Це можна зробити попередньо зберігши шлях, наприклад, до константи.
Як працює активація
Плагін активується функцією activate_(plugin) .
Функція activate_plugin() в ядрі викликається після завантаження середовища ВП . Ця функція підключає головний файл плагіна (і все, що в ньому вказано), а потім через хук активує вказану callback-функцію. За рахунок цього в нашій callback-функції доступні всі функції та класи плагіна. Але оскільки всі основні хуки WP вже спрацювали під час завантаження середовища ВП, то ніякі події плагіна повішені на хуки, наприклад plugins_loaded
, вже не спрацюють при підключенні головного файлу плагіна. Отже наш плагін буде підключений, але не повністю: не так як він повинен підключатися, коли вже активований.
Так, наприклад, якщо плагін робить щось під час події plugins_loaded , всі ці дії просто не відбудуться при активації плагіна. Наприклад, якщо він підключає файл перекладу, файл перекладу не буде підключений в момент спрацювання callback-функції вказаної для register_activation_hook() .
Як правило, після спрацювання callback-функції є дві події на які можна повісити функції: shutdown .
Щоб зробити щось неординарне під час активації плагіна, дивіться приклад 5 .
Приклад активації плагіна
Одним із найпоширеніших випадків для хука активації – це оновлення налаштувань ЧПУ WordPress за допомогою flush_rewrite_rules() , коли плагін реєструє довільний тип запису. Це дозволяє позбутися неприємних помилок 404. Давайте подивимося на прикладі:
add_action( 'init', 'myplugin_setup_post_type'); function myplugin_setup_post_type(){ // Реєструємо тип запису "book" register_post_type('book', array( 'public' => 'true' ))); } register_activation_hook( __FILE__, 'myplugin_install'); function myplugin_install(){ // Запускаємо функцію реєстрації типу запису myplugin_setup_post_types(); // Скидаємо налаштування ЧПУ, щоб вони перетворювалися з новими даними flush_rewrite_rules(); }
Якщо ви не знайомі з реєстрацією довільних типів записів, прочитайте опис функції register_post_type() .
Активація плагіна для мережі Мультисайт
Досить часто при активації плагіна потрібно щось додати до БД сайту. Але в такому випадку активація плагіна для мережі сайтів зводиться до того, що потрібно зробити одне і для всіх сайтів мережі. Автоматично register_activation_hook() цього не робить.
Тому для мережі сайтів вам потрібно буде при активації плагіна пройтися по всіх сайтах мережі і зробити з кожним сайтом те, що потрібно зробити при активації:
register_activation_hook( __FILE__, 'my_plugin_activate' ); function my_plugin_activate( $network_wide ){ // require_once ABSPATH. 'wp-admin/includes/upgrade.php'; if( is_multisite() && $network_wide ){ Global $wpdb; foreach( $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs") as $blog_id ){ switch_to_blog($blog_id); _activate_plugin_for_site(); restore_current_blog(); } } else { _activate_plugin_for_site(); } } function _activate_plugin_for_site(){ // код активації для кожного сайту }
Також потрібно врахувати, що при створенні чергового сайту мережі його також потрібно опрацювати. Для цього проводимо процедуру активації плагіна під час створення сайту мережі:
add_action( 'wp_initialize_site', 'my_plugin_new_blog', 10, 2); function my_plugin_new_blog( $new_site, $args ){ // Замініть на базове ім'я вашого плагіна. Пр.: dirname/filename.php if( is_plugin_active_for_network( 'my-plugin-dir/my-plugin-name.php' ) ) { switch_to_blog( $new_site->site_id ); // Тут робимо що потрібно при активації... restore_current_blog(); } }
Якщо потрібний такий функціонал для всіх плагінів, які активуються мережею (а не тільки для того, що ви розробляєте), зверніть увагу на плагін Proper Network Activation . Він робить так, що register_activation_hook та register_deactivation_hook будуть запущені для кожного сайту мережі у контексті цього сайту.
Приклад деактивації плагіна
Тепер при деактивації нам потрібно знову скинути правила ЧПК, тому що при деактивації наш тип запису буде видалено. Тобто. це зворотний процес тому, що був вищим при активації:
register_deactivation_hook( __FILE__, 'myplugin_deactivation' ); function myplugin_deactivation() { // Тип запису не реєструється, отже він автоматично видаляється - його потрібно видаляти якось ще. // Скидаємо налаштування ЧПУ, щоб вони перетворювалися з новими даними flush_rewrite_rules(); }
–
Більше прикладів, як правильно використовувати функції активації/деактивації, дивіться в описі цих функцій:
Функція видалення плагіна
Крім активації та деактивації, важливим моментом є видалення плагіна. Підключитись до цього процесу можна через функцію
- register_uninstall_hook() – потрібна при видаленні плагіна.
Докладніше про те як правильно видаляти плагіни читайте у спеціальній статті .