web-dev-qa-db-fra.com

Comment implémenter la mise à jour du plugin WordPress qui modifie la base de données?

Je développe un plugin WordPress, qui possède plusieurs tables de base de données. Le plug-in crée ces tables lorsqu'il est activé et les supprime lorsqu'il est supprimé/désinstallé.

Je dois implémenter un processus de mise à jour du plugin qui met à jour le code du plugin ainsi que la structure des tables. Le cas le plus simple consisterait à ajouter une nouvelle colonne à l’un des tableaux. Le cas le plus complexe serait de créer une nouvelle structure de tables et de mettre à jour le contenu en conséquence.

Comment recommanderiez-vous pour résoudre ce problème? Existe-t-il des fonctions WordPress intégrées pouvant aider?

9
Misha Moroshko

En bref, oui le - $wpdb class. Voir Codex pour plus d'informations.

Chaque fois que vous interagissez avec une table personnalisée (ou une table, en réalité), vous devez passer par $wpdb - en particulier, assurez-vous de bien connaître la méthode prepare qui peut aider à échapper aux requêtes et à empêcher les injections.

Vous devriez déjà être familier avec, car vous devriez l’utiliser pour créer la table. Sur votre installation, vous devriez avoir quelque chose comme:

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

Ce code est en réalité exécuté chaque fois que le plug-in est activé (c'est-à-dire non seulement installé). Donc, il fonctionnera lorsque quelqu'un mettra à jour le plug-in automatiquement.Remarque: _ S'ils effectuent la mise à niveau en remplaçant le plug-in manuellement - alors ce ne sera pas le cas - vous devrez donc déclencher le code ci-dessus sur admin_init lorsque votre plug-in dans est mis à niveau (stocke le numéro de version dans la table des options, comparez-le à la version actuelle).

Désormais, vous ne voudriez normalement pas que la commande CREATE TABLE SQL soit exécutée chaque fois que vous mettez à jour le plug-in - c’est là/ dBDelta() entre en jeu.

Avant d'exécuter la commande ci-dessus, il vérifie si la table existe. De plus, il vérifie les types de colonne. Donc, si la table n'existe pas, elle la crée, si elle existe, mais certains types de colonne ont changé, elle les met à jour et si une colonne n'existe pas, elle l'ajoute.

Malheureusement, si vous supprimez une colonne de ce qui précède, elle ne sera pas automatiquement supprimée. Pour supprimer des colonnes/des tables, vous devez spécifiquement les nommer DROP (en les vérifiant avant de le faire).

3
Stephen Harris

La bonne façon de faire cela ces jours-ci consiste à inclure votre schéma en tant que fichier dans le source du plug-in et à utiliser la fonction intégrée WordPress dbDelta () pour mettre à jour la base de données selon vos besoins à l'aide de ce schéma. Le code requis est très simple:

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

Cela créera et mettra à jour la base de données pour vous, si nécessaire. La dernière fois que j’ai vérifié, il n’a pas supprimé les anciennes colonnes inutilisées, vous devez donc coder pour cela via une vérification de version. Ceci est une belle fonctionnalité de WordPress et un gain de temps énorme. Attention, lors de la création du fichier schema.sql, que vous copiez l'espacement dans une exportation de schéma mysql exactement comme le code dbDelta () est réputé pour être très difficile en ce qui concerne l'espacement. Vous devez également tester la version de la base de données. Si ce n'est pas la dernière, appelez ce qui précède pour mettre à jour la base de données. Vous devrez peut-être aussi effectuer des mises à jour spécifiques pour couvrir les modifications que dbDelta () ne corrige pas (par exemple, supprimer une colonne). Il est facile d'écrire un simple test logique pour voir si la version a été mise à jour et faire ces mises à jour manuelles via $ wpdb. Par exemple, vous pouvez supprimer une colonne qui est maintenant inutilisée.

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

Ceci est simplifié par le code en cours d’exécution, excusez-moi si j’ai rompu le processus en le simplifiant pour le publier.

Notez également qu'à partir de WordPress 3.9.2, WordPress n'exécutera pas toujours le crochet d'activation lors de la mise à jour du plug-in (en particulier, si une mise à jour en masse est effectuée à partir de la page Mises à jour du tableau de bord).

3
Brian C