WP_List_Table 批量操作管理员通知

WP_List_Table bulk action admin notice

我正在使用 WordPress WP_List_Table 来显示所有请求列表,我有自定义批量操作来批准和拒绝用户请求但是每当执行批量操作时,我想添加管理员通知但它不起作用,我认为页面正在重定向。

function process_bulk_action() {
    if( 'approve'===$this->current_action() )
    {
        $objCustomUserRoles = new CustomUserRoles();
        if(!empty($_REQUEST['wp_premium_users_request']))
        {
           foreach ($_REQUEST['wp_premium_users_request'] as $key => $value) 
           {
               $objCustomUserRoles->updateCustomerToPremium($value);
           }
           add_action( 'admin_notices', 'my_update_notice');
        }
    }
}

function my_update_notice() {
?>
<div class="updated notice">
    <p><?php _e( 'User approved!', 'avia_framework' ); ?></p>
</div>
<?php
}   

您的 add_action( 'admin_notices', 'my_update_notice'); 行很好,您在那里附加的动作处理函数也很好。那么,问题就与调用您正在使用的 process_bulk_action() 函数的确切时间和地点有关。

记住,WordPress 中的 admin_notices 挂钩是 fired in the header。如果您的 process_bulk_action() 功能被一个主题或插件使用,而该主题或插件实际上已经连接到另一个实际发生的动作 之后 admin_notices 事件已经发生,那么您的通知将永远不会被看到。没有错误,什么都没有。你只是上钩太晚了。

要更正此问题,请将此 process_bulk_action() 函数的用法移至较早的挂钩;即,在 admin_notices 发生之前被解雇。我建议 admin_init。这样你的动作处理程序就会在应该的时候被调用,并且通知将按预期显示。

另外请确保您没有任何 other 代码会在甚至可以看到通知;即,如果用户在 HTML 标记加载之前被重定向,那么通知也不会被看到。


旁白:您发布的代码容易受到各种攻击。请务必在使用前正确清理您正在处理的请求数据。

简而言之,您无法确定(除非您检查)$_REQUEST['wp_premium_users_request'] 实际上是一个数组。此外,您无法确定数组实际包含的内容。因此,在使用来自 Web 浏览器表单提交的不受信任的数据源中的任何内容之前,请务必 validate/sanitize 彻底。

此外,请务必use and verify an Nonce