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

问题描述 投票:0回答:1

背景

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

当我从用户编辑页面添加角色时,所有这些都工作正常

http://localhost:8888/wp-admin/user-edit.php?user_id={SOME USER ID}


问题

但是,当从/wp-admin/users.php

)上的Edit 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', $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);
php wordpress hook multiple-users
1个回答
1
投票

更新:找到解决方案

所以我不认为

profile_update
钩子按其应有的方式工作,或者我使用它是错误的。我发现,
profile_update
在帖子/用户的更新被推送之前触发,这意味着如果我要检查元的值,它们将是旧的,即使在WP文档中它说它将用户的旧值作为变量传递给被调用的函数,我觉得这意味着如果我在函数中查询元值,它将是更新后的值。

如果您需要一个钩子来检查任何

metavalue
(甚至用户)上是否有
post type
,更重要的是在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);
}

(无限循环的事情是一个假设,因为它之前在使用另一个钩子时发生在我身上)

© www.soinside.com 2019 - 2024. All rights reserved.