如何从 wp-admin/users.php 页面触发 'profile_update' 挂钩 adding/removing 角色? (或者在这种情况下使用什么其他钩子)
how to fire 'profile_update' hook on adding/removing roles from wp-admin/users.php page? (or what other hook to use in this case)
背景
在将特定角色(裁判)添加到个人资料时,我在自定义 post 类型上添加了一个 个人资料页面,并将其 link 添加给该用户post 和用户都有元值。我还检查用户以前是否担任过该角色(通过该用户的元值),然后相应地添加/编辑他们的个人资料页面。
当我从用户编辑页面添加角色时,所有这些都工作正常
http://localhost:8888/wp-admin/user-edit.php?user_id={SOME USER ID}
问题
但是当从 /wp-admin/users.php
(Edit page reference) 上的 bulk-actions / actions 按钮添加(或删除)角色时 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', $user_id, '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', $user_id, 'ref_pageID'))) {
$profileID = get_user_meta( $user_id, 'ref_pageID')[0];
$postUpdateArgs = array(
'ID' => $profileID,
'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
在 post/user 的更新被推送之前触发,这意味着如果我要检查元的值,它们将是旧的,即使在 WP Docs 它说它将用户的旧值作为变量传递给被调用函数,我觉得这意味着如果我在函数中查询元值,它将是更新后的值。
如果你需要一个钩子来检查任何post type
(甚至用户)上是否有任何metavalue
并且更重要的是触发AFTER更新被推送到数据表使用 updated_{YOUR POST TYPE}_meta
(WP Docs).
所以而不是
add_action( 'profile_update', 'site_refProfile_existingUser', 10, 2);
我用过这个
add_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
如果你正在更新用户的元数据,还要确保在你的函数中你在开始时 remove_action
并且在结束时 add_action
否则我认为它会陷入无限循环
function site_refProfile_existingUser( $meta_id, $user_id) {
remove_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
// your code.....
add_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
}
(无限循环是一个假设,因为它发生在我之前使用另一个钩子时)
背景
在将特定角色(裁判)添加到个人资料时,我在自定义 post 类型上添加了一个 个人资料页面,并将其 link 添加给该用户post 和用户都有元值。我还检查用户以前是否担任过该角色(通过该用户的元值),然后相应地添加/编辑他们的个人资料页面。
当我从用户编辑页面添加角色时,所有这些都工作正常
http://localhost:8888/wp-admin/user-edit.php?user_id={SOME USER ID}
问题
但是当从 /wp-admin/users.php
(Edit page reference) 上的 bulk-actions / actions 按钮添加(或删除)角色时 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', $user_id, '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', $user_id, 'ref_pageID'))) {
$profileID = get_user_meta( $user_id, 'ref_pageID')[0];
$postUpdateArgs = array(
'ID' => $profileID,
'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
在 post/user 的更新被推送之前触发,这意味着如果我要检查元的值,它们将是旧的,即使在 WP Docs 它说它将用户的旧值作为变量传递给被调用函数,我觉得这意味着如果我在函数中查询元值,它将是更新后的值。
如果你需要一个钩子来检查任何post type
(甚至用户)上是否有任何metavalue
并且更重要的是触发AFTER更新被推送到数据表使用 updated_{YOUR POST TYPE}_meta
(WP Docs).
所以而不是
add_action( 'profile_update', 'site_refProfile_existingUser', 10, 2);
我用过这个
add_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
如果你正在更新用户的元数据,还要确保在你的函数中你在开始时 remove_action
并且在结束时 add_action
否则我认为它会陷入无限循环
function site_refProfile_existingUser( $meta_id, $user_id) {
remove_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
// your code.....
add_action( 'updated_user_meta', 'site_refProfile_existingUser',10, 2);
}
(无限循环是一个假设,因为它发生在我之前使用另一个钩子时)