代码之家  ›  专栏  ›  技术社区  ›  Craig

PHP警告:call_user_func_array()要求参数1是有效的回调函数,未找到函数“remove_wpcf7”或函数名无效

  •  0
  • Craig  · 技术社区  · 6 年前

    对于这个宽泛的问题,我深表歉意,但目前我对错误日志条目并不十分熟悉。任何关于从何处开始相关研究的指示,将不胜感激。

    在过去的12个月里,我在我工作的一个WordPress电子商务网站上安装了Google Authenticate插件。直到最近的VPS和WordPress更新,插件才出现问题。由于上述更新,谷歌认证插件不识别任何输入的代码。我不确定这个错误是由WordPress更新还是VPS本身触发的。

    然后我检查了 error_log 并在尝试使用Google Authenticate插件时看到以下条目:

    mod_fcgid: stderr: PHP Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'remove_wpcf7' not found or invalid function name in /var/www/vhosts/example.com/httpdocs/wp-includes/class-wp-hook.php on line 286, referer: https://www.example.com/wp-admin/plugins.php
    

    故障排除

    作为标准,我停用了所有的插件(除了woomerce插件)以及我创建的WordPress主题。然后我简单地激活了WordPress' Twenty Seventeen 主题。这个错误仍然存在;让我想知道是什么导致了这个问题。

    我可以看到有一个对WordPress核心文件的引用。也许有一些不相容的地方?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Santiago Cerro López    6 年前

    在代码中查找对“remove_wpcf7”的任何引用,并在filter/hook中分配Find方法。 在这种情况下,您可以发现,例如,类中的方法调用不正确。例如: add_filter('filter_name', 'method'); . 例如,可以通过添加: add_filter('filter_name', array($this, 'method')); 或者如果方法是静态的: add_filter('filter_name', array(CLASSNAME::class, 'method'));

    ===

    编辑wp includes/class-wp-hook.php第73行并添加:

        public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) {
            if ($function_to_add === 'remove_wpcf7') {
                throw new \Exception('Exception');
            }
            [...]
        }
    

    跟踪这个未捕获的异常(如果您可以使用xdebug扩展,它会更好),您将看到line正在创建这个过滤器。

        2
  •  0
  •   Ivnhal    6 年前

    尝试将此函数添加到WP中。

    function remove_wpcf7(){
    }
    
        3
  •  0
  •   Craig    6 年前

    终于找到了解决办法。。。它与服务器时间设置有关。

    如果其他人的Google身份验证功能遇到类似问题,则需要确保服务器的时间设置与“互联网时钟”同步。

    1. 登录到你的VPS;
    2. 前往 Tools & Settings > General Settings > System Time ;
    3. enter image description here

    4. 确保 Date & Time > Update system time 取消选择

    5. 确保 Network time > Synchronize system time 挑选出来的 ;
    6. 然后在里面 Network time > Domain name or IP 3.pool.ntp.org 然后选择“确定”。就是这一步,为了解决我自己的问题,我需要这样做。
    推荐文章