#php #wordpress #hook #multiple-users
#php #wordpress #хук #многопользовательский
Вопрос:
Предыстория
При добавлении определенной роли (рефери) в профиль я добавляю страницу профиля с пользовательским типом записи и связываю ее с этим пользователем с помощью мета-значения как для записи, так и для пользователя. Я также проверяю, был ли пользователь ранее этой ролью (по мета-значению для этого пользователя), а затем соответствующим образом добавляю / редактирую их страницу профиля.
Все это отлично работает, когда я добавляю роль со страницы редактирования пользователем http://localhost:8888/wp-admin/user-edit.php?user_id={SOME USER ID}
Проблема
Но когда роль добавляется (или удаляется) с помощью кнопок массовых действий на /wp-admin/users.php
(Редактировать ссылку на страницу), 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) amp;amp; (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) amp;amp; (!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) amp;amp; (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);
Ответ №1:
Обновление: Найдено решение
Итак, я не думаю, что profile_update
хук работает так, как предполагалось, или я использую его неправильно в любом случае. я обнаружил, что он profile_update
запускался до того, как были отправлены обновления для post / user, что означало, что если бы я проверял значения meta, они были бы старыми, хотя в WP Docs говорится, что он передает старые значения для пользователя в качестве переменной вызываемой функции, что, как меня позабавило, означало, что если я запрашиваю метазначение в функции, оно будет обновленным.
Если вам нужен хук, который проверяет, есть ли он metavalue
у любого post type
(даже у пользователя) и, что более важно, срабатывает ПОСЛЕ отправки обновления в таблицы данных, используйте 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
в конце, если вы обновляете meta пользователя, иначе я предполагаю, что он застрянет в бесконечном цикле
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);
}
(Бесконечный цикл — это предположение, поскольку это случалось со мной раньше при использовании другого хука)