延迟操作直到前一个(挂钩)操作完成

时间:2022-02-04 作者:jbonlinea

我是新来的,所以我希望你会发现我的问题有足够的记录。我已经深入研究了一段时间了,还没有找到令人满意的解决方案,鄙视一些看似相关的!

基本上,我确实想在更新用户配置文件后做一些事情。

更具体地说,我想做的是更新后的用户有一个给定的角色。

在“中”;“我的书”;,我应该使用profile_update 钩子,这项工作,但只是在一定程度上。这是我的密码

add_action( \'profile_update\', \'my_custom_function\', 10, 2 );

function my_custom_function( $user_id ) {

    //get data from the updated user
    $user_info = get_userdata( $user_id );
          
                  
                 
    //check if user has the role XXX
    if ( in_array( \'my_custom_role\', (array) $user_info->roles ) ) {
        //do something

    }else {
        //do something else
    }

}
编辑-问题不在上面,实际上上面的代码本身就可以了。如果您遇到上述代码没有预期行为的情况,您可以尝试将优先级更改为25,甚至999以进行调试。

add_action( \'profile_update\', \'my_custom_function\', 999, 2 );
在我的情况下,我没有达到预期的行为,但问题同样不在上面的代码中

编辑-您如何(从何处)更改角色评论中提出了这个问题,这个问题非常重要。

我的第一个回答是:“我的第一个回答是:;我确实更改了wp dashboard用户配置文件编辑页面中的角色;。

但这只是部分正确。

这是正确的,因为我确实从wp dashboard user profile edit页面编辑了我的用户,但接下来会发生什么:

如果我确实更改了在用户配置文件的本机wp角色复选框中检查角色的角色,那么我的代码可以正常工作是的,在个人资料更新中,角色发生了变化,但在某种程度上(不要问我是哪一个,我还不知道)

编辑-关于paid membership pro设置的说明我确实设置了paid membership pro,它可以创建给定的wp用户角色并将其同步到给定的成员级别。

这一切都完美无瑕。

我在做什么:从wp dashboard用户编辑页面更改用户成员级别(在付费会员pro插件领域内)。

我发生了什么事,为什么要打开这个话题(如果来自原始问题,并进行了细微的澄清编辑)

因此,我确实在wordpress admin用户编辑页面中编辑用户,而真正奇怪的是,使用上面的代码,行为是:

保存用户档案而不更改角色-->;预期行为通过角色更改保存用户配置文件-->;这也意味着如果我改变角色,保存,然后再次保存,这是我第二次遇到预期的行为!但是在profil页面中,在第一次保存之后,更改就出现了(显然,否则我会在其他地方寻找问题)

经过一番阅读,我想这可能是因为当我的函数运行时,用户角色的变化还没有写在数据库中,但可能是不同的?(如何确定?)

因此,我一直在寻找一种方法来延迟我的功能。例如,我发现了一些帖子this one, 或this one, 但他们中没有一个人(还有许多其他人)能做到这一点。

实际上,我只有/需要一个函数,因此第一个函数本身不适用,而第二个函数导致my_custom_function 不获取$user_id 这需要做点什么。

我觉得没有办法解决这个问题很愚蠢,很惊讶以前没有解决过这个问题。

我希望我没有错过我眼皮底下的东西,如果有人能指点我,我会很高兴:)

当做

编辑-$user_info 不为空且包含

object(WP_User)#21062 (8) {
  ["data"]=>
  object(stdClass)#21063 (10) {
    ["ID"]=>
    string(2) "15"
    ["user_login"]=>
    string(9) "MyUserLogin"
    ["user_pass"]=>
    string(34) "XXXXXXXXXXX"
    ["user_nicename"]=>
    string(9) "MyUserNicename"
    ["user_email"]=>
    string(19) "[email protected]"
    ["user_url"]=>
    string(0) ""
    ["user_registered"]=>
    string(19) "2022-02-04 14:04:51"
    ["user_activation_key"]=>
    string(0) ""
    ["user_status"]=>
    string(1) "0"
    ["display_name"]=>
    string(5) "my name"
  }
  ["ID"]=>
  int(15)
  ["caps"]=>
  array(1) {
    ["my_custom_role"]=>
    bool(true)
  }
  ["cap_key"]=>
  string(22) "wp_XXXX_capabilities"
  ["roles"]=>
  array(1) {
    [0]=>
    string(12) "my_custom_role"
  }
  ["allcaps"]=>
  array(1) {
    ["my_custom_role"]=>
    bool(true)
  }
  ["filter"]=>
  NULL
  ["site_id":"WP_User":private]=>
  int(1)
}
编辑-评论谢谢你的许多有用的评论,我现在删除了一些我的答案,在上面的编辑中,它会更容易阅读;)

编辑-结论和后续问题我遇到的问题很可能与付费会员pro改变用户角色的方式有关。

我仍然不能真正理解为什么我不能在个人资料更新中获得新角色,并且仍然认为这是一个时间问题。最终,角色确实发生了变化,所以我应该能够抓住它。

<小时/>

1 个回复
SO网友:Bazdin

挂钩按顺序启动,以便降低优先级,使其在前一个之后运行。然而,如果它是一个完全不同的钩子,那么您必须查看它们的运行顺序,以查看您需要使用哪个钩子。

add_action( \'profile_update\', \'my_custom_function\', 15, 2 );

function my_custom_function( $user_id ) {

    //get data from the updated user
    $user_info = get_userdata( $user_id );
          
                  
                 
    //check if user has the role XXX
    if ( in_array( \'my_custom_role\', (array) $user_info->roles ) ) {
        //do something

    }else {
        //do something else
    }

}

相关推荐

Conditional action hooks

我正在开发一个使用AJAX的插件,但我在控制代码流方面遇到了困难。我想在运行条件后挂接函数。我的钩子在控制结构内部添加时不会启动,但在外部会启动。我还有一个触发AJAX请求的事件,这只能在用户点击触发事件后,在加载所有DOM之后发生。AJAX请求告诉PHP函数设置cookie。它设置了cookie,但在阅读关于cookie的PHP文档时,我发现它们只能在发送任何输出后设置,但我还是做到了这一点?我读过WordPress初始化序列,但这并没有帮助我解决这个问题。这是我的密码:add_action(\'wp_