如何在wp-admin / users.php页面上添加/删除角色时触发“ profile_update”钩子? 或在这种情况下使用其他钩子

问题描述

背景

在向个人资料添加特定角色(裁判员)时,我在自定义帖子类型上添加个人资料页面,并将其链接到该用户,并在该帖子和该用户上均带有Meta值。我还将检查用户以前是否曾经担任过该角色(通过该用户的元值),然后相应地添加/编辑其个人资料页面

当我从用户编辑页面添加角色时,所有这些工作正常
http://localhost:8888/wp-admin/user-edit.PHP?user_id={SOME USER ID}

问题

但是,当从/wp-admin/users.PHPEdit page reference)上的批量操作/动作按钮添加(或删除)角色时,profile_update钩子不会不会被触发。

因此,有一种方法可以扩展profile_update包括来自/wp-admin/users.PHP 的更新,或者总共/wp-admin/users.PHP(或其他解决方案)?

尝试解决
我可以使用此过滤器add_filter('bulk_actions-users','__return_empty_array');
删除批量操作按钮,但找不到用于删除右侧操作按钮的过滤器。


有问题的代码

function site_refProfile_existingUser( $user_id,$old_user_data ){
  if ((get_user_Meta( $user_id,'wp_capabilities')[0]['referee'] !== null) && (Metadata_exists('user',$user_id,'ref_pageID'))) {
    $profileID = get_user_Meta( $user_id,'ref_pageID')[0];
    $postUpdateArgs = array(
      'ID'          => $profileID,'post_status' => "private"
    );
    wp_update_post($postUpdateArgs);
    error_log("making profile :".$profileID." private (User : ".$user_id.")");
  }
  elseif ((get_user_Meta( $user_id,'wp_capabilities')[0]['referee'] == null) && (!Metadata_exists('user','ref_pageID'))) {
    $refProfileName = "".get_user_Meta( $user_id,'first_name')[0]." ".get_user_Meta( $user_id,'last_name')[0]."";
    if(substr($refProfileName,-1)== 's'){
      $refProfileNameCleaned = $refProfileName."' ";
    } else{
      $refProfileNameCleaned = $refProfileName."'s ";
    }
    $refProfileArgs = array(
      'post_title'       =>  $refProfileNameCleaned."Profile",'post_excerpt'     => "Read {$refProfileNameCleaned}profile on Bootle Referees' Association's official website",'post_name'        => $refProfileName,'post_type'        => "refprofile",'post_status'      => "publish",'post_author'      => $user_id,);
    $refProfilePost = wp_insert_post($refProfileArgs);
    update_post_Meta( $refProfilePost,'profile_refID',$user_id);
    update_user_Meta( $user_id,'ref_pageID',$refProfilePost);
    update_user_Meta( $user_id,'user_url',get_the_permalink($refProfilePost));
    error_log("Creating profile :".$profileID." (User : ".$user_id.")");
  }
  elseif ((get_user_Meta( $user_id,'wp_capabilities')[0]['referee'] == null) && (Metadata_exists('user','post_status' => "publish"
    );
    wp_update_post($postUpdateArgs);
    error_log("Publishing profile :".$profileID." (User : ".$user_id.")");
  }
}
add_action( 'profile_update','site_refProfile_existingUser',10,2);

解决方法

更新:找到解决方案

因此,我认为profile_update钩子不会按其应有的方式工作,或者我在任何一种方式中都使用错误。我发现的是profile_update在发布帖子/用户的更新之前触发了,这意味着如果我要检查meta的值,即使在WP Docs中,它们也将是旧值。它说它将旧的值作为变量传递给用户,这是我调用的函数,这很有趣,这意味着如果我在函数中查询一个元值,它将是更新的值。

如果您需要一个钩子来检查任何metavalue(甚至是用户)上是否有post type(更重要的是触发 AFTER 之后),请使用{ {1}}(WP Docs)。

所以而不是

updated_{YOUR POST TYPE}_meta

我用了这个

add_action( 'profile_update','site_refProfile_existingUser',10,2);

如果要更新用户的元数据,还请确保在函数中开始add_action( 'updated_user_meta',2); ,在结尾remove_action,否则我认为它将陷入无限循环

add_action

(无限循环是在使用另一个钩子之前发生在我身上的一个假设)