WordPress更新插件挂钩/操作?从3.9开始

时间:2014-05-20 作者:user1915665

我已经对此进行了几次研究,但我的搜索并没有透露太多信息,除了自定义代码,这些代码可能是好的WordPress实践,也可能不是好的WordPress实践。

截至最新版本(WordPress 3.9“Smith”),has a hook been added to the plugin update process? 我这样问是因为这是一个非常基本的需求,但我还没有看到它被添加到法典中。如果没有,开发人员使用的常见和最佳实践是什么?

编辑:我只是想澄清一下,我不是在谈论激活,而是关于更新,这样,如果数据库中有更改,或者其他可以解决的问题。

4 个回复
最合适的回答,由SO网友:Milo 整理而成

我认为没有添加任何操作。你可以look at version details 查看任何版本,并查看添加的任何新操作。

WordPress在插件更新上运行代码的方式如下所述here:

处理升级路径的正确方法是仅在需要时运行升级过程。理想情况下,您应该在插件的数据库选项中存储一个“版本”,然后在代码中存储一个版本。如果它们不匹配,您将启动升级过程,然后将数据库选项设置为与代码中的版本相等。这是多少插件处理升级,这也是核心的工作方式。

和代码示例here:

function myplugin_update_db_check() {
    global $jal_db_version;
    if (get_site_option( \'jal_db_version\' ) != $jal_db_version) {
        jal_install();
    }
}
add_action( \'plugins_loaded\', \'myplugin_update_db_check\' );

SO网友:vee

由于WordPress 3.9,您可以使用upgrader_process_complete 挂钩
升级程序完成后(插件和主题更新),将触发此挂钩。

参见参考1, 2, 3

下面是一个示例代码:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: https://rundiz.com
 * Description: A very simple plugin for testing. This plugin do nothing.
 * Version: 0.1.8
 * Author: Vee Winch
 * Author URI: http://rundiz.com
 * License: MIT
 * License URI: https://opensource.org/licenses/MIT
 * Text Domain: test-plugin1
 * Domain Path: 
 */


add_action(\'upgrader_process_complete\', \'testplugin_upgrade_completed\', 10, 2);
/**
 * Upgrader process complete.
 *
 * @see \\WP_Upgrader::run() (wp-admin/includes/class-wp-upgrader.php)
 * @param \\WP_Upgrader $upgrader_object
 * @param array $hook_extra
 */
function testplugin_upgrade_completed(\\WP_Upgrader $upgrader_object, $hook_extra)
{
    // get current plugin version. ( https://wordpress.stackexchange.com/a/18270/41315 )
    if(!function_exists(\'get_plugin_data\')){
        require_once(ABSPATH . \'wp-admin/includes/plugin.php\');
    }
    // https://developer.wordpress.org/reference/functions/get_plugin_data/
    $plugin_data = get_plugin_data(__FILE__);
    $plugin_version = ($plugin_data[\'Version\'] ?? \'unknown.version\');
    unset($plugin_data);

    if (
        is_array($hook_extra) && 
        array_key_exists(\'action\', $hook_extra) && 
        $hook_extra[\'action\'] == \'update\'
    ) {
        if (
            array_key_exists(\'type\', $hook_extra) && 
            $hook_extra[\'type\'] == \'plugin\'
        ) {
            // if updated the plugins.
            $this_plugin = plugin_basename(__FILE__);
            $this_plugin_updated = false;
            if (array_key_exists(\'plugins\', $hook_extra)) {
                // if bulk plugin update (in update page)
                foreach ($hook_extra[\'plugins\'] as $each_plugin) {
                    if ($each_plugin === $this_plugin) {
                        $this_plugin_updated = true;
                        break;
                    }
                }// endforeach;
                unset($each_plugin);
            } elseif (array_key_exists(\'plugin\', $hook_extra)) {
                // if normal plugin update or via auto update.
                if ($this_plugin === $hook_extra[\'plugin\']) {
                    $this_plugin_updated = true;
                }
            }
            if ($this_plugin_updated === true) {
                // if this plugin is just updated.
                // do your task here.
                // DON\'T process anything from new version of code here, because it will work on old version of the plugin.
                // please read again!! the code run here is not new (just updated) version but the version before that.
                file_put_contents(WP_CONTENT_DIR . \'/test.txt\', \'v\'.$plugin_version."\\r\\n", FILE_APPEND);
                // set transient to let it run later.
                set_transient(\'testplugin_just_updated\', 1);
            }
        } elseif (
            array_key_exists(\'type\', $hook_extra) && 
            $hook_extra[\'type\'] == \'theme\'
        ) {
            // if updated the themes.
            // same as plugin, the bulk theme update will be set the name in $hook_extra[\'themes\'] as \'theme1\', \'theme2\'.
            // normal update or via auto update will be set the name in $hook_extra[\'theme\'] as \'theme1\'.
        }
    }// endif; $hook_extra
}// testplugin_upgrade_completed


add_action(\'plugins_loaded\', \'testplugin_pluginloaded\');
/**
 * Run once plugin loaded (on every page load).
 */
function testplugin_pluginloaded()
{
    // get current plugin version. ( https://wordpress.stackexchange.com/a/18270/41315 )
    if(!function_exists(\'get_plugin_data\')){
        require_once(ABSPATH . \'wp-admin/includes/plugin.php\');
    }
    // https://developer.wordpress.org/reference/functions/get_plugin_data/
    $plugin_data = get_plugin_data(__FILE__);
    $plugin_version = ($plugin_data[\'Version\'] ?? \'unknown.version\');
    unset($plugin_data);

    if (get_transient(\'testplugin_just_updated\') && current_user_can(\'manage_options\')) {
        // if it was marked in transient that this plugin just updated and current user is admin.
        // you can use new verion of code here.
        file_put_contents(WP_CONTENT_DIR . \'/test-update-by-transient.txt\', \'v\'.$plugin_version."\\r\\n", FILE_APPEND);

        // your update code here.
        
        // delete transient when done to do not let this code run again.
        delete_transient(\'testplugin_just_updated\');
    }
}// testplugin_pluginloaded
Theupgrader_process_complete 当插件/主题更新时,钩子将与当前版本的代码一起运行。不使用新版本。

您有插件版本1.0,您可以运行更新页面或自动更新upgrader_process_complete 将调用挂钩upgrader_process_complete 挂钩plugins_loaded 将调用挂钩plugins_loaded 钩(必须激活插件。)我之前发布的代码中已经解释了这些内容(编辑之前),但可能不清楚或很难看到。

这个upgrader_process_complete 为此创建挂钩(请阅读参考链接3). 在升级完成后运行。

您可以使用plugins_loaded 用接受答案中的代码钩住。它确实有用,而且写得更短,或者你可能有更好的想法来使用它upgrader_process_complete

这个upgrader_process_complete 吊钩将在以下情况下工作:

通过更新页面进行更新当您通过FTP更新插件或主题时,上面的代码不起作用,因为它无法检测到瞬态选项。在这种情况下,接受的答案是您唯一的最佳选择。

SO网友:drzaus

discussion where they decided not to add a custom hook/function specific to upgrade, 听起来像是“大多数人”(4年前)使用register_activation_hook, 因为它是在插件通过管理页面升级时调用的;从那以后,我看到的大多数例子都遵循这一趋势。

对于大多数用法,我建议不要通过plugins_loaded, 因为每次加载页面时都会调用它。讨论中提到了例外情况:通过FTP/SVN的升级路径是“边缘情况”,因为WP没有机制知道插件已更改,在这种情况下previous answer 可能更相关。

看见https://gist.github.com/zaus/c08288c68b7f487193d1 对于“简单框架”示例,使用register_activation_hook.

SO网友:wp-overwatch.com

你可以在upgrader_pre_installupgrader_post_install 过滤器。

结束

相关推荐

如何将POST_ROW_ACTIONS()与自定义操作函数链接

我在下面定义了一个自定义帖子类型,我想添加一个自定义行操作,以允许我通过管理面板“更新”帖子class LeagueCpt { function __construct() { add_action( \'init\', array(&$this,\'registerLeagueCPT\')); add_filter(\'post_row_actions\', array(&$this,\'post_r