自定义插件,可从自定义端点下载更新,将新版本压缩为新名称

时间:2018-12-14 作者:Kingsley

我已经构建了自己的插件,连接到

  • site_transient_update_plugins
  • transient_update_plugins
  • plugins_api
自动查询,同时将当前插件版本传递给指定的端点,作为回报,该端点根据提供的版本从S3存储桶中获取临时URL zip文件。

这基本上允许我管理每个特定WordPress环境的许多插件版本,而无需推送我的私有代码WordPress。这一切都很棒。喂食后我的终点?v=1.0.0 将返回指向的URL。来自S3存储桶的zip文件2.0.0 发布,如所示:

https://BUCKET.s3.amazonaws.com/wp-plugin/2.0.0/plugin-name.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...X-Amz-Signature=...

解压缩plugin-name.zip 生成的单个目录plugin-name, 其中包含100%正确的版本文件。没问题。

WordPress正确地告诉我插件有更新。我可以查看我从端点提供的自定义详细信息,如描述、屏幕截图、变更日志、版本、测试、必需、横幅等。

然而,当我在WordPress中升级版本时,一切正常,下载并安装新版本(甚至从1.0.02.0.0), 但一旦我重新加载/导航到/离开页面,就会出现以下错误:

The plugin plugin-name/plugin-name.php has been deactivated due to an error: Plugin file does not exist.

我在wp-content/plugins 查找我的插件已从plugin-nameplugin-name-<random-slug>. <random-slug> 总是不同的,但它总是包含新版本代码(在我的例子中是2.0.0)。

我可以重新激活插件,但现在如果我运行wp plugin list 从CLI中,我可以plugin-name-<random-slug>, 在我的代码中,我明确地依赖于plugin-name/plugin-name.zip

这是我第一次在WordPress中实时执行类似操作,所以有点不确定如何修复。如何连接到升级中,以便在下载zip并解压缩后,我可以将文件夹重命名回plugin-name?

任何想法都将不胜感激!

add_filter(\'site_transient_update_plugins\', array($this, \'register_update_check\'));
add_filter(\'transient_update_plugins\', array($this, \'register_update_check\'));
add_filter(\'plugins_api\', array($this, \'register_plugin_details_overrides\'), 20, 3);
//

public function register_update_check($updates)
{
    if (! is_object($updates)){
        return $updates;
    }

    if (! isset($updates->response ) || ! is_array($updates->response)) {
        $updates->response = array();
    }

    // Query WordPress plugins available
    $this->response = $this->queryPluginVersions();

    // Compare the version
    // If returned version is greater than installed version,
    // mock & return WordPress response, feeding it a .zip
    // file which WordPress downloads, unzips the zip,
    // completely replacing the plugin and its files
    if ($this->response->version > $this->version) {

        // Only mock our plugin
        $updates->response[\'plugin-name/plugin-name.php\'] = (object) array(
            \'slug\'         => \'plugin-name\',
            \'new_version\'  => $this->response->version,
            \'url\'          => $this->response->url,
            \'package\'      => $this->response->download_url,
            \'sections\'     => array(
                \'description\'   => $this->response->sections->description,
                \'installation\'  => $this->response->sections->installation,
                \'changelog\'     => $this->response->sections->changelog,
                \'screenshots\'     => $this->response->sections->screenshots,
            )
        );
    }

    return $updates;
}
//

public function register_plugin_details_overrides($result, $action, $args)
{
    if ($action !== \'plugin_information\') {
        return $result;
    }

    if (\'plugin-name\' !== $args->slug) {
        return $result;
    }

    return (object) json_decode(json_encode($this->response), true);
}
//

public function queryPluginVersions()
{
    // Build the query, appending ?v=<version>
    $url = sprintf(
        \'%s?v=%s\',
        $this->endpoint_url,
        $this->version
    );

    $remote = wp_remote_get($url, array(
        \'timeout\' => 10,
        \'headers\' => array(
            \'Accept\' => \'application/json\'
        ))
    );

    return json_decode($remote[\'body\']);
}
//

假设端点URL返回正确的信息,并带有有效的&;更正v2.0.0。拉链/释放

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

谢谢Tom J Nowell! 这使我走上了正确的方向,我已经能够成功地更新。以下是我所做的:

重新构建我的回购协议以匹配:

|-- .git
|-- .gitattributes
|-- .gitignore
|-- README.md
|-- package.json
|-- plugin-name
    |-- plugin-name.php
    |-- src
        |-- ...
在新分支中编码新版本,合并到master

从命令行,cd插入的根目录directory 上方(&A);运行时间:

git archive -o <plugin-name>-<major>.<minor>.<patch>.zip --format=zip --prefix=<plugin-name>/ HEAD:<plugin-name>

<上传到S3<bucket>/wp-plugin/v<plugin-major-version>/<zipfile>.zip, e、 g.

<bucket>/wp-plugin/v2/plugin-name-2.0.0.zip

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。