как запустить хук ‘profile_update’ при добавлении / удалении ролей со страницы wp-admin/users.php ? (или какой другой хук использовать в этом случае)

#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);
}
  

(Бесконечный цикл — это предположение, поскольку это случалось со мной раньше при использовании другого хука)