过滤器钩子回调错误,是因为在过滤器中使用了$This还是其他原因?

时间:2017-02-07 作者:CoderScissorhands

我试图应用一个过滤器,但我得到了一个回调错误,我不知道为什么。我想这可能与我使用的过滤器包括$this 因为我从插件中提取了函数,而提取的函数最初包装在一个类中。

这是错误:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in /wp-includes/class-wp-hook.php on line 298

基于@toscho的回答here, 我认为回调错误可能与$this 但无法完全理解如何将逻辑应用于此过滤器。

这是我在functions.php 文件

 add_filter( \'wp_get_attachment_image_src\', array( $this, \'fix_wp_get_attachment_image_svg\' ), 10, 4 );  /* the hook */

     function fix_wp_get_attachment_image_svg($image, $attachment_id, $size, $icon) {
        if (is_array($image) && preg_match(\'/\\.svg$/i\', $image[0]) && $image[1] == 1) {
            if(is_array($size)) {
                $image[1] = $size[0];
                $image[2] = $size[1];
            } elseif(($xml = simplexml_load_file($image[0])) !== false) {
                $attr = $xml->attributes();
                $viewbox = explode(\' \', $attr->viewBox);
                $image[1] = isset($attr->width) && preg_match(\'/\\d+/\', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null);
                $image[2] = isset($attr->height) && preg_match(\'/\\d+/\', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null);
            } else {
                $image[1] = $image[2] = null;
            }
        }
        return $image;
    }
$this 有没有一种实例方法可以让这项工作正常进行?如果有,我想看看如何修复代码的示例。

谢谢

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

问题是WordPress使用call_user_func()call_user_func_array() 允许插件/主题开发人员添加callables 到挂钩。可调用项或回调函数可以是简单函数、对象方法或静态类方法。我们需要根据需要的回调类型,将可调用文件格式化为字符串或数组。

简单函数创建一个可调用的简单函数只不过是函数的字符串,例如。\'my_callable_function\'. 这将尝试调用全局命名空间函数my_callable_function(). 还可以添加命名空间函数-\'\\MyNamespace\\my_callable_function\' - 这将调用my_callable_function() 功能位于MyNamespace 命名空间。请参见PHP documentation 有关命名空间的详细信息。

对象方法

伪变量$this 从对象上下文中调用方法时可用。看见OOP basics. 如果您不熟悉面向对象编程,$this 基本上是指当你已经“在”这个类中时的类。如果要将类的方法作为回调调用,我们可以在可调用回调中使用它。在这种情况下,回调需要是一个数组,第一个索引是对象,第二个索引是方法。[ $this, \'MyMethod\' ] 是有效回调(只要MyMethod方法存在)。

我们还可以将任何对象用作可调用对象,而不仅仅是当前对象。那样的话,我们可以使用[ new MyObject(), \'MyMethod\' ]. 这将首先创建MyObject对象,然后使用MyMethod方法作为可调用对象。

静态类方法

此外,我们可以在callable中使用静态类方法。[ \'MyClass\', \'MyMethod\' ] 将尝试静态调用MyClass中的MyMethod方法。

解决方案在这种情况下这意味着什么?

当我查看提供的代码时,我们发现原来的callable是array( $this, \'fix_wp_get_attachment_image_svg\' ). 要使其工作,我们需要已经“在”一个类中,并引用要调用的同一个类中的方法。相反,我们看到fix\\u wp\\u get\\u attachment\\u image\\u svg()是全局命名空间中的一个函数,因此可调用的是命名函数的字符串。

因此,解决方案是修复可调用项,使其指向正确的函数。在这种情况下:

 add_filter( \'wp_get_attachment_image_src\', \'fix_wp_get_attachment_image_svg\', 10, 4 );

相关推荐

500 Internal Errors

我正在将当前的Eduma主题更新为最新版本(3.0.9.1),目前的版本是3.0.7。我正在运行WordPress 4.7.5。但是,在运行更新时,我得到Update Failed: Internal Server Error 安装过程中的消息。所以我启动了这个过程,它运行了一分钟,然后它就停止了工作,我陷入了维护模式。所以我必须手动删除.maintenance 来自我的服务器的文件。我截图了我在错误中看到的内容。我在WordPress网站上运行了调试模式,这就是我所拥有的[31-May-2017 15: