WordPress的更新插件钩/动作?从3.9开始


15

我已经对此进行了几次研究,但是我的搜索没有发现很多东西,除了自定义代码,这可能不是WordPress的良好实践。

从最新版本(WordPress 3.9“ Smith”)开始,插件更新过程中是否已添加钩子?我之所以问是因为这是一个非常基本的需求,但我还没有看到它被添加到了食典中。如果不是,那么开发人员采用的通用和最佳实践是什么?

编辑:只是为了澄清,我不是在谈论激活,而是关于更新,这样,如果数据库中有更改,否则可以解决。



@drzaus答案是没有好的做法。
Rens Tillmann

@RensTillmann从这已经过时了两年,链接的q / a基本上具有相同的答案,但是比这个问题早了两年,因此是“重复的”。
drzaus

Answers:


16

我认为未添加任何操作。您可以查看任何版本的版本详细信息,并查看添加的任何新操作。

在插件更新WordPress的方式来运行的代码是什么是描述在这里

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

在这里有代码示例:

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

谢谢-我将简单地使用该方法。WP实际上必须为此添加一个操作:D
user1915665 2014年

8
从技术上讲,您应该使用register_activation_hook,因为在大多数情况下,每当您从管理员更新插件时,都会停用/激活该插件。挂钩plugins_loaded将对每个页面加载(包括前端)进行检查。有人在谈论引入register_update_hook,但前一阵子标记为WONTFIX。那里的讨论很有帮助。
drzaus 2014年

4
重要的是要了解,大量插件更新不会运行激活挂钩-应该,但在3.9.2上不会。“大量更新”是指从仪表板更新页面完成的更新。在插件页面内完成的各个更新运行钩子就很好了。
Brian C

4
问题是插件也可以通过FTP更新,这意味着在任何情况下都不会触发该挂钩。这就是为什么您需要求助于存储在数据库中的选项的原因。
giraff's

4
为了扩展@giraff的评论,使用SVN或Git之类的源代码管理代码的人也是如此。因此,此答案处理升级的最佳方法。
doublesharp

3

在他们决定不添加特定于升级的自定义挂钩/功能讨论中,这听起来像是“大多数人”(截至4年前)register_activation_hook,因为它是通过管理页面升级插件时调用的;从那以后,我见过的大多数示例都遵循这种趋势。

对于大多数用法,我建议不要通过进行钩接plugins_loaded,因为它将在每次页面加载时调用。在讨论中提到了此例外:通过FTP / SVN的升级路径是“边缘情况”,因为WP并没有一种机制来知道插件已被更改,在这种情况下,先前的答案可能更有意义。

有关使用的“简单框架”示例,请参见https://gist.github.com/zaus/c08288c68b7f487193d1register_activation_hook


register_activation_hook不能保证要在更新运行,见make.wordpress.org/core/2010/10/27/...
Flimm

非常多-请勿使用plugins_loaded-运行所有负载,并且可能很累/很慢。
random_user_name

3

从WordPress 3.9开始,您可以使用upgrader_process_completehook。
见参考文献12

这是一个示例代码:

<?php 
/**
 * Plugin Name: Test plugin 1
 * Plugin URI: http://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: 
 */


$wppstp1_version = '0.1.8';


add_action('upgrader_process_complete', 'wppstp1_upgrade', 10, 2);// will working only this plugin activated.
function wppstp1_upgrade(\WP_Upgrader $upgrader_object, $hook_extra)
{
    global $wppstp1_version;

    if (is_array($hook_extra) && array_key_exists('action', $hook_extra) && array_key_exists('type', $hook_extra) && array_key_exists('plugins', $hook_extra)) {
        // check first that array contain required keys to prevent undefined index error.
        if ($hook_extra['action'] == 'update' && $hook_extra['type'] == 'plugin' && is_array($hook_extra['plugins']) && !empty($hook_extra['plugins'])) {
            // if this action is update plugin.
            $this_plugin = plugin_basename(__FILE__);

            foreach ($hook_extra['plugins'] as $each_plugin) {
                if ($each_plugin == $this_plugin) {
                    // if this plugin is in the updated plugins.
                    // don't process anything from new version of code here, because it will work on old version of the plugin.
                    file_put_contents(WP_CONTENT_DIR . '/test.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND); // you will always get the previous version even you update to the new version.
                    // set transient to let it run later.
                    set_transient('wppstp1_updated', 1);
                }
            }// endforeach;
            unset($each_plugin);
        }// endif update plugin and plugins not empty.
    }// endif; $hook_extra
}// wppstp1_upgrade


add_action('plugins_loaded', 'wppstp1_runUpdatedPlugin');
function wppstp1_runUpdatedPlugin()
{
    global $wppstp1_version;

    if (get_transient('wppstp1_updated') && current_user_can('manage_options')) {
        // if plugin updated and current user is admin.
        file_put_contents(WP_CONTENT_DIR . '/test-update-by-transient.txt', 'v'.$wppstp1_version."\r\n", FILE_APPEND);// you will always get the updated version here.

        // update code here.

        // delete transient.
        delete_transient('wppstp1_updated');
    }
}// wppstp1_runUpdatedPlugin

插件更新后,它将使用set_transient()函数将任务设置为db 。不建议在调用upgrader_process_completehook时添加更新代码。
接下来,如果您浏览到其他管理页面,则该plugins_loaded挂钩将起作用,并且更新代码将在此处起作用。

请注意,必须激活此插件才能使更新挂钩正常工作。
这在激活插件上不起作用,因此,如果您想要在激活插件上起作用的代码,则必须对其进行编码register_activation_hook()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.