wpbridge/includes/UpdateSource/Handlers/JsonHandler.php
feibisi 99a4ae4048 fix: complete wenpai-bridge integration across all config paths
- Update Settings.php preset: arkpress → json, api.wenpai.net → updates.wenpai.net
- Update SourceRegistry.php preset: TYPE_MIRROR → TYPE_JSON, same URL change
- Add JsonHandler::get_check_url() to extract base URL for health checks
- Fix {slug} template URL causing health check failures

Addresses Codex review findings:
- High: preset config not wired into active bootstrap path
- Medium: health checks failing on templated URLs

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-14 23:27:17 +08:00

141 lines
3.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* JSON API 处理器
*
* @package WPBridge
*/
namespace WPBridge\UpdateSource\Handlers;
use WPBridge\Core\Logger;
// 防止直接访问
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* JSON API 处理器
* 兼容 Plugin Update Checker 格式
*/
class JsonHandler extends AbstractHandler {
/**
* 获取能力列表
*
* @return array
*/
public function get_capabilities(): array {
return [
'auth' => 'token',
'version' => 'json',
'download' => 'direct',
];
}
/**
* 获取健康检查 URL
*
* 对于包含 {slug} 模板的 URL提取基础 URL 进行健康检查
*
* @return string
*/
public function get_check_url(): string {
$url = $this->source->api_url;
// 如果 URL 包含 {slug} 模板,提取基础 URL
if ( strpos( $url, '{slug}' ) !== false ) {
// 从 https://updates.wenpai.net/api/v1/plugins/{slug}/info
// 提取 https://updates.wenpai.net/
$parsed = wp_parse_url( $url );
if ( $parsed && isset( $parsed['scheme'], $parsed['host'] ) ) {
$base_url = $parsed['scheme'] . '://' . $parsed['host'];
if ( isset( $parsed['port'] ) ) {
$base_url .= ':' . $parsed['port'];
}
return $base_url . '/';
}
}
return $url;
}
/**
* 检查更新
*
* @param string $slug 插件/主题 slug
* @param string $version 当前版本
* @return UpdateInfo|null
*/
public function check_update( string $slug, string $version ): ?UpdateInfo {
$url = $this->build_check_url( $slug );
$data = $this->request( $url );
if ( null === $data ) {
return null;
}
// 处理 Plugin Update Checker 格式
$remote_version = $data['version'] ?? '';
if ( empty( $remote_version ) ) {
Logger::warning( 'JSON 响应缺少版本信息', [ 'url' => $url ] );
return null;
}
// 检查是否有更新
if ( ! $this->is_newer_version( $version, $remote_version ) ) {
Logger::debug( '无可用更新', [
'slug' => $slug,
'current' => $version,
'remote' => $remote_version,
] );
return null;
}
// 构建更新信息
$info = UpdateInfo::from_array( $data );
$info->slug = $slug;
Logger::info( '发现更新', [
'slug' => $slug,
'current' => $version,
'new' => $remote_version,
] );
return $info;
}
/**
* 获取项目信息
*
* @param string $slug 插件/主题 slug
* @return array|null
*/
public function get_info( string $slug ): ?array {
$url = $this->build_check_url( $slug );
return $this->request( $url );
}
/**
* 构建检查 URL
*
* @param string $slug 插件/主题 slug
* @return string
*/
protected function build_check_url( string $slug ): string {
$url = $this->source->api_url;
// 如果 URL 包含占位符,替换它
if ( strpos( $url, '{slug}' ) !== false ) {
return str_replace( '{slug}', $slug, $url );
}
// 如果 URL 包含查询参数占位符
if ( strpos( $url, '?' ) !== false ) {
return add_query_arg( 'slug', $slug, $url );
}
return $url;
}
}