web-dev-qa-db-fra.com

Comment obtenir le code SQL des modifications apportées à la base de données à partir d'une mise à jour ou mise à niveau?

Lorsque je mets à jour/améliore un plugin, un thème ou même le noyau de WordPress, cela a un impact sur la base de données, cela change beaucoup de choses. Comment puis-je garder une trace de cela?

Le problème est que j'ai un référentiel, toutes les modifications apportées aux fichiers sont correctement suivies, mais je ne sais pas comment créer un fichier SQL pour stocker les modifications de la base de données (modifier, insérer, mettre à jour, déposer, créer). , etc.).

J'utilise un outil, Flyway, qui sélectionne la liste des fichiers SQL que j'ai dans le référentiel et applique la requête de chaque fichier à la base de données. Ma question est donc de savoir comment créer ou obtenir une requête SQL de toutes les modifications. faite par la mise à jour/mise à niveau future de WordPress? De cette façon, toute l'équipe sera en mesure de tirer un coup du rapport et les changements que j'ai apportés seront propagés.

Merci.

1
Marco Florian

Journal des requêtes:

Vous pouvez collecter toutes les requêtes lors des mises à niveau principales/plugin/thème pour voir ce qui se passe. Il suffit de suivre ces deux étapes:

1) Vous devriez ajouter:

define( 'SAVEQUERIES', TRUE );

dans votre fichier wp-config.php pour collecter toutes les requêtes lors du chargement d'une page dans le tableau $wpdb->queries. Rappelez-vous juste de l'enlever après.

2) Ensuite, vous pouvez le connecter dans le fichier sql.log. Voici un exemple simple:

/**
 * Dump all database queries to the /wp-content/sql.log file.
 */
add_action( 'shutdown', function(){

    $file =  WP_CONTENT_DIR . '/sql.log'; // Edit this filepath to your needs.

    if( current_user_can( 'manage_options' ) 
         && file_exists( $file )
         && is_writeable( $file )
         && isset( $GLOBALS['wpdb']->queries )
     )
         file_put_contents( 
                $file, 
                date( 'c' ) . PHP_EOL .  print_r( $GLOBALS['wpdb']->queries, TRUE ), 
                FILE_APPEND 
         );

});

ou utilisez le filtre query de la classe wpdb pour consigner uniquement les requêtes INSERT, UPDATE et DELETE:

/**
 * Log the INSERT, UPDATE, DELETE database queries to the /wp-content/sql.log file.
 */
add_filter( 'query', function( $query ){
    if( FALSE !== stripos( $query, 'UPDATE ' )
        || FALSE !== stripos( $query, 'INSERT ' )
        || FALSE !== stripos( $query, 'DELETE ' )
     ) {
            $file =  WP_CONTENT_DIR . '/sql.log'; // Edit this filepath to your needs.  
            if( file_exists( $file ) && is_writeable( $file ) ) 
                file_put_contents( 
                    $file, 
                    date( 'c' ) . ' - ' . $query . PHP_EOL, 
                    FILE_APPEND | LOCK_EX 
                );            
    }
    return $query;
}, PHP_INT_MAX );

Fichiers de mise à niveau principaux:

Pour les mises à niveau principales, ces fichiers peuvent vous intéresser.

  • /wp-includes/version.php
  • /wp-admin/includes/upgrade.php
  • /wp-admin/includes/schema.php

Dans le fichier /wp-admin/includes/upgrade.php, vous trouverez la fonction de mise à niveau: wp_upgrade() qui appelle la fonction upgrade_all(). Il contient des mises à niveau de base de données pour chaque version en termes de fonctions telles que upgrade_xxx()

Par exemple:

    ...truncated...

    if ( $wp_current_db_version < 22422 )
            upgrade_350();

    if ( $wp_current_db_version < 25824 )
            upgrade_370();

    if ( $wp_current_db_version < 26148 )
            upgrade_372();

    if ( $wp_current_db_version < 26691 )
            upgrade_380();

    maybe_disable_link_manager();

    maybe_disable_automattic_widgets();

    update_option( 'db_version', $wp_db_version );
    update_option( 'db_upgraded', true );

J'espère que ça aide.

1
birgire