本页目录
从用户的角度来看,更新的工作方式与使用官方 WordPress.org 目录中列出的插件和主题一样。
GitHub: https://GitHub.com/YahnisElsts/wp-update-server
特征
- 提供插件和主题的更新。从用户的角度来看,更新的工作方式与使用官方 WordPress.org 目录中列出的插件和主题一样。
- 易于设置。只需将脚本目录上载到服务器,然后在
packages子目录中放置插件或主题 ZIP 。现在,您可以在上使用有效的更新 APIhttp://yourserver.com/wp-update-server/?action=get_metadata&slug=your-plugin。 - 易于与现有插件和主题集成。它只需要大约 5 行代码。有关详细信息,请参见
- 或者只是向下滚动到简短版本的“入门”部分。
- 最低的服务器要求。服务器组件需要 PHP 5.3+和 Zip 扩展。客户端库只需要 PHP 5.2 - 相同的 WordPress 的当前版本。
- 专为可扩展性而设计。要保护您的升级下载链接吗?还是使用自定义记录器或缓存?也许您的插件没有标准
readme.txt,而是您希望从数据库中加载 changelog 和其他更新 meta?通过扩展Wpup_UpdateServer类来创建自己的定制服务器。请参阅下面的示例。
入门
设置服务器
设置过程的这一部分对于插件和主题都是相同的。为了简洁起见,我将从插件的角度对其进行描述。
- 将
wp-update-server目录上载到您的站点。您可以根据需要将其重命名为其他名称(例如updates)。 - 使
cache和logs子目录可由 PHP 写入。 - 创建插件目录的 Zip 存档。档案名称必须与目录名称+“ .zip”相同。
- 将 Zip 文件复制到
packages子目录。 - 通过
/wp-update-server/?action=get_metadata&slug=plugin-directory-name在浏览器中访问来验证 API 是否有效。您应该看到一个 JSON 文档,其中包含有关插件的各种信息(名称,版本,说明等)。
提示:使用 JSONView 扩展名(Firefox, Chrome)在浏览器中漂亮地打印 JSON。
创建 Zip 文件时,请确保插件文件位于目录内,而不位于存档根目录下。例如,假设您有一个名为“我的酷插件”的插件,并且该插件位于内部/wp-content/plugins/my-cool-plugin。ZIP 文件的名称my-cool-plugin.zip应包含以下内容:
/my-cool-plugin /css /js /another-directory my-cool-plugin.php readme.txt ...如果将所有内容放在根目录下,则更新通知可能会很好地显示,但是当您尝试安装更新时会遇到无法解释的问题,因为 WordPress 希望插件文件位于子目录中。
与插件集成
现在您已经准备好运行服务器,下一步是使您的插件查询它的更新。我们将使用 plugin-update-checker 库来实现。
- 下载更新检查器。
- 将
plugin-update-checker目录移动到插件的目录。 - 将以下代码添加到您的主插件文件中:要求 ' path / to / plugin-update-checker / plugin-update-checker.php ' ; $ MyUpdateChecker = Puc_v4_Factory :: buildUpdateChecker( ' http://example.com/wp-update-server/?action=get_metadata&slug=plugin-directory-name ',//元数据 URL。__FILE__,//完整路径主要插件文件。“插件目录名” //插件塞通常是一样的目录的名称。);
- 准备发布更新时,只需如上所述压缩插件目录,然后将其
packages放在服务器的子目录中即可(覆盖以前的版本)。
默认情况下,磁带库每天检查两次更新。如果更新检查器发现有新版本可用,它将在 WordPress 仪表板中显示更新通知,并且用户将能够通过单击“立即升级”链接进行安装。从用户的角度来看,它就像在 WordPress.org 上托管的插件一样。
请参阅更新检查器文档以获取详细的使用说明和更多示例。
提示:readme.txt为插件创建文件。如果有的话,更新服务器将使用它来生成插件信息页面,当用户单击更新通知中的“查看版本 xyz 详细信息”链接时,该页面将显示。自述文件必须符合 WordPress.org 自述文件标准。
注意:您的插件或主题必须处于活动状态才能进行更新。这样的结果是,在多站点安装中,仅当您的插件在主站点上处于活动状态时才会显示更新。这是因为只有在主站点上启用的插件才会加载到网络管理员中。作为参考,主站点是在“ 所有站点”列表中具有路径“ /”的站点。
与主题整合
- 下载主题更新检查器库。
- 将
theme-updates目录放在您的目录includes或等效目录中。 - 将此代码段添加到您的
functions.php:
require 'path/to/theme-updates/theme-update-checker.php';$MyThemeUpdateChecker = new ThemeUpdateChecker( 'theme-directory-name', //Theme slug. Usually the same as the name of its directory. 'http://example.com/wp-update-server/?action=get_metadata&slug=theme-directory-name' //Metadata URL.);- 将
Details URI标头添加到您的style.css:Details URI: http://example.com/my-theme-changelog.html该标题指定用户单击更新通知中的“查看版本 xyz 详细信息”链接后将看到的页面。将其设置为“版本 zyz 的新功能”页面或主题主页的 URL。
与插件更新一样,主题更新检查器将每 12 小时向服务器查询主题详细信息,并在 WordPress 仪表板中显示更新通知(如果有可用的新版本)。
有关更多信息,请参见主题更新检查器文档。
更新:该插件更新检查程序库现在还支持主题更新。旧的主题更新检查器不再有效维护。
进阶主题
记录中
服务器将所有 API 请求记录到该/logs/request.log文件。每行代表一个请求,其格式如下:
[timestamp] IP_address action slug installed_version wordpress_version site_url query_string缺少或不适用的字段将替换为破折号“-”。记录器从 WordPress 添加到通过 HTTP API 发送的所有请求的“ User-Agent”标头中提取 WordPress 版本和站点 URL。如果您通过浏览器发出 API 请求,或者标题被插件删除或覆盖(某些安全插件会这样做),则这些字段将不存在。
扩展服务器
若要自定义更新服务器的工作方式,请创建扩展 Wpup_UpdateServer 的自己的服务器类,并编辑 init 脚本(即index.php如果您将服务器作为独立应用程序运行)以加载和使用新类。
例如,让我们做一个简单的修改,即禁用下载并从更新 API 返回的插件详细信息中删除下载 URL。这可以用作需要授权才能下载更新的自定义服务器的基础。
将新文件添加MyCustomServer.php到wp-update-server:
class MyCustomServer extends Wpup_UpdateServer { protected function filterMetadata($meta, $request) { $meta = parent::filterMetadata($meta, $request); unset($meta['download_url']); return $meta; }
protected function actionDownload(Wpup_Request $request) { $this->exitWithError('Downloads are disabled.', 403); }}编辑index.php以使用新类:
require __DIR__ . '/loader.php';require __DIR__ . '/MyCustomServer.php';$server = new MyCustomServer();$server->handleRequest();从另一个脚本运行服务器
虽然使用更新服务器的最简单方法是将其作为独立的应用程序运行,但这并不是唯一的方法。如果需要,还可以将其作为第三方库加载并创建自己的服务器实例。这样,您就可以在将查询参数传递到服务器之前对其进行过滤和修改,通过 WordPress 插件运行它,使用自己的服务器类,等等。
要从您自己的应用程序运行服务器,您需要做三件事:
- 包括
/wp-update-server/loader.php。 - 创建的实例
Wpup_UpdateServer或扩展它的类。 - 调用
handleRequest($queryParams)方法。
这是一个基本示例插件,可从 WordPress 内部运行更新服务器:
<?php/*Plugin Name: Plugin Update ServerDescription: An example plugin that runs the update API.Version: 1.0Author: Yahnis ElstsAuthor URI: http://w-shadow.com/*/
require_once __DIR__ . '/path/to/wp-update-server/loader.php';
class ExamplePlugin { protected $updateServer;
public function __construct() { $this->updateServer = new MyCustomServer(home_url('/'));
//The "action" and "slug" query parameters are often used by the WordPress core //or other plugins, so lets use different parameter names to avoid conflict. add_filter('query_vars', array($this, 'addQueryVariables')); add_action('template_redirect', array($this, 'handleUpdateApiRequest')); }
public function addQueryVariables($queryVariables) { $queryVariables = array_merge($queryVariables, array( 'update_action', 'update_slug', )); return $queryVariables; }
public function handleUpdateApiRequest() { if ( get_query_var('update_action') ) { $this->updateServer->handleRequest(array_merge($_GET, array( 'action' => get_query_var('update_action'), 'slug' => get_query_var('update_slug'), ))); } }}
class MyCustomServer extends Wpup_UpdateServer { protected function generateDownloadUrl(Wpup_Package $package) { $query = array( 'update_action' => 'download', 'update_slug' => $package->slug, ); return self::addQueryArg($query, $this->serverUrl); }}
$examplePlugin = new ExamplePlugin();注意:如果您打算在实践中使用上述类似内容,则可能需要重写Wpup_UpdateServer::generateDownloadUrl()以自定义 URL 或更改查询参数。
保护下载链接
请参阅此博客文章,以获取高层次的概述和一些简短的示例。
分析工具
您可以使用 wp-update-server-stats 工具来解析服务器日志并显示统计信息,例如活动安装的数量,活动版本等。