插件开发:更新到新版本时删除选项

时间:2016-09-06 作者:Ethan O\'Sullivan

作为一名插件开发人员,我希望确保我的插件在从升级时不会留下任何自定义设置v1.0v2.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 当用户升级到我的插件的新版本时,文件是否自动运行?

3 个回复
最合适的回答,由SO网友:Ethan O\'Sullivan 整理而成

在我即将推出的插件中v2.0.0, 我添加了一个选项,该选项将存储插件的版本,以便在下次更新时与之进行比较。

作为一种变通方法,我实施了一个检查myplugin_version 小于2.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\' );
}

SO网友:johnh10

您的插件是否使用版本号?激活插件时,您可以比较版本号,并使用上面的代码删除“旧”选项(如果存在)。

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

SO网友:bueltge

每个插件都应该有一个版本号,比如WordPress元数据的注释,或者更简单的是插件的常量var。此版本帮助您仅在版本之后、之前删除数据。

您应该使用php函数version_compare 验证版本。

如果代码中没有常量或var版本,也可以使用插件头部元数据中的版本。

Meta如下所示:

<?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\', \'<\' );

相关推荐

有没有办法为一个博客运行upgrade.php?

我今天刚运行了verion 3.9的自动更新,但“网络更新”有问题。我似乎有防火墙或网络问题,出现以下错误:您的服务器可能无法连接到其上运行的站点。错误消息:无法连接到主机不管怎样,有没有办法在每个博客上运行数据库更新?我可以使用特殊的URL吗?我可以从shell命令行执行吗?在一个旧的论坛帖子上,有人建议更新。php在您第一次登录博客管理员时自动运行(即使尚未运行网络更新)。我想知道这是不是真的。谢谢