Plugin update warning

时间:2016-06-01 作者:GDY

是否可以显示某个插件更新的警告消息?例如,从版本0.3或更低版本到0.4或更高版本?

编辑:我需要升级通知之类的东西(wich目前不能正常工作)我发现了一篇有趣的文章here.

3 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

除非您提前在插件中计划这种可能性,否则这是不可能的。即使有可能,你仍然不太可能让任何用户阅读并真正理解消息。

一种更现实的方法是,在插件的第一个版本中进行两步升级,以保持适当的向后兼容性,然后才从代码中删除它,这样您就可以选择发出适当的通知,并让用户有时间根据需要进行调整。

SO网友:KFish

因为这已经有2年多的历史了,我想,至少我希望,到目前为止,更新已经推出,要么没有问题,要么导致了一系列的故障,然后必须修复。对于任何阅读本文的人来说,我认为它很好地指出了马克·卡普伦在对公认答案的评论中逃避了什么。WordPress的插件数量多得离谱,事实上,即使在非常流行的插件中,开发人员或整个开发团队都会以错误的方式做一些事情。这就是为什么更新经常破坏网站。如果你在听,请停下,哈哈。

在这种情况下,正如评论中所揭示的,开发人员有一个插件,可以直接从主题中调用函数,这可能不是一个他可以控制并可以推送更新的唯一主题,因此陷入了困境。对于这个问题,有一个非常明显且简单的解决方案,可以很好地解决它,并且避免了所有未来版本的中断,无论主题中的函数是否曾经更新过。更不用说,告诉用户他们必须在调用函数的主题中检查所有代码并立即更改,这也是一种非常糟糕的做法,因为您无法正确处理函数更新。发布通知警告用户对所有函数调用的“必需”更改,是解决此问题的完全错误的方法,但是开发人员看不到这一点。他只知道他想如何解决这个问题,所以他只问了对他来说很重要的问题,而且这个问题也是错误的。

假设代码是这样的:

// Plugin functions
...
// version 0.3
public function get_module($id, $name){
        // code that only handles $id and $name parameters
}

// version 0.4
public function get_module($module){
        // code that only handles $module as an object
}

// Theme code
$modulator = new Plugin_Class();
$module = $modulator->get_module(21, \'My Module\');
真正的问题与要向用户显示的通知或警告无关。一旦版本0.4推出,想必每个使用过该插件的人都会看到网站出现了完全可以避免的致命错误,因为插件代码现在需要一个对象,并且他们正在传递一个id和一个名称,可能在代码中的很多地方,他们现在必须跟踪和处理,因为开发人员没有正确处理它。真正的解决方案应该是这样的:

// Plugin functions
...
// version 0.4
public function get_module_by_id($id){
        //code to retrieve and return the module object by its ID
        return $module
}
public function get_module($module){
        if(!is_object($module)){
                $module = $this->get_module_by_id($module);
        }
        // now you have your module object that you need, the rest of the code should be exactly as it would have for version 0.4
}

// Theme code
$modulator = new Plugin_Class();
$module = $modulator->get_module(21, \'My Module\');
// Still works in every future version of the plugin, until you decide to break it another way with an update of course.
正如我之前所说,向用户发出通知/警告是有时间和地点的,但这不是其中之一。在编写代码之前,请三思而后行,即使用户不知道他们会这么做,他们也会很感激的。;-)

SO网友:Ismail

您可以使用访问可用插件更新的完整列表get_plugin_updates() 作用

您只需验证插件是否存在,然后检查版本,在管理端点中输出警告的最佳方法是使用admin_notices

在中指定插件名称$requested_name 变量(行:4)

add_action(\'admin_init\', function() { 

    // Specify here the plugin name
    $requested_name = \'AJAX File Upload\';

    function se_plugin_has_update( $name ) {

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

        $list = get_plugin_updates();
        $data = array();

        foreach( $list as $i => $item ) {   
            if( strtolower( $name ) == strtolower( $item->Name ) ) {
                $data = $list[$i];
            }
        }

        if( ! empty( $data ) ) {

            $data = array(
                \'name\' => $data->Name,
                \'version\' => $data->Version,
                \'new_version\' => $data->update->new_version,
                \'url\' => $data->update->url,
                \'package\' => $data->update->package
            );

        } else {
            $data = array();
        }

        return $data;

    }

    $update_data = se_plugin_has_update( $requested_name );

    // var_dump( $update_data ) or print_r( $update_data ) for debugging

    if( ! empty( $update_data ) ) { // has update avail

        // You can avoid for specific versions (current: $update_data[\'version\'] and latest: $update_data[\'new_version\'])

        $GLOBALS[\'se_plugin_has_update_data\'] = $update_data;

        add_action( \'admin_notices\', function() {

            global $se_plugin_has_update_data;
            $update_data = $se_plugin_has_update_data;

            ?>

                <div id="updated" class="error notice is-dismissible">
                    <p><?php echo sprintf(
                        "\\"%s\\" plugin has updates available. You are running v. %s while the latest version is %s",
                        $update_data[\'name\'],
                        $update_data[\'version\'],
                        $update_data[\'new_version\']
                    ); ?></p>
                </div>

            <?php
        });

    }

});
希望这有帮助。

相关推荐

重置插件版本缓存|PRE_SET_SITE_TRANSPENT_UPDATE_PLUGINS

在我的插件中,我使用这些过滤器进行自动更新并检查许可证。add_filter( \'pre_set_site_transient_update_plugins\', array( &$this, \'check_for_update\' ) ); add_filter( \'plugins_api\', array( &$this, \'plugin_api_call\' ), 10, 3 ); 但正如我所看到的,WordPress在我的插件中更改了版本标签后,会调用该过