PHP / WordPress - 在绑定时将参数绑定到add_action调用

时间:2014-08-05 04:11:07

标签: php wordpress

我想做这样的事情:

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

即,bp_core_activate_account事件我要将事件附加到wp_footer。我遇到的问题是内部函数footer_callback似乎无法访问传递给$user_id的{​​{1}}参数(我不是一个PHP程序员,我不完全确定PHP作用域是如何工作的。)

所以我想做的就是以某种方式创建一个不带参数但可以访问activate_account_callback变量的新函数。

因此,我想解决问题的方式归结为希望这样做:

$user_id

然后我可以使用function func1($arg) { echo($arg); } function func2 = some_magic($func1, 3); func2(); // Should echo "3" 函数并将其传递给内部func2。我只是不知道add_action应该是什么。

或者,如果这是一种固有的愚蠢做事方式,我可以接受其他建议。

1 个答案:

答案 0 :(得分:1)

在类似函数中调用函数不是很标准,无论如何都不需要这样做。被激活的用户也是登录到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');

(更新)使用静态变量

我们将以这种方式调用目标两次,第一次将仅用于捕获用户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. 这两个选项都不能同时用于多个用户激活。如果此功能用于批量操作,则可能存在问题。如果您需要多个用户支持,只需切换到一个数组(静态变量