suth/update-server

WordPress 插件更新服务器

dev-master 2016-06-25 22:41 UTC

This package is not auto-updated.

Last update: 2024-09-26 02:01:33 UTC


README

WordPress 插件和主题的定制更新 API 包。

基于 Yahnis Elsts 的 WP Update Server

功能

为插件和主题提供更新。

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

易于集成到现有插件和主题。

只需要大约 5 行代码。有关详细信息,请参阅插件更新检查器主题更新检查器文档,或者直接滚动到“入门”部分查看简短版本。

为扩展性而设计。

想要保护升级下载链接吗?或者使用自定义记录器或缓存?也许你的插件没有标准的readme.txt,你更喜欢从数据库中加载变更日志和其他更新元数据?通过扩展Wpup_UpdateServer类创建自己的自定义服务器。请参阅下面的示例。

入门

设置服务器

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

  1. wp-update-server目录上传到您的网站。如果您想,可以将其重命名为其他名称(例如updates)。
  2. 使cachelogs子目录可由PHP写入。
  3. 创建您插件目录的Zip存档。存档的名称必须与目录名称相同,并加上".zip"。
  4. 将Zip文件复制到packages子目录。
  5. 通过在浏览器中访问/wp-update-server/?action=get_metadata&slug=plugin-directory-name来验证API是否正常工作。您应该看到一个包含有关您的插件(名称、版本、描述等)各种信息的JSON文档。

提示:使用JSONView扩展(FirefoxChrome)在浏览器中格式化打印JSON。

创建Zip文件时,请确保插件文件位于目录中,而不是存档根目录中。例如,假设您有一个名为"My Cool Plugin"的插件,它位于/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期望插件文件位于子目录中。

与插件集成

有关详细使用说明和示例,请参阅更新检查器文档

与主题集成

有关信息和示例,请参阅主题更新检查器文档

高级主题

记录

服务器将所有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 的自定义服务器类,并编辑初始化脚本(如果您将服务器作为独立应用程序运行,则为 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/
*/

class ExamplePlugin {
	protected $updateServer;

	public function __construct() {
		require_once __DIR__ . '/path/to/wp-update-server/loader.php';
		$this->updateServer = new Wpup_UpdateServer(home_url('/'));
		
		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(
				'action' => get_query_var('update_action'),
				'slug'   => get_query_var('update_slug'),
			));
		}
	}
}

$examplePlugin = new ExamplePlugin();

注意:如果您打算在实际中使用上述内容,您可能需要覆盖 Wpup_UpdateServer::generateDownloadUrl() 以使用您自己的 URL 结构或查询变量名称。

保护下载链接

请参阅 此博客文章 了解高级概述和一些简要示例。