无法从EDIT_USER_PROFILE_UPDATE挂钩添加管理员通知(通知未显示)?

时间:2019-06-12 作者:Blackbam

编写一个小插件我的代码如下:

add_action( \'edit_user_profile_update\', \'sulock_save_profile_fields\' );

function sulock_save_profile_fields( $user_being_edited_id ) {

    if(update_user_meta( $user_being_edited_id, \'sulock_permanently_locked\', $permlock)) {
        update_user_meta($user_being_edited_id, \'sulock_permlock_meta\',new Sulock\\LockMeta());
        if($permlock) {
            sulock_admin_notice(__(\'This user has been permanently locked by you.\',SULOCK_TEXTDOMAIN),\'notice notice-warning\');
        } else {
            sulock_admin_notice(__(\'This user has been permanently locked by you.\',SULOCK_TEXTDOMAIN),\'notice notice-warning\');
        }
    }
}

// a simplified function for admin notices
function sulock_admin_notice($message,$class) {
    add_action(\'admin_notices\',function() use ($message,$class) {
        printf( \'<div class="%1$s"><p>%2$s</p></div>\', esc_attr( $class ), esc_html( $message ) );
    });
}
Thesulock_admin_notice() 如果直接从代码调用函数,则该函数可以工作,但如果我从挂钩调用它,则不会显示通知。Nethertheless我假设钩子是在加载UI之前执行的,因此应该注册管理通知。

出了什么问题,我该如何解决?

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

WordPress将您重定向回user-edit.php 在成功更新用户后返回页面,因此admin_notices 在你的sulock_save_profile_fields(), 由于重定向,消息(您的自定义管理通知)永远不会显示。

解决这个问题的一种方法是通过wp_redirect filter:

// In sulock_save_profile_fields()
if ( update_user_meta( $user_being_edited_id, \'sulock_permanently_locked\', $permlock ) ) {
    update_user_meta( $user_being_edited_id, \'sulock_permlock_meta\', new Sulock\\LockMeta() );

    add_filter( \'wp_redirect\', function( $location ) use ( $permlock ) {
        return add_query_arg( \'permlock\', $permlock, $location );
    } );
}
然后钩住load-user-edit.phpuser-edit.php 页面已加载,并从此处添加管理员通知:(theupdated 以下项目由WordPress设置)

add_action( \'load-user-edit.php\', function(){
    if ( ! empty( $_GET[\'updated\'] ) && isset( $_GET[\'permlock\'] ) ) {
        if ( $_GET[\'permlock\'] ) {
            sulock_admin_notice(__(\'Message here.\', SULOCK_TEXTDOMAIN), \'notice notice-warning\');
        } else {
            sulock_admin_notice(__(\'Message here.\', SULOCK_TEXTDOMAIN), \'notice notice-warning\');
        }
    }
} );

Alternatively, you could (or might want to) use the transients API:

// In sulock_save_profile_fields()
if ( update_user_meta( $user_being_edited_id, \'sulock_permanently_locked\', $permlock ) ) {
    update_user_meta( $user_being_edited_id, \'sulock_permlock_meta\', new Sulock\\LockMeta() );

    set_transient( \'su_updated\', [ \'permlock\' => $permlock ], 30 );
}
还有钩子:

add_action( \'load-user-edit.php\', function(){
    if ( ! empty( $_GET[\'updated\'] ) ) {
        $data = get_transient( \'su_updated\' );
        if ( $data && $data[\'permlock\'] ) {
            sulock_admin_notice(__(\'Message here.\', SULOCK_TEXTDOMAIN), \'notice notice-warning\');
        } elseif ( $data ) { // the transient exists (not expired)
            sulock_admin_notice(__(\'Message here.\', SULOCK_TEXTDOMAIN), \'notice notice-warning\');
        }
    }
} );

相关推荐

在php中缓存值的首选方法

我有几个页面可以调用外部API来检索值。显然,每次加载页面时这样做的速度都非常慢。在有限的时间内缓存此值的首选方式是什么(我只需要每24小时缓存一次)。如果这很重要,我最终会扩展调用以进行一个大型调用,以获取另一个页面的JSON对象,并且需要将整个对象缓存24小时。我探索过的东西:静态文件,只是读取/写入itDatabase tablewp\\u缓存?(有一些措辞是关于如何在页面重新加载时不持久)wp total cache(我认为它可能只是pro)我对php不是很熟悉,所以我不确定框架中是否内置了一些东