web-dev-qa-db-ja.com

プラグイン開発:新しいバージョンにアップデートするときにオプションを削除する

v1.0からv2.0にアップグレードするとき、プラグイン開発者として、私は自分のプラグインが私のプラグインから取り残されたカスタム設定を残さないようにしたいです。

ユーザーが自分のプラグインをアンインストールするたびに、 uninstall.php ファイルが作成され(標準的な方法)、自動的に自分のプラグインの設定がすべて削除されます。

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

このスクリプトは、次のようにプレフィックスmyplugin_を持つすべてのオプションを自動的に削除します。

myplugin_some_option
myplugin_another_option_here
myplugin_yup_this_one_too
etc...

しかし、私はすでに自分の設定ページの新しいオプションで私のプラグインの新しいバージョンに取り組んでいます。ユーザーが古いバージョンのプラグインを使用していて、それをアンインストールせずに次のバージョンにアップグレードする場合、クリーンアップグレードのために古いプラグインオプションをすべて確実に削除するにはどうすればよいですか? uninstall.phpファイルは、ユーザーが私のプラグインの新しいバージョンにアップグレードしたときに自動的に実行されますか?

私の今後のプラグインv2.0.0では、次回のアップデートで将来比較するためにプラグインのバージョンを保存するオプションを追加しました。

回避策として、myplugin_version2.0.0よりも小さいかどうか、または存在しない場合は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' );
}

あなたのプラグインはバージョン番号を使っていますか?プラグインのアクティベーション時には、バージョン番号を比較し、上記のコードを使って 'old'オプションがあればそれらを削除することができます。

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

各プラグインは、WordPressのメタデータに対するコメントのように、あるいはプラグインの定数varでもっと簡単に、バージョン番号を持つべきです。このバージョンでは、バージョンの後、バージョンの前にのみデータを削除するのに役立ちます。

バージョンを検証するにはphp関数 version_compare を使うべきです。

コード内に定数またはvarとしてバージョンがない場合は、プラグインのヘッドのメタデータからのバージョンも使用できます。

このようなメタ:

<?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
 */

頭のバージョンを取得するには、この機能が役立ちます。

    /**
     * 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;
    }

あなたがこれを使うなら、多分あなたは以下の例のようにチェックすることができます。 version_compare( $this->get_plugin_data(), '4.6-RC1', '<' );

0
bueltge