Дана стаття в першу чергу для розробників плагінів чи тих, хто планує ними стати 🙂

Як на мене, плагіни, які після деактивації видаляють за собою увесь створений ними хлам в базі даних вашого сайту – це просто найкращі та найохайніші плагіни для WordPress. На просторах інтернет є безліч статей про те, як оптимізувати базу даних сайту на WordPress, видаливши з неї купу різноманітних даних, які нікому не потрібні. А існують ці статті не в останню чергу завдяки тому, що протягом життєвого циклу вашого сайту на WordPress ви користуєтесь, тестуєте, вмикаєте та вимикаєте, встановлюєте та видаляєте безліч різноманітних плагінів для покращення функціональності вашого проекту. Більшість цих плагінів в процесі роботи з ними записують свої налаштування та інші тимчасові чи не тимчасові данні у базу вашого сайту, а після деактивації та видалення ці дані залишаються там мертвим грузом.

Про що ми сьогодні напишемо:

Що це за файл?

Якщо ви додасте в кореневу папку вашого плагіну файл uninstall.php – то коли користувач спробує “Видалити” ваш плагін через адмін-панель сайту в меню “Плагіни”, вордпрес спочатку виконає код з цього файлу. Такий стан речей дозволить вам, як розробнику плагіна, провести певні дії, зокрема “підчистити” за собою.

Додаткову інформацію про цей механізм можна знайти в офіційній документації:

Що треба вписати у файл?

На просте питання має бути проста відповідь – вписуйте, що завгодно 🙂 . Мінімальне вимога, чи може більше порада – впишіть на початку такий код, аби захистити файл від несанкціонованого запуску:


            <?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;Code language: HTML, XML (xml)

Видалення опцій

Від жартів перейдемо до якихось серйозніших прикладів. Першим прикладом буде те, як можна під час видалення плагіну видалити збережені ним опції з таблиці опцій. В найпростішому варіанті це буде виглядати так:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// видалити опції
delete_option('myplugin_options');Code language: HTML, XML (xml)

Видалення тимчасових даних

Для видалення тимчасовий (transients) даних можна використати такий код:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення тимчасових даних
delete_transient('myplugin_transient');Code language: HTML, XML (xml)

Видалення задач

Якщо ваш плагін додавав у вбудований у WordPress планувальник свої задачі, можливо ви захочете видалити їх також:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення задач
$pluginnexttime = wp_next_scheduled('pluginname_cron_event');
wp_unschedule_event($pluginnexttime, 'pluginname_cron_event');Code language: HTML, XML (xml)

Впишіть замість pluginname назву хуку, що виконує дана задача вашого плагіну.

Видалення таблиць

Іноді розробникам не вдається обійтись без створення в базі даних додаткових таблиць. Тож за потреби їх видалити можна використати такий код:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення таблиць
global $wpdb;
$my_table_name = $wpdb->prefix .'pluginname_table';
$wpdb->query("DROP TABLE IF EXISTS {$my_table_name}");Code language: HTML, XML (xml)

Звісно, замість pluginname_table потрібно вписати назву потрібної своєї таблиці.

Видалення записів та сторінок

Дана функція мені подобається більше всього 🙂 , не забудьте змінити 12 на ідентифікатор потрібного запису/сторінки.

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення записів та сторінок
wp_trash_post(12);Code language: HTML, XML (xml)

Видалення кастомних постів

Якщо під час видалення вашого WordPress плагіна необхідно “підчистити” також і усі пцблікації якогось певного кастомного типу (наприклад myplugin_type), можна скористатись таким методом:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення УСІХ публікацій типу myplugin_type
$myplugin_type_args = array('post_type' => 'myplugin_type', 'posts_per_page' => -1);
$myplugin_type_posts = get_posts($myplugin_type_args);
foreach ($myplugin_type_posts as $post) {
	wp_delete_post($post->ID, false);
}Code language: HTML, XML (xml)

Зауважте, що функція wp_delete_post також видалить пов’язані з публікаціями дані, наприклад коментарі чи мітки. Також ми вказали другим параметром false, що не видаляє публікацію остаточно, а переміщує у кошик.

Видалення мета-даних користувача

Якщо до усіх користувачів додано певні ваші мета-дані, які більше не будуть потрібні після видалення плагіну, то ось вам приклад коду, що повидаляє дані метаполя my_user_meta в усіх користувачів:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення мета-даних користувачів
$users = get_users();
foreach ($users as $user) {
	delete_user_meta($user->ID, 'my_user_meta');
}Code language: HTML, XML (xml)

Видалення мета-даних записів

Аналогічно попередньому прикладу можна видалити мета-дані поля my_post_meta з записів:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// Видалення мета-даних публікацій
$my_post_args = array('posts_per_page' => -1);
$my_posts = get_posts($my_post_args);
foreach ($my_posts as $post) {
	delete_post_meta($post->ID, 'my_post_meta');
}Code language: HTML, XML (xml)

Якщо ви хочете видалити мета-дані з якихось кастомних типів записів (наприклад my_cpt), додайте в масив відповідний параметр, виглядатиме зміна так:

$my_post_args = array('post_type' => 'my_cpt', 'posts_per_page' => -1);Code language: PHP (php)

Приклад

Отже, якщо все звести до купи, то вийде наступне:

<?php 
// завершити, якщо не визначено константу WP_UNINSTALL_PLUGIN
if (!defined('WP_UNINSTALL_PLUGIN')) exit;
// видалити опції
delete_option('myplugin_options');
// Видалення тимчасових даних
delete_transient('myplugin_transient');
// Видалення задач
$pluginnexttime = wp_next_scheduled('pluginname_cron_event');
wp_unschedule_event($pluginnexttime, 'pluginname_cron_event');
// Видалення таблиць
global $wpdb;
$my_table_name = $wpdb->prefix .'pluginname_table';
$wpdb->query("DROP TABLE IF EXISTS {$my_table_name}");
// Видалення записів та сторінок
wp_trash_post(12);
// Видалення УСІХ публікацій типу myplugin_type
$myplugin_type_args = array('post_type' => 'myplugin_type', 'posts_per_page' => -1);
$myplugin_type_posts = get_posts($myplugin_type_args);
foreach ($myplugin_type_posts as $post) {
	wp_delete_post($post->ID, false);
}
// Видалення мета-даних користувачів
$users = get_users();
foreach ($users as $user) {
	delete_user_meta($user->ID, 'my_user_meta');
}
// Видалення мета-даних публікацій
$my_post_args = array('posts_per_page' => -1);
// для кастомних типів змініть на
// $my_post_args = array('post_type' => 'my_cpt', 'posts_per_page' => -1);
$my_posts = get_posts($my_post_args);
foreach ($my_posts as $post) {
	delete_post_meta($post->ID, 'my_post_meta');
}Code language: HTML, XML (xml)

Зауваження

Зауважень наразі лише два:

  • додайте якусь опцію чи попередження в плагін, щоб користувач міг обрати, видаляти дані разом з плагіном чи ні, або хоча б знав, що дані будуть видалені, якщо видалити плагін. Додавши опцію, ви можете на початку коду файлу перевірити, чи обрав користувач видалення, щось на зразок if (!get_option(‘my_plugin_uninstall’, false)) exit;
  • наведений приклад коду є прикладом, звісно він не оптимізований під велику кількість даних, тому ви маєте попередньо його протестувати і підправити за потреби

Фініш

Звісно, ви як розробник плагіну маєте відчувати відповідальність за додавання та видалення будь-яких даних на сайтах користувачів. Тож двічі подумайте, що можна видаляти разом з плагіном, а що ні. Мабуть одним з стандартних коректних прикладів роботи такої функції “чистки” є видалення опцій плагіну (налаштувань плагіну), але не видалення публікацій чи сторінок, що було створено ним. А ідеальним, мабуть, є дати користувачу повноту вибору. Удачі!

За цю корисну інформацію для статті ми вдячні digwp.com

Author

Дмитро Кондрюк в веб-індустрії з 2003 року. В 2009р. заснував проект Український WordPress (що у подальшому став офіційним сайтом команди локалізації WordPress в Україні). З 2010 року засновник і технічний директор проекту Український хостинг для WordPress (WPHost.me) - повноцінного хостинг-сервісу, максимально оптимізованого на використання CMS WordPress.

Коментувати