我正在编写一个插件,将来可能会有更新,我想利用wordpress中的自动更新机制。
我跟着this tutorial:
对我来说,一切似乎都很简单,但出于某种原因,什么都不管用。连接到pre_set_site_transient_update_plugins
从未调用筛选器。
我试着一步一步地走,只是在那个钩子上加了一个“Hello”和一条日志线。即使我试图强制进行更新检查,它也不会被调用。
有什么发现吗?顺便说一句,我正在多站点安装上尝试。
任何帮助都将不胜感激。
阿纳尔多
更新:我将函数连接到pre_set_site_transient_update_plugins
待调用。奇怪的是,如果我在具有检查功能的对象的构造函数中进行挂钩,它就会工作,否则,它就不会工作。
示例(本工程):
class XYZ {
public function __construct() {
add_filter(\'pre_set_site_transient_update_plugins\', array($this, \'check_update\'));
}
public function check_update($transient) {
// logic here
}
}
然而,如果我只是在我的主插件文件上执行此操作,它将不起作用:
add_filter(\'pre_set_site_transient_update_plugins\', array(\'XYZ\', \'check_update\'));
首先,我想了解这两种情况之间的区别。除此之外,我必须
set_site_transient(\'update_plugins\', null);
强制调用钩子,否则我想我必须等待正常的wordpress更新检查周期,对吗?现在,另一个问题浮出水面:
$transient
传递给
check_update()
函数始终为空!是因为
set_site_transient()
指示如果是,我如何检查整个解决方案而不花几个小时来测试我的最新更改?
再次感谢Arnaldo
更新2:@kaiser,行为与我描述的完全一样,甚至使用静态方法。我已经试过了。
SO网友:J.D.
你实际上有几个问题,所以我将逐一回答:
然而,如果我只是在我的主插件文件上执行此操作,它将不起作用:
add_filter(\'pre_set_site_transient_update_plugins\', array(\'XYZ\', \'check_update\'));
首先,我想了解这两种情况之间的区别。
这是失败的,因为您是静态调用该方法,而不是在类的实例上调用。由于没有在实例上调用该方法,因此不会设置类属性。例如,当check_update()
试图使用$this->current_version
, 它会null
. 因此,函数将假定没有可用的更新。
除此之外,我必须
set_site_transient(\'update_plugins\', null);
强制调用钩子,否则我想我必须等待正常的wordpress更新检查周期,对吗?
对
现在,另一个问题浮出水面:$transient
传递给check_update()
函数始终为null
! 是因为set_site_transient()
指示
是的,您正在将瞬态设置为null
. 所以,你不应该期望null
之后,除非由于某种原因失败。
[H] 我怎样才能检查整个解决方案而不必花几个小时来测试我的最新更改?
对于测试,将其更改为钩住get_site_transient_update_plugins
相反每次检索瞬态时都会调用该函数。不过,您可能需要设置一个静态变量或其他东西,所以您不会在每个页面请求中多次调用它。