我试图应用一个过滤器,但我得到了一个回调错误,我不知道为什么。我想这可能与我使用的过滤器包括$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
有没有一种实例方法可以让这项工作正常进行?如果有,我想看看如何修复代码的示例。
谢谢
最合适的回答,由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 );