it-swarm.com.de

Wie implementiert man ein WordPress-Plugin-Update, das die Datenbank verändert?

Ich entwickle ein WordPress-Plugin, das mehrere eigene Datenbanktabellen hat. Das Plugin erstellt diese Tabellen beim Aktivieren und entfernt sie beim Löschen/Deinstallieren.

Ich muss einen Update-Prozess des Plugins implementieren, der den Code des Plugins sowie die Tabellenstruktur aktualisiert. Der einfachste Fall wäre, einer der Tabellen eine neue Spalte hinzuzufügen. Der komplexere Fall wäre, eine neue Tabellenstruktur zu erstellen und den Inhalt entsprechend zu aktualisieren.

Wie würden Sie empfehlen, um dieses Problem zu lösen? Gibt es integrierte WordPress-Funktionen, die helfen könnten?

9
Misha Moroshko

Kurz gesagt, ja die - $wpdb Klasse. Siehe Codex für weitere Informationen.

Immer, wenn Sie mit einer benutzerdefinierten Tabelle (oder einer anderen Tabelle) interagieren, sollten Sie $wpdb durchgehen. Stellen Sie insbesondere sicher, dass Sie mit der Methode prepare vertraut sind, mit der Abfragen vermieden und Injektionen verhindert werden können.

Sie sollten bereits damit vertraut sein, da Sie es zum Erstellen der Tabelle verwenden sollten. Auf Ihrem Installations-Hook sollten Sie Folgendes haben:

$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);

Dieser Code wird tatsächlich ausgeführt, wenn das Plug-In aktiviert ist (d. H. Nicht nur installiert ist). Es wird also ausgeführt, wenn jemand das Plug-in automatic aktualisiert.Hinweis:Wenn ein Upgrade durch manuelles Ersetzen des Plug-Ins durchgeführt wird, muss der obige Code für admin_init ausgelöst werden, wenn das Plug-In aktualisiert wird (Versionsnummer in der Optionstabelle speichern, mit der aktuellen Version vergleichen).

Jetzt möchten Sie normalerweise nicht, dass der SQL-Befehl CREATE TABLE jedes Mal ausgeführt wird, wenn Sie das Plug-In aktualisieren. Hier kommt dBDelta() ins Spiel.

Vor dem Ausführen des obigen Befehls wird überprüft, ob die Tabelle vorhanden ist. Außerdem werden die Spaltentypen überprüft. Wenn die Tabelle also nicht vorhanden ist, wird sie erstellt, wenn dies der Fall ist, aber einige Spaltentypen wurden geändert, und wenn keine Spalte vorhanden ist, wird sie hinzugefügt.

Leider wird die Spalte nicht automatisch entfernt, wenn Sie eine der oben genannten Spalten entfernen. Um Spalten/Tabellen zu entfernen, müssen Sie sie spezifisch DROP (überprüfen, ob sie vorhanden sind, bevor Sie dies tun).

3
Stephen Harris

Der richtige Weg, dies heutzutage zu tun, besteht darin, Ihr Schema als Datei in die Plugin-Quelle aufzunehmen und die eingebaute WordPress-Funktion dbDelta () zu verwenden, um die Datenbank nach Bedarf unter Verwendung dieses Schemas zu aktualisieren. Der tatsächlich benötigte Code ist sehr einfach:

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

Dadurch wird die Datenbank nach Bedarf erstellt und aktualisiert. Als ich das letzte Mal nachgesehen habe, wurden alte, nicht verwendete Spalten nicht gelöscht. Daher müssten Sie dafür eine Versionsprüfung durchführen. Dies ist eine schöne Funktion von WordPress und eine enorme Zeitersparnis. Achten Sie beim Erstellen der Datei schema.sql darauf, dass Sie die Abstände in einen MySQL-Schemaexport kopieren, da der dbDelta () -Code angeblich sehr pingelig in Bezug auf die Abstände ist. Sie sollten auch die Version der Datenbank testen. Wenn dies nicht die neueste ist, rufen Sie die oben genannten Informationen auf, um die Datenbank zu aktualisieren. Möglicherweise müssen Sie auch bestimmte Aktualisierungen vornehmen, um Änderungen zu berücksichtigen, die mit dbDelta () nicht korrekt sind (z. B. Löschen einer Spalte). Es ist einfach, einen einfachen logischen Test zu schreiben, um festzustellen, ob die Version aktualisiert wurde, und diese manuellen Aktualisierungen über $ wpdb durchzuführen. Beispielsweise können Sie eine Spalte löschen, die jetzt nicht verwendet wird.

$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);

Dies wird dadurch vereinfacht, dass Code ausgeführt wird. Wir bitten um Entschuldigung, dass ich ihn im Zuge der Vereinfachung für die Veröffentlichung beschädigt habe.

Beachten Sie auch, dass WordPress ab WordPress 3.9.2 den Aktivierungs-Hook beim Aktualisieren des Plugins nicht immer ausführt (insbesondere, wenn ein Massenupdate über die Seite Dashboard-Updates durchgeführt wird).

3
Brian C