Npcink Blog
切换菜单

Wordpress 更新服务器

WordPress 插件和主题的自定义更新 API

本页目录11 节

从用户的角度来看,更新的工作方式与使用官方 WordPress.org 目录中列出的插件和主题一样。

GitHub: https://GitHub.com/YahnisElsts/wp-update-server

特征

  • 提供插件和主题的更新。从用户的角度来看,更新的工作方式与使用官方 WordPress.org 目录中列出的插件和主题一样。
  • 易于设置。只需将脚本目录上载到服务器,然后在packages子目录中放置插件或主题 ZIP 。现在,您可以在上使用有效的更新 API http://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类来创建自己的定制服务器。请参阅下面的示例。

入门

设置服务器

设置过程的这一部分对于插件和主题都是相同的。为了简洁起见,我将从插件的角度对其进行描述。

  1. 将wp-update-server目录上载到您的站点。您可以根据需要将其重命名为其他名称(例如updates)。
  2. 使cache和logs子目录可由 PHP 写入。
  3. 创建插件目录的 Zip 存档。档案名称必须与目录名称+“ .zip”相同。
  4. 将 Zip 文件复制到packages子目录。
  5. 通过/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 库来实现。

  1. 下载更新检查器。
  2. 将plugin-update-checker目录移动到插件的目录。
  3. 将以下代码添加到您的主插件文件中:要求 ' 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__,//完整路径主要插件文件。“插件目录名” //插件塞通常是一样的目录的名称。);
  4. 准备发布更新时,只需如上所述压缩插件目录,然后将其packages放在服务器的子目录中即可(覆盖以前的版本)。

默认情况下,磁带库每天检查两次更新。如果更新检查器发现有新版本可用,它将在 WordPress 仪表板中显示更新通知,并且用户将能够通过单击“立即升级”链接进行安装。从用户的角度来看,它就像在 WordPress.org 上托管的插件一样。

请参阅更新检查器文档以获取详细的使用说明和更多示例。

提示:readme.txt为插件创建文件。如果有的话,更新服务器将使用它来生成插件信息页面,当用户单击更新通知中的“查看版本 xyz 详细信息”链接时,该页面将显示。自述文件必须符合 WordPress.org 自述文件标准。

注意:您的插件或主题必须处于活动状态才能进行更新。这样的结果是,在多站点安装中,仅当您的插件在主站点上处于活动状态时才会显示更新。这是因为只有在主站点上启用的插件才会加载到网络管理员中。作为参考,主站点是在“ 所有站点”列表中具有路径“ /”的站点。

与主题整合

  1. 下载主题更新检查器库。
  1. 将theme-updates目录放在您的目录includes或等效目录中。
  2. 将此代码段添加到您的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.
);
  1. 将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 插件运行它,使用自己的服务器类,等等。

要从您自己的应用程序运行服务器,您需要做三件事:

  1. 包括/wp-update-server/loader.php。
  2. 创建的实例Wpup_UpdateServer或扩展它的类。
  3. 调用handleRequest($queryParams)方法。

这是一个基本示例插件,可从 WordPress 内部运行更新服务器:

<?php
/*
Plugin Name: Plugin Update Server
Description: An example plugin that runs the update API.
Version: 1.0
Author: Yahnis Elsts
Author 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 工具来解析服务器日志并显示统计信息,例如活动安装的数量,活动版本等。

来源于: https://GitHub.com/YahnisElsts/wp-update-server