Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/WordPress——在绑定时添加_操作调用的绑定参数_Php_Wordpress - Fatal编程技术网

PHP/WordPress——在绑定时添加_操作调用的绑定参数

PHP/WordPress——在绑定时添加_操作调用的绑定参数,php,wordpress,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'); 例如,在b

我想这样做:

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\u core\u activate\u account
事件中,我想将事件附加到
wp\u footer
。我遇到的问题是,内部函数
footer\u callback
似乎无法访问传递给
activate\u account\u callback
$user\u id
参数(我不是PHP程序员,也不完全确定PHP作用域是如何工作的)

所以我想做的是以某种方式创建一个新函数,它不接受任何参数,但可以访问
$user\u id
变量

因此,我想解决这个问题的方法归结为想要做到这一点:

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


或者,如果这是一种天生愚蠢的做事方式,我愿意接受其他建议。

在这样的函数中调用函数不是很标准,你也不需要这样做。激活的用户也是登录WordPress的用户吗?如果您只需使用
wp\u get\u current\u user()
,就可以节省一些工作量

如果需要在钩子之间将$user_id从一个函数传递到另一个函数,则不能直接传递它,函数的范围也不适合您。可以使用全局变量,也可以使用带有静态变量的函数

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

  • 不幸的是,在激活帐户时,用户实际上没有登录(这是一个单独的步骤)因此,
    wp\u get\u current\u user
    不适用。这个答案看起来很有用,虽然我觉得没有全局变量会更好。全局变量,不管大家怎么说,实际上对这个目的很有用。你需要将一个值传递到你的代码的完全不同的部分。我添加了一个静态v变量选项,它更难看,有更多的行,但没有全局变量。另一个选项是使用带有
    define
    的常量,但这与全局变量没有太大区别。是的,你说得对,它很有用,静态变量实际上并不比全局变量差,而是一个将局部函数转换为g的解决方案我认为,解决范围界定问题比两者都好。当你说它不能同时用于多个用户激活时,如果两个人尝试快速连续激活他们的帐户,这是否适用于竞争条件?我不需要批量激活。你能详细说明“只需切换到阵列”吗为此?事实上,我怀疑这种情况是否会发生,除非您是管理员并使用“批量编辑”手动激活多个帐户选项。如果两个用户同时从不同的计算机激活,则没有问题。只有在同一请求下,为不同的用户运行两次
    activate\u account\u callback
    函数。此外,关于全局函数与静态函数与局部函数。这真的没有什么区别。正确的方法是e为原始插件(buddypress,是吗?)设置全局可访问的用户ID。因此,不仅您的脚本,buddypress插件也使用相同的变量。不过,我在源代码中没有看到该变量,这就是我的代码的用途(一种变通方法)。
    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');