使用更新更改插件插件

时间:2015-12-14 作者:Xaver

我的插件在文件和文件夹中使用camelCase

myPlugin/myPlugin.php
我在插件更新中遇到了几个问题。大多数都很好用,这更像是一件装饰性的事情,但在一些地方,我喜欢用小写字母。

将插件更新为的最佳方法是什么(或者有什么方法)

myplugin/myplugin.php
没有欺骗用户?

请注意,这是一个自定义插件,在repo上不可用,是的,我必须首先使用小写。

2 个回复
SO网友:grappler

如果您只想更改文件名,您可以同时使用myPlugin.phpmyplugin.php 在插件中,然后更新选项active_plugins 在数据库中使用新名称。所有用户更新后,您可以删除myPlugin.php.

但您希望同时重命名文件夹和文件名。

我会得到myPlugin/myPlugin.php 安装并激活myplugin/myplugin.php. 一旦myplugin/myplugin.php 已安装myplugin/myplugin.php 可以删除myPlugin/myPlugin.php

您可以使用TGM Plugin Activation 用于安装和激活新插件。使包含检查,以便新版本和旧版本不会同时运行。

您可以使用deactivate_plugins()delete_plugins() 停用并卸载插件。

SO网友:Xaver

好的,我在短期内对它进行了一些研究/测试:

Don\'t use uppercase in the first place!

我目前只注意到一个问题,即插件概述中基于ajax的更新(在WP 4.2中介绍)会引发JS错误,但这可能是将来的问题。

这是因为ajax响应使用sanitize_keywp_ajax_update_plugin 方法(browse in trac).

The sanitize_key method 消毒a旁边是否有strtolower 这会导致“myPlugin“获取”myplugin“。

这个updateSuccess 方法现在尝试更新slug所在的行“myplugin“代替”myPlugin“。

可以通过更改line 694 在里面wp-admin/includes/class-wp-plugins-list-table.php 从…起

    printf( "<tr id=\'%s\' class=\'%s\' data-slug=\'%s\'>",
        $id,
        $class,
        $plugin_slug
    );

    printf( "<tr id=\'%s\' class=\'%s\' data-slug=\'%s\'>",
        $id,
        $class,
        sanitize_key($plugin_slug)
    );
待办事项:公开票证Ticket #35032

To answer the initial question

您可以在插件更新时更改slug,但必须注意以下事项:

以下代码必须包含在旧版本中(例如\'myPlugin/myPlugin.php)

  • 更新版本must 有一个\'myplugin/myplugin的slug。php不使用delete_plugin() 这可能会触发卸载。php和删除插件数据

    //hook into when new plugin has been successfully updated
    add_filter( \'upgrader_post_install\', \'my_move_plugin_slug\', 10 ,3 );
    
    function my_move_plugin_slug($should_be_true, $hook_extra, $result){
    
        global $wpdb, $wp_filesystem;
    
        $from = \'myPlugin/myPlugin.php\';
        $to = \'myplugin/myplugin.php\';
    
        //some general checks
        if(!$should_be_true || !isset($hook_extra[\'plugin\']) || $hook_extra[\'plugin\'] != $to) return $should_be_true;
    
        $old_destination = $result[\'local_destination\'].\'/\'.dirname($from).\'/\';
    
        //old location doesn\'t exist (anymore)
        if(!is_dir($old_destination)) return $should_be_true;
        //new location is the same as the old one
        if($old_destination == $result[\'destination\']) return $should_be_true;
    
        //do the magic
    
        //rewrite location in the database
        echo \'<p>Moving the plugin to new location… \';
        if(false !== $wpdb->query($wpdb->prepare("UPDATE {$wpdb->options} SET `option_value` = replace(option_value, %s, %s)", $from, $to))){
            echo \'<strong>done</strong>\';
        }
        echo \'</p>\';
    
        //delete folder
        echo \'<p>Removing the old directory of the plugin… \';
        if($wp_filesystem->delete( $old_destination , true )){
            echo \'<strong>done</strong>\';
        }
        echo \'</p>\';
    
    }
    

    Second method

    如果你有一个像我这样的插件,专门的批量更新进度,你可以使用这段代码,我认为这段代码更安全,因为它是由显式用户交互触发的,不需要wp\\U文件系统:

    function do_change_plugin_slug(){
    
        global $wpdb;
    
        $from = \'myMail/myMail.php\';
        $to = \'mymail/mymail.php\';
    
        $old_destination = WP_PLUGIN_DIR.\'/\'.$from;
        $new_destination = WP_PLUGIN_DIR.\'/\'.$to;
    
        //old location doesn\'t exist (anymore)
        if(!file_exists($old_destination)) return true;
        //new location is the same as the old one
        if($old_destination == $new_destination) return true;
    
        //do the magic
    
        echo \'Removing the old file of the plugin… \';
        if(rename( $old_destination , dirname($old_destination).\'/\'.basename($new_destination) )){
            echo \'done\';
        }else{
            echo \'failed\';
        }
        echo "\\n";
    
        echo \'Removing the old directory of the plugin… \';
        if(rename( dirname($old_destination) , dirname($new_destination) )){
            echo \'done\';
        }else{
            echo \'failed\';
        }
        echo "\\n";
    
        //rewrite location in the database
        echo \'Moving the plugin to new location… \';
        if(false !== $wpdb->query($wpdb->prepare("UPDATE {$wpdb->options} SET `option_value` = replace(option_value, %s, %s)", $from, $to))){
            echo \'done\';
        }else{
            echo \'failed\';
        }
        echo "\\n";
    
        return true;
    
    }
    
    最后,您应该始终确保用户了解发生了什么和/或为什么这是一个必要的步骤。

  • 相关推荐

    WP plugin updates

    我为WordPress编写了一个插件,需要定期更新。是否可以通知用户新版本可用(其他一些插件具有某种类型的此选项-当新版本可用时,用户可以在其管理面板中查看并更新-所有内容都使用一些内置的WP功能…)