PHP/WordPress——在绑定时绑定add_action调用的参数


PHP/WordPress -- bind arguments to add_action call at bind time

我想这样做:

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');

指出:

  1. 我不熟悉所涉及的插件,但我认为你可以通过插件提供的全局变量访问用户ID。有些像$bp(存在,但我不知道它是否包含ID)。
  2. 这两个选项都不是为一次多个用户激活而构建的。如果此函数用于批量操作,则可能会出现问题。如果需要多用户支持,只需切换到数组(静态变量
  3. )。