PHP 警告:call_user_func_array() 要求参数 1 为有效回调,未找到函数 'remove_wpcf7' 或函数名称无效

PHP Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'remove_wpcf7' not found or invalid function name

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

在过去的 12 个月里,我已经安装了 Google Authenticate 插件,该插件安装在我工作的一个由 WordPress 驱动的电子商务网站上。在最近的 VPS 和 WordPress 更新之前,插件没有任何问题。由于上述更新,Google 身份验证插件无法识别任何输入的代码。我不确定错误是由 WordPress 更新还是 VPS 本身触发的。

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

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

疑难解答

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

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

任何关于此的指示,将不胜感激......即使只是帮助我扩展这个问题。

在代码中查找对 'remove_wpcf7' 的任何引用,并在 filter/hook 中分配查找方法。 在这种情况下,您会发现 class 中的一个方法调用不正确。例如: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 扩展更好),你会看到行正在创建这个过滤器。

尝试将此功能添加到您的 WP。

这是要添加到主题 function.php 文件中的代码:

function remove_wpcf7(){
}

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

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

  1. 登录您的 VPS;
  2. 前往Tools & Settings > General Settings > System Time
  3. 在这里,您的屏幕应该类似于:

  4. 确保Date & Time > Update system timedeselected;

  5. 确保Network time > Synchronize system timeselected
  6. 然后在 Network time > Domain name or IP 中输入 3.pool.ntp.org 和 select 'Ok'。这是我需要做的这一步,以解决我自己的问题。

如果您是因为 Timber/Twig 来到这里,这是将 add_filter 与 timber/context 一起使用的正确方法示例:

add_filter('timber/context', function($context) {
    $context['promo_modal'] = get_field('promo_modal', 'option');
    return $context;
});