Вітаю, шановні читачі блогу!
Пропоную трохи розширити наші знання у сфері програмування під WordPress і розглянути в цій статті тему взаємодії плагінів із базою даних.
«З коробки» сам WP має непогані можливості. Я маю на увазі створення власних таксономій, термінів тощо, а також прив'язку до них додаткової інформації на базі метаданих. Це дуже зручно, оскільки, написавши з десяток функцій, можна не хвилюватися про створення інтерфейсу і навіть деяку внутрішню логіку застосунку.
Але мені, як «новачку» у WordPress, більш звично працювати зі строго структурованими таблицями. Тому в цій статті пропоную розглянути саме такий варіант — на прикладі одного з моїх плагінів «my-simple-form», трохи його спростивши.
Ініціалізація даних
Як і слід було очікувати, інформацію про ініціалізацію даних ми розмістимо у головному файлі модуля «my-simple-form.php». Тобто в тому, де розміщено коментар, який описує плагін.
if(is_admin() == TRUE)
{
register_activation_hook(__FILE__, 'Plance_MSF_DB::activate');
register_uninstall_hook(__FILE__, 'Plance_MSF_DB::uninstall');
register_deactivation_hook(__FILE__, 'Plance_MSF_DB::uninstall');
}
Виклики методів ініціалізації бази даних ми розміщуємо в умовному операторі `if` і лише для адміністратора, адже в інших умовах це не має сенсу.
У моєму випадку, клас `Plance_MSF_DB` дуже простий і містить два методи:
- activate — викликається при встановленні плагіна. Тут створюються необхідні таблиці в БД, а також, при потребі, опції, метадані, ролі тощо.
- uninstall — викликається при видаленні або деактивації плагіна.
Зверну увагу на те, що метод `Plance_MSF_DB::uninstall` викликається як для хука `register_uninstall_hook`, так і для `register_deactivation_hook`. Це означає, що плагін буде видалятися як при деактивації, так і при повному видаленні з системи. Чесно кажучи, вже не пам’ятаю, чому я так зробив, але в цьому випадку хук `register_deactivation_hook` можна було б і прибрати.
Нижче — «каркас» класу:
class Plance_MSF_DB
{
/**
* Активація плагіна
*/
public static function activate()
{
return TRUE;
}
/**
* Видалення плагіна
*/
public static function uninstall()
{
return TRUE;
}
}
Вважаю, що тут усе зрозуміло і додаткових пояснень не потрібно.
Розглянемо метод, який виконується при встановленні плагіна:
public static function activate()
{
global $wpdb;
require_once(ABSPATH.'wp-admin/includes/upgrade.php');
/* пропущений код */
add_option('plance_msf_notification', array(
'admin_email' => get_bloginfo('admin_email'),
'admin_name' => 'Administrator',
'noreply_email' => get_bloginfo('admin_email'),
'noreply_name' => get_bloginfo('blogname'),
'shortcode_name' => 'plance-msf-form',
'message_subject' => 'Email from Your Site',
'message_template' => '….',
'flash_message' => '',
));
dbDelta("CREATE TABLE IF NOT EXISTS `{$wpdb -> prefix}plance_msf_user` (
`id` INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(40) NULL,
`surname` VARCHAR(40) NULL,
`patronymic` VARCHAR(40) NULL,
`company` VARCHAR(100) NULL,
`birthday` INT(10) UNSIGNED NULL,
`phone` VARCHAR(25) NULL,
`email` VARCHAR(80) NULL,
`messenger` VARCHAR(30) NULL,
`site` VARCHAR(100) NULL,
`country` VARCHAR(30) NULL,
`city` VARCHAR(30) NULL,
`address` VARCHAR(100) NULL,
`credit_card` VARCHAR(20) NULL,
`sum` VARCHAR(10) NULL,
`comment` TEXT NULL,
`image` VARCHAR(20) NULL,
`file` VARCHAR(20) NULL,
`radio` VARCHAR(100) NULL,
`select` VARCHAR(100) NULL,
`checkbox` TINYINT(1) UNSIGNED NULL,
`date_create` INT(10) UNSIGNED NOT NULL
) {$wpdb -> get_charset_collate()};");
return TRUE;
}
Пояснення до коду:
1. Підключаємо глобальну змінну `$wpdb` — вона потрібна для отримання префіксу таблиць і кодування.
2. Імпортуємо файл `wp-admin/includes/upgrade.php`, щоб мати змогу використовувати функцію `dbDelta`.
3. Використовуємо `add_option` для збереження глобальних налаштувань плагіна в таблиці `wp_options`.
Приклад:
add_option('plance_msf_notification', array(
'admin_email' => get_bloginfo('admin_email'),
'admin_name' => 'Administrator',
'noreply_email' => get_bloginfo('admin_email'),
'noreply_name' => get_bloginfo('blogname'),
'shortcode_name' => 'plance-msf-form',
'message_subject' => 'Email from Your Site',
'message_template' => $message_template,
'flash_message' => '',
));
де:
- `'plance_msf_notification'` — ім’я опції
- `array(...)` — масив параметрів. Хоч можна передавати і рядок чи число, я зазвичай використовую масив — це зручно, коли всі налаштування плагіна зберігаються в одному місці. Хоча є ситуації, коли вигідніше розділяти.
Далі йде функція `dbDelta`:
dbDelta("CREATE TABLE IF NOT EXISTS `{$wpdb -> prefix}plance_msf_user` (
...
) {$wpdb -> get_charset_collate()};");
Все просто — дамп створення таблиці.
З методом активації розібралися. Тепер розглянемо метод видалення:
public static function uninstall()
{
global $wpdb;
$wpdb -> query("DROP TABLE IF EXISTS `{$wpdb -> prefix}plance_msf_user`");
delete_option('plance_msf_notification');
return TRUE;
}
Метод `$wpdb->query(...)` — видаляє таблицю з бази.
Функція `delete_option` — видаляє опцію з таблиці `wp_options`.
Ось і все.
