更新插件后重定向到欢迎页面

时间:2017-02-02 作者:John

我正在更新WordPress插件,其中有一些主要更改,需要在用户更新插件后向他们解释这些更改。如果用户手动安装插件,我可以将其重定向到欢迎页面,就像我可以使用激活挂钩一样,但如果用户从WordPress插件页面更新插件,则无法工作。

我当前使用的方法在激活挂钩中设置了一个瞬态:

set_transient( \'_abc_activation_redirect\', true, 30 );
如果存在瞬态,则重定向用户:

add_action( \'admin_init\', \'abc_welcome_screen_do_activation_redirect\' );
function abc_welcome_screen_do_activation_redirect() {
    // Bail if no activation redirect
    if ( ! get_transient( \'_abc_activation_redirect\' ) )
        return;

    // Delete the redirect transient
    delete_transient( \'_abc_activation_redirect\' );

    // Bail if activating from network, or bulk
    if ( is_network_admin() || isset( $_GET[\'activate-multi\'] ) )
        return;

    wp_safe_redirect( admin_url( \'index.php?page=abc-welcome-page\' ) ); exit;
}
在WordPress插件页面上更新插件后,是否可以将用户重定向到欢迎页面?我在任何地方都找不到这个问题的答案!

非常感谢!

3 个回复
SO网友:Gonzoarte

有一个discussion a few years earlier 关于添加register_update_hook() 但它从未在核心上实现过。我们的想法是要有一个钩子,就像我们有一个用于激活的钩子一样register_activation_hook.

I am not sure 但我假设,当一个插件更新时,它会事先停用自己,然后悄悄地重新激活。如果是这样,那么您可能需要使用register_activation_hook 函数并使用创建选项add_option (参见下面的代码)。

如果我的假设是错误的,试着plugin deactivation 当用户单击更新按钮以便您可以使用挂钩时。

register_activation_hook(__FILE__, \'my_plugin_update\');
add_action(\'admin_init\', \'my_plugin_redirect\');

function my_plugin_update() {
 add_option(\'my_plugin_do_update_redirect\', true);
}

function my_plugin_redirect() {
 if (get_option(\'my_plugin_do_update_redirect\', false)) {
     delete_option(\'my_plugin_do_update_redirect\');
     wp_redirect(\'index.php?page=abc-welcome-page\');
 }
}

SO网友:JHoffmann

我认为在插件更新过程中重定向用户是一个非常糟糕的主意。我认为这有几个潜在的问题。

如果通过Ajax请求更新插件,则带有重定向的响应将不会在用户的浏览器窗口中加载该页面。

我还猜测插件在更新过程中不会输出重定向头之类的东西。

SO网友:ddur

在更新请求期间修改$\\u REQUEST[\'\\u wp\\u http\\u referer\',使用可用的回调将其重定向到所需的位置。方便的回调是函数update\\u option(/wp includes/option.php)中的过滤器

Why?

WordPress/wp管理/选项。php重定向回向Options API提交表单的插件。

文件:/wp admin/options。php第297行,WordPress 5.0.3

    /**
     * Redirect back to the settings page that was submitted
     */
    $goback = add_query_arg( \'settings-updated\', \'true\',  wp_get_referer() );
    wp_redirect( $goback );
    exit;
wp_get_referer()将调用wp_get_raw_referer()

function wp_get_raw_referer() {
    if ( ! empty( $_REQUEST[\'_wp_http_referer\'] ) ) {
        return wp_unslash( $_REQUEST[\'_wp_http_referer\'] );
    } else if ( ! empty( $_SERVER[\'HTTP_REFERER\'] ) ) {
        return wp_unslash( $_SERVER[\'HTTP_REFERER\'] );
    }

    return false;
}

How?

代替

    wp_safe_redirect( admin_url( \'index.php?page=abc-welcome-page\' ) ); exit;

在您的示例中

    add_filter( \'pre_update_option\', \'abc_on_pre_update_set_redirect\', 10, 2 );
并在下面添加功能

    function abc_on_pre_update_set_redirect( $value, $option ) {
        if ( $option === \'abc_option\' ) {
            $_REQUEST[\'_wp_http_referer\'] = admin_url( \'index.php?page=abc-welcome-page\' )
        }
        return $value;
    }

相关推荐

插件放置在/wp-content/plugins内的文件夹中时不保存值

我得到了WordPRess插件的以下代码,它在每个页面/后期编辑屏幕上添加了两个自定义输入。然后将这些值保存并输出到前端页面的标题中。如果代码位于内部,则可以正常工作。php文件并直接放入“wp内容/插件”。然而,如果我把它放在插件(如“wp-content/plugins/myplugin”)中自己的文件夹中,那么在通过编辑屏幕保存帖子/页面时,输入字段不会保存。此外,它不会向前端页面html标题部分输出任何内容。这似乎是一个被放弃的项目,所以我无法与原始开发人员一起制定解决方案。然而,代码中的某些内容