You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向项目分配用户批量推送UM通知失败问题求助

问题分析与解决方案

看起来你遇到的是PHP变量作用域的核心问题,同时伴随$users数组在函数内无法正常访问的情况,导致通知推送逻辑完全失效。

核心问题拆解

  1. 变量作用域限制:你在函数外部定义的$ids属于全局变量,而PHP函数默认拥有独立的局部作用域,内部无法直接访问外部的全局变量——这就是为什么函数内调用$ids没有任何效果的根本原因。
  2. $users数组未在函数内初始化:当你把array_column($users, 'id')移到函数内部时,$users变量在函数的上下文里根本不存在(未被定义或引入),自然无法提取出有效的用户ID列表。

针对性解决方案

我们可以根据$users数组的来源,选择两种不同的修复方式:

方案1:如果$users是全局变量

在函数内部显式声明global $users;,让函数能访问到这个全局数组,再生成用户ID列表:

<?php 
/* #### 在'trigger_new_notification'函数外测试 #### 此代码可正常运行,例如打印出:'1, 8, 13' */
$ids = array_column($users, 'id');
$userid = implode(', ', $ids);
echo $userid;

/* #### 通知'trigger_new_notification'开始 #### */
add_action('um_before_profile_fields', 'trigger_new_notification', 100);
function trigger_new_notification( $args ) {
    global $um_notifications, $users; // 新增:引入全局的$users变量

    // 先获取用户ID列表,同时做空值判断避免无效执行
    $ids = array_column($users, 'id');
    if(empty($ids)) {
        return;
    }

    /* 获取项目相关信息 */
    $vars = array(
        "post_title" => get_post_field( 'post_title', $project_id ),
        "photo" => um_get_avatar_url( get_avatar( get_current_user_id(), 40 ) ),
        "member" => um_user('display_name'),
        "notification_uri" => cpm_url_project_details( $project_id )
    );

    /* 向所有分配用户发送通知 */
    foreach($ids as $row) {
        $um_notifications->api->store_notification( $row, 'new_action', $vars );
    }
}
do_action( 'um_before_profile_fields'); 
?>

方案2:如果$users需要在函数内动态获取

如果$users不是全局变量,而是需要从数据库或其他接口获取的,把获取用户列表的逻辑直接移到函数内部,确保在使用前完成初始化:

<?php 
/* #### 在'trigger_new_notification'函数外测试 #### 此代码可正常运行,例如打印出:'1, 8, 13' */
$ids = array_column($users, 'id');
$userid = implode(', ', $ids);
echo $userid;

/* #### 通知'trigger_new_notification'开始 #### */
add_action('um_before_profile_fields', 'trigger_new_notification', 100);
function trigger_new_notification( $args ) {
    global $um_notifications;

    // 1. 在函数内获取项目分配的用户列表(替换成你实际的获取逻辑)
    // 示例:假设通过自定义函数查询关联用户
    $users = get_assigned_project_users($project_id); 

    // 2. 提取用户ID列表并做空值判断
    $ids = array_column($users, 'id');
    if(empty($ids)) {
        return;
    }

    /* 获取项目相关信息 */
    $vars = array(
        "post_title" => get_post_field( 'post_title', $project_id ),
        "photo" => um_get_avatar_url( get_avatar( get_current_user_id(), 40 ) ),
        "member" => um_user('display_name'),
        "notification_uri" => cpm_url_project_details( $project_id )
    );

    /* 向所有分配用户发送通知 */
    foreach($ids as $row) {
        $um_notifications->api->store_notification( $row, 'new_action', $vars );
    }
}
do_action( 'um_before_profile_fields'); 
?>

额外提示

  • 加入if(empty($ids))判断可以避免当没有用户ID时执行无效循环,同时防止潜在报错。
  • 别忘了检查$project_id是否在函数内可用——如果它也是外部变量,同样需要通过global $project_id;引入,或者作为参数传递到函数中。

内容的提问来源于stack exchange,提问作者Fredrik J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:24:31