我正在自行托管一个高级Wordpress插件。我试图通过让插件联系我的一个web服务器,交换JSON信息来获取插件安装的更新信息。这一切都正常工作,但有一个恼人的问题。
add_filter(\'pre_set_site_transient_update_plugins\', \'MyPlugin_check_for_plugin_update\');
function MyPlugin_check_for_plugin_update($checked_data) {
global $wp_version;
if (empty($checked_data->checked)) {
return $checked_data;
}
if (isset($checked_data->response[MYPLUGIN_BASE]) || isset($checked_data->no_update[MYPLUGIN_BASE]))
{
return $checked_data;
}
//snip - contact the api server get a $response, verify the json
if (isset($response->new_version)) {
if (version_compare(MYPLUGIN_VERSION, $response->new_version, \'<\')) {
$checked_data->response [MYPLUGIN_BASE] = $response;
} else {
$checked_data->no_update [MYPLUGIN_BASE] = $response;
}
}
return $checked_data;
}
因此,当运行插件更新检查时,此函数将查找传递给它的“checked”数组,如下所示:
https://pastebin.com/ZebefppF
如果传递给函数的数组包含“checked”数组(据我所知,每个插件更新检查仅一次),函数将运行API检查,并根据是否有新版本将插件数据添加到“response”或“no update”数组中。
我见过在运行插件更新检查时多次调用该函数。只要在传递“checked”时,我的插件更新数据还没有在数组中,它就会通过api调用添加到我的服务器,并且我的插件更新信息会准确地显示出它应该在哪里,以及它应该拥有的数据。
事情出错的地方:
如果插件更新数据在传递给函数时已在“response”或“no update”数组中,如下所示:
https://pastebin.com/R1VwJzWm
我做什么似乎无关紧要,它会被移除。您可能会注意到,在上面的代码中,我试图返回数组,如果它在其中找到插件数据。我尝试让它通过函数并再次添加更新信息,但它仍然会被删除(或者因为密钥已经存在而没有添加)。
所以,问题来了。如果我的插件的更新信息已经在“响应”或“无更新”数组中,我应该如何准确地将其保留在那里?还是我真的很傻,什么都没看到?
上帝,我希望我能理解这一点。我现在很困惑。
SO网友:uPrompt
好的,这是一个可行的解决方案,但有点老套。首先,解释。
在经历了很多磨蹭和错误记录之后,我发现在插件更新检查期间,过滤器“pre\\u set\\u site\\u transient\\u update\\u plugins”至少被调用了两次。有时,传递的数组会附加“checked”数组,有时则不会。我不知道为什么,但当它没有检查过的阵列时,站点临时“update\\u plugins”会检查。
看来,让我的插件更新保持这种状态的唯一方法是返回包含“checked”数组的插件。同样,不知道为什么。所以,我作弊:
$transient = get_site_transient(\'update_plugins\');
if (empty($checked_data->checked)) {
if (empty($transient->checked)) {
return $checked_data;
} else {
$checked_data = $transient;
}
}
// proceed to get the plugin update data
因此,我检查其中一个是否有“checked”数组,如果有,我使用该数组将插件数据添加到。
最终的结果是,我的插件更新显示在它应该显示的地方,即使通过后续的检查,它也不会被删除。
如果你知道一个合适的解决方案,请告诉我。不知怎的,我有点期待这会在某个时候失败。