从用户的角度来看,更新的工作方式与使用官方WordPress.org目录中列出的插件和主题一样。
Github: https://github.com/YahnisElsts/wp-update-server
本站下载:
[zrz_file link="https://cdn.getimg.net/npc/2019/wordpress/plugin/wp-update-server-master.zip" name="wp-update-server-master.zip" code=""]特征
- 提供插件和主题的更新。从用户的角度来看,更新的工作方式与使用官方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 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工具来解析服务器日志并显示统计信息,例如活动安装的数量,活动版本等。