web-dev-qa-db-fra.com

Développement de plugin: suppression des options lors de la mise à jour vers une nouvelle version

En tant que développeur de plug-in, je veux m'assurer que mon plug-in ne laisse aucun paramètre personnalisé dans mon plug-in lors de la mise à niveau de v1.0 à v2.0.

À chaque fois qu'un utilisateur désinstalle mon plug-in, j'ai créé un fichier uninstall.php (pratique standard) qui supprime automatiquement tous les paramètres de mon plug-in pour une suppression complète:

if ( !defined( 'WP_UNINSTALL_PLUGIN' ) ) { // Exit if accessed directly
    exit;
}

// Remove all plugin options with the prefix "myplugin_"
global $wpdb;
$plugin_options = $wpdb -> get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'myplugin_%'" );

foreach( $plugin_options as $option ) {
    delete_option( $option -> option_name );
}

Ce script supprime automatiquement toutes les options ayant le préfixe myplugin_ telles que:

myplugin_some_option
myplugin_another_option_here
myplugin_yup_this_one_too
etc...

Cependant, je travaille déjà sur une nouvelle version de mon plugin avec de nouvelles options dans ma page de paramètres. Si un utilisateur dispose d'une version plus ancienne de mon plug-in et effectue la mise à niveau vers la version suivante sans la désinstaller, comment puis-je m'assurer que toutes mes anciennes options de plug-in sont supprimées pour une mise à niveau propre? Le fichier uninstall.php est-il automatiquement exécuté lorsqu'un utilisateur effectue une mise à niveau vers une nouvelle version de mon plugin?

1

Dans mon prochain plugin v2.0.0, j'ai ajouté une option qui stockera la version du plugin à comparer dans la prochaine mise à jour.

En guise de solution de contournement, j'ai implémenté une vérification pour voir si myplugin_version est inférieur à 2.0.0 ou s'il n'existe pas, supprimez les options de plug-in avec le préfixe myplugin_:

# If the plugin version is lower or not defined, remove plugin options
if ( ( get_option( 'myplugin_version' ) < '2.0.0' ) || ! get_option( 'myplugin_version' ) ) {
    # Remove options with the prefix "myplugin_"
    foreach ( wp_load_alloptions() as $option => $value ) {
        if ( strpos( $option, 'myplugin_' ) === 0 ) {
            delete_option( $option );
        }
    }
    # Add options for new plugin version
    update_option( 'myplugin_version', '2.0.0' );
}
0

Votre plugin utilise-t-il un numéro de version? Lors de l'activation du plug-in, vous pouvez comparer le numéro de version et utiliser le code que vous avez ci-dessus pour supprimer les "anciennes" options, le cas échéant.

if ( $myplugin_version > 3.0 ) {
    // Remove all plugin options with the prefix "myplugin_"
}
0
johnh10

Chaque plugin devrait avoir un numéro de version, comme sur les commentaires pour les métadonnées de WordPress ou beaucoup plus facilement dans une constante, var du plugin. Cette version vous aide à supprimer des données uniquement après, avant une version.

Vous devriez utiliser la fonction php version_compare pour valider la version.

Si vous n'avez pas de version à l'intérieur de votre code en tant que constante ou var, vous pouvez également utiliser la version des métadonnées de l'en-tête du plugin.

Meta comme ça:

<?php # -*- coding: utf-8 -*-
/**
 * Plugin Name: WPSE 238422
 * Description: foo.
 * Author:      Frank
 * Author URI:  http://bueltge.de
 * Version:     4.6.99
 * Text Domain: bar
 * License:     GPLv2+
 * Network:     true
 */

Pour obtenir la version de la tête, cette fonction est utile.

    /**
     * Return plugin comment data
     *
     *
     * @param   string $value default = 'Version'
     *                        Name, PluginURI, TextDomain, Description, Author, AuthorURI, TextDomain, DomainPath, Network, Title
     * @param   bool   $echo
     *
     * @return  string
     */
    public function get_plugin_data( $value = 'Version', $echo = FALSE ) {

        static $plugin_data = array();

        // fetch the data just once.
        if ( isset( $plugin_data[ $value ] ) ) {
            return $plugin_data[ $value ];
        }

        if ( ! function_exists( 'get_plugin_data' ) ) {
            require_once ABSPATH . '/wp-admin/includes/plugin.php';
        }

        $plugin_data  = get_plugin_data( __FILE__ );
        $plugin_value = empty ( $plugin_data[ $value ] ) ? '' : $plugin_data[ $value ];

        if ( $echo ) {
            echo $plugin_value;
        }

        return $plugin_value;
    }

Si vous utilisez ceci, vous pouvez peut-être vérifier comme dans l'exemple suivant. version_compare( $this->get_plugin_data(), '4.6-RC1', '<' );

0
bueltge