WooCommerce:更新自托管插件 @ WP Dashboard

已发表: 2023-06-07

在这个价值百万美元的教程中,您将学习如何直接从 WordPress 仪表板更新您在某处托管的自定义 (WooCommerce) 插件

我以为 WordPress 仪表板只能通知您插件更新,并让您专门更新 WordPress 存储库中的插件,但我错了!

自从我开始在 Business Bloomer 上销售 WooCommerce 插件以来,我必须找到一种方法让客户直接从他们的 WP 管理员自动更新它们。

值得庆幸的是,有 2 个钩子可以解决问题: pre_set_site_transient_update_plugins update_plugins_{$hostname}plugins_api 。 使用这两个过滤器,您可以告诉 WordPress 您的自定义插件 ZIP 文件可在给定的公共 URL 下载,向客户显示插件更新可用的通知,让他们一键更新,并可选择让他们启用自动-更新。

那么,让我们看看我是如何经营我的插件业务的。 享受!

在此 WordPress 仪表板屏幕截图中,您可以清楚地看到“Business Bloomer WooCommerce 登录注册简码”插件有可用更新,您可以“查看版本详细信息”或“立即更新”。 神奇的是——这是一个由我托管的插件,而不是在 WordPress 存储库中!
目录
  1. 第 1 步:创建和托管自定义插件
  2. 第 2 步:创建 JSON 变更日志文件
  3. 第 3 步:在任何 WordPress 站点上安装自定义插件
  4. 第 4 步:PHP 代码段 - 从 WordPress 仪表板更新自定义插件
  5. 回顾

第 1 步:创建和托管自定义插件

这篇文章不是关于开发插件的。 如果您现在刚开始,请随时研究 WordPress 插件手册。

完成开发后,将插件 ZIP 文件保存在公共 URL,例如: www.businessbloomer.com/blabla/whatever-plugin.zip

第 2 步:创建 JSON 变更日志文件

当您自行托管插件时,我们需要通知 WordPress(以及所有安装了该插件的 WordPress 网站)有可用的新版本,否则您在第 4 步中找到的代码将不会触发。

您可以使用多种方式来存储变更日志数据,创建 JSON 文件是最简单的一种。 WordPress 需要的只是检索ZIP 文件名和插件版本,以便动态获取它们并触发更新通知。

打开文本编辑器,输入以下信息:

 {
	"plugin_name": "WooCommerce 的任何插件",
	"latest_version": "1.0.9",
	"download_url": "https://www.businessbloomer.com/blabla/whatever-plugin.zip",
}

然后,使用 .JSON 扩展名保存文件,并将其放在您自己网站的特定 URL 中,例如www.businessbloomer.com/blabla/plugin-updates.json

每当您发布新的插件版本时,请更新此文件,例如,只要您上传插件的 2.0.0 版,就将 JSON 文件更改为:

 {
	"plugin_name": "WooCommerce 的任何插件",
	"latest_version": "2.0.0",
	"download_url": "https://www.businessbloomer.com/blabla/whatever-plugin.zip",
}

第 3 步:在任何 WordPress 站点上安装自定义插件

转到WordPress > 插件 > 添加新的 > 上传并安装并激活自定义插件。 该插件将带有一个版本号,例如 1.0.9 – 我们现在需要找到一种方法让管理员更新插件,以防有更新的版本可用。

第 4 步:PHP 代码段 - 从 WordPress 仪表板更新自定义插件

这是很酷的部分。

您可以将其添加到插件代码中。

我们将使用两个过滤器: update_plugins_{$hostname}plugins_api 。 前者负责实际更新; 后者在单击“查看版本详细信息”时显示插件信息(请参见上面的屏幕截图)。

注意 1: {$hostname}部分基于您托管插件的位置。 假设插件 URL 是www.businessbloomer.com/blabla/whatever-plugin-1.0.9.zip ,那么{$hostname}是 www.businessbloomer.com

注意2:你还需要知道插件文件夹的名称和插件文件的名称,通常是相同的。 如果 ZIP 文件是whatever-plugin.zip我希望插件文件夹名为/whatever-plugin并且其中包含的插件文件名为/whatever-plugin.php

注意3:插件文件必须使用“ Plugin URI ”和“ Version ”标头参数,因为我们将通过代码检索它们。

/**
 * @snippet       Update Self-Hosted Plugin @ WordPress Dashboard
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 7
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */

// ----------------
// 1: Plugin Description When People Click On View Version Details
// Note: use the plugin slug, path, name 

add_filter( 'plugins_api', 'bbloomer_plugin_view_version_details', 9999, 3 );

function bbloomer_plugin_view_version_details( $res, $action, $args ) {
	if ( 'plugin_information' !== $action ) return $res;
	if ( $args->slug !== 'whatever-plugin' ) return $res;
	$res = new stdClass();
	$res->name = 'Whatever Plugin For WooCommerce';
	$res->slug = 'whatever-plugin';
	$res->path = 'whatever-plugin/whatever-plugin.php';
   $res->sections = array(
		'description' => 'The plugin description',
	);
   $changelog = bbloomer_whatever_plugin_request();
	$res->version = $changelog->latest_version;
	$res->download_link = $changelog->download_url;	
	return $res;
}

// ----------------
// 2: Plugin Update
// Note: use the plugin {$hostname}, slug & path 

add_filter( 'update_plugins_www.businessbloomer.com', function( $update, array $plugin_data, string $plugin_file, $locales ) {
	 if ( $plugin_file !== 'whatever-plugin/whatever-plugin.php' ) return $update;
    if ( ! empty( $update ) ) return $update;
    $changelog = bbloomer_whatever_plugin_request();
    if ( ! version_compare( $plugin_data['Version'], $changelog->latest_version, '<' ) ) return $update;
    return [
        'slug' => 'whatever-plugin',
        'version' => $changelog->latest_version,
        'url' => $plugin_data['PluginURI'],
        'package' => $changelog->download_url,
    ];	
}, 9999, 4 );

// ----------------
// 3: Retrieve Plugin Changelog
// Note: use the public JSON file address

function bbloomer_whatever_plugin_request() {
    $access = wp_remote_get( 'https://www.businessbloomer.com/blabla/plugin-updates.json', array( 'timeout' => 10,	'headers' => array( 'Accept' => 'application/json' )	) );
    if ( ! is_wp_error( $access ) && 200 === wp_remote_retrieve_response_code( $access ) ) {
			$result = json_decode( wp_remote_retrieve_body( $access ) );
			return $result;		
    }
}

回顾

为了让 WordPress 用户更新您在其他地方托管的插件,您需要:

  1. 按照步骤 1(命名)和步骤 4(插件更新要求)开发插件
  2. 将 ZIP 文件保存在公共 URL 上,以便 WordPress 可以下载它
  3. 在公共 URL 上保留 JSON 变更日志文件,以便 WordPress 知道是否有可用更新

问题? 疑惑? 反馈? 在下面发表评论!