自托管插件更新问题

时间:2020-03-12 作者:uPrompt

我正在自行托管一个高级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

我做什么似乎无关紧要,它会被移除。您可能会注意到,在上面的代码中,我试图返回数组,如果它在其中找到插件数据。我尝试让它通过函数并再次添加更新信息,但它仍然会被删除(或者因为密钥已经存在而没有添加)。

所以,问题来了。如果我的插件的更新信息已经在“响应”或“无更新”数组中,我应该如何准确地将其保留在那里?还是我真的很傻,什么都没看到?

上帝,我希望我能理解这一点。我现在很困惑。

1 个回复
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”数组,如果有,我使用该数组将插件数据添加到。

最终的结果是,我的插件更新显示在它应该显示的地方,即使通过后续的检查,它也不会被删除。

如果你知道一个合适的解决方案,请告诉我。不知怎的,我有点期待这会在某个时候失败。

相关推荐