Як реалізувати оновлення плагінів WordPress, що модифікує базу даних?


10

Я розробляю плагін WordPress, який має кілька власних таблиць баз даних. Плагін створює ці таблиці при активації та видаляє їх при видаленні / видаленні.

Я повинен реалізувати процес оновлення плагіна, який оновлює код плагіна, а також структуру таблиць. Найпростішим випадком було б додати новий стовпець до однієї з таблиць. Складнішим випадком було б створення нової структури таблиць та відповідно оновлення вмісту.

Як би ви порадили вирішити цю проблему? Чи є якісь вбудовані функції WordPress, які можуть допомогти?

Відповіді:


4

Правильний спосіб зробити це сьогодні - включити вашу схему як файл до джерела плагінів та використовувати вбудовану функцію WordPress dbDelta () для оновлення бази даних за потребою за допомогою цієї схеми. Фактичний необхідний код дуже простий:

$sql = file_get_contents( plugin_dir_path(__FILE__) . "/schema.sql" );
dbDelta( $sql );

Це створить та оновить для вас базу даних за потребою. Коли я востаннє перевіряв, він не видаляв старі невикористані стовпці, тому вам потрібно буде кодувати це за допомогою перевірки версії. Це прекрасна особливість WordPress та величезна економія часу. Будьте обережні, створюючи файл schema.sql, який ви копіюєте пробіл в експортній схемі mysql саме так, як код dbDelta () вважається дуже метушливим щодо інтервалу. Ви також повинні перевірити версію бази даних, і якщо вона не є останньою, зателефонуйте вище, щоб оновити базу даних. Можливо, вам також знадобиться зробити конкретні оновлення, щоб охопити зміни, які dbDelta () не підходить правильно (наприклад, видалення стовпця). Неважко записати просту логічну програму, якщо перевірити, чи оновлюється версія та виконати ці оновлення вручну через $ wpdb. Наприклад, ви можете скинути стовпець, який зараз не використовується.

$installed_ver = get_option(MY_DB_VERSION);
$wpp = $wpdb->prefix . "mypluginname";
if ($installed_ver < 102)
        $wpdb->query("ALTER TABLE ${wpp}_movies DROP nft_date");
if ($installed_ver < 107)
        $wpdb->query("ALTER TABLE ${wpp}_movies CHANGE lastupdated "
        . "lastupdated TIMESTAMP on update CURRENT_TIMESTAMP "
        . "NOT NULL DEFAULT CURRENT_TIMESTAMP");

update_option(MY_DB_VERSION, $db_version);

Це спрощено від запуску коду, вибачте, якщо я порушив його в процесі спрощення його для публікації.

Також майте на увазі, що, як і для WordPress 3.9.2, WordPress не завжди запускає гачок активації при оновленні плагіна (зокрема, якщо масове оновлення робиться на сторінці оновлень інформаційної панелі).


У ці дні я почав брати версію БД з модного часу файлу schema.sql. Це означає, що для оновлення бази даних достатньо лише оновлення файлу sche.sql; не потрібно пам'ятати, щоб редагувати версію бази даних. Щось на зразок: $ db_version = filemtime ("schema.sql");
Брайан C

1
Отже, якщо час файлу змінюється від чогось зовнішнього, наприклад, переміщення серверів, змінюються mtime та db версія?
Вальф

Час файлу завжди знаходиться в GMT, і сервери рідко відрізняються на кілька секунд, тому майже неможливо, щоб це було запущено двічі. Однак, навіть якщо вона знову спрацьовує, шкоди не робиться, коли вона запускається один раз і робить порівняння з живою БД, очевидно, нічого не змінюючи. Це прекрасна річ про dbDelta () - вона може працювати безліч разів без проблем. Добре запитання, дякую.
Брайан C

3

Словом, так - $wpdbклас. Див. Codex для отримання додаткової інформації.

Щоразу, коли ви взаємодієте зі спеціальною таблицею (або будь-якою таблицею, насправді), вам слід пройтись, $wpdbособливо переконайтесь, що ви знайомі з prepareметодом, який може допомогти уникнути запитів і запобігти ін'єкціям.

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

$charset_collate = '';
if ( ! empty($wpdb->charset) )
    $charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
if ( ! empty($wpdb->collate) )
    $charset_collate .= " COLLATE $wpdb->collate";

//Create custom table
$sql_custom_table ="CREATE TABLE {$wpdb->prefix}my_table (
    id bigint(20) unsigned NOT NULL auto_increment,
    column_a varchar(255) default NULL,
    column_b varchar(255) default NULL,
    PRIMARY KEY  (id)
    ) $charset_collate; ";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql_custom_table);

Цей код насправді виконується щоразу, коли плагін активовано (тобто не тільки встановлений). Тож воно запуститься, коли хтось оновить плагін автоматично . Примітка. Якщо вони оновлюються, замінивши плагін вручну - тоді він не буде - значить, вам потрібно буде активувати вищевказаний код, admin_initколи ваш плагін буде оновлено (збережіть номер версії в таблиці параметрів, перевірте, чи немає поточної версії) .

Тепер, як правило, ви не хочете, щоб CREATE TABLEкоманда SQL запускалася щоразу, коли ви оновлюєте плагін - ось тут і dBDelta()надходить.

Перш ніж запустити вищевказану команду - вона перевіряє, чи існує таблиця. Більше того, він перевіряє типи стовпців. Отже, якщо таблиці не існує, вона створює її, якщо вона є, але деякі типи стовпців змінили її, вона оновлює їх, а якщо стовпець не існує - додає її.

На жаль - якщо ви вилучите стовпчик із наведеного вище, він не буде автоматично видалений. Щоб видалити стовпці / таблиці, потрібно спеціально DROPїх (перевірити їх існування до цього).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.