Migration de base de donnée WordPress avec Phinx

Pour créer des migrations Phinx tout en ayant accès aux fonctionnalités de WordPress, il suffit d’ajouter un include du fichier wp-conf.php dans le fichier de configuration phinx.php qui est placé à la racine de votre projet lors de l’initialisation de l’utilitaire.

Ci-dessous un exemple pour une installation avec Bedrock (le répertoire web contenant l’application WP)

<?php

require_once('web/wp-config.php');

global $wpdb;

return [
    'paths' => [
        'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations',
        'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds'
    ],
    'environments' => [
        'default_migration_table' => "{$wpdb->prefix}phinxlog",
        ...
    ]
]

Vous aurez ensuite accès à toutes les fonctionnalités de WordPress depuis vos fichiers de migrations, comme la variable globale $wpdb pour les requêtes à la base de données et les classes et fonctions utiles pour vos manipulations de données (WP_Query, wp_insert_post etc.)

<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class MigrateTable extends AbstractMigration
{
    public function change(): void
    {
        global $wpdb;

        $table = $this->table('old_products');
        $table->rename($wpdb->prefix.'products'); // wp_products
        $table->update();

        //$query = new WP_Query([]);
    }
}

 

Pour aller plus loin avec Bedrock

Vous pouvez directement utiliser les constantes de configuration définies dans le fichier config/application.php et tirées de votre fichier .env

<?php

use Roots\WPConfig\Config;

require_once('web/wp-config.php');

return
[
    'paths' => [
        'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations',
        'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds'
    ],
    'environments' => [
        'default_migration_table' => "{$wpdb->prefix}phinxlog",
        'default_environment' => 'development',
        'development' => [
            'adapter' => 'mysql',
            'host' => Config::get('DB_HOST'),
            'name' => Config::get('DB_NAME'),
            'user' => Config::get('DB_USER'),
            'pass' => Config::get('DB_PASSWORD'),
            'port' => (strpos(Config::get('DB_HOST'),':')) ? explode(':',Config::get('DB_HOST'))[1] : '3306',
            'charset' => Config::get('DB_CHARSET'),
        ],
    ],
    'version_order' => 'creation'
];