向项目分配用户批量推送UM通知失败问题求助
问题分析与解决方案
看起来你遇到的是PHP变量作用域的核心问题,同时伴随$users数组在函数内无法正常访问的情况,导致通知推送逻辑完全失效。
核心问题拆解
- 变量作用域限制:你在函数外部定义的
$ids属于全局变量,而PHP函数默认拥有独立的局部作用域,内部无法直接访问外部的全局变量——这就是为什么函数内调用$ids没有任何效果的根本原因。 $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
相关产品推荐
相关产品推荐

