我想这样做:
function activate_account_callback($user_id) {
function footer_callback() {
// Do some stuff with $user_id
};
add_action('wp_footer', footer_callback);
};
add_action('bp_core_activate_account', 'activate_account_callback');
ie。,在bp_core_activate_account
事件上,我想给wp_footer
附加一个事件。我遇到的问题是,内部函数footer_callback
似乎无法访问传递给activate_account_callback
的$user_id
参数(我不是PHP程序员,我不完全确定PHP作用域是如何工作的)。
所以我想做的是以某种方式创建一个新函数,它不接受参数,但可以访问$user_id
变量。
所以我想解决这个问题的方式归结为想要这样做:
function func1($arg) {
echo($arg);
}
function func2 = some_magic($func1, 3);
func2(); // Should echo "3"
然后我可以使用func2
函数并将其传递给内部add_action
。我只是不知道some_magic
应该是什么。
如果这本身就是一种愚蠢的做事方式,我愿意接受其他建议。
像这样在函数中调用函数并不是很标准,而且您也不需要这样做。激活的用户也是登录WordPress的用户吗?如果你能直接使用wp_get_current_user()
,那就省事了。
如果你需要携带$user_id从一个函数到另一个,在钩子之间,你不能直接转移它,函数的作用域将不适合你。你可以使用全局变量,或者使用带有静态变量的函数。
使用全局变量
function activate_account_callback($user_id) {
global $bpcore_activated_uid;
$bpcore_activated_uid = $user_id;
add_action('wp_footer', activate_account_footer);
};
function activate_account_footer() {
global $bpcore_activated_uid;
if ( !$bpcore_activated_uid ) return;
echo "Activated user ID: " . $bpcore_activated_uid;
}
add_action('bp_core_activate_account', 'activate_account_callback');
(Update)使用静态变量
我们将以这种方式调用目标两次,第一次将仅用于捕获用户ID。一旦被捕获,以后的调用就已经有这个值了。要使用这个而不是全局变量的唯一真正原因是,在其他任何地方都不需要用户ID。
function activate_account_callback($user_id) {
activate_account_footer( $user_id ); // Pass the user ID
add_action('wp_footer', activate_account_footer);
};
function activate_account_footer($u = null) {
static $user_id = null;
if ( $u && !$user_id ) {
$user_id = $u;
return; // capture and abort
}
if ( !$user_id ) return; // In case we never provide the value, abort
echo "Activated user ID: " . $user_id ;
}
add_action('bp_core_activate_account', 'activate_account_callback');
指出:
- 我不熟悉所涉及的插件,但我认为你可以通过插件提供的全局变量访问用户ID。有些像
$bp
(存在,但我不知道它是否包含ID)。 - 这两个选项都不是为一次多个用户激活而构建的。如果此函数用于批量操作,则可能会出现问题。如果需要多用户支持,只需切换到数组(静态变量 )。