diff --git a/.gitignore b/.gitignore index fd00a1e3..f571c7b0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ /.workbuddy/ # Project planning, internal docs, and local-only development files -/.aksrt-chrome-profile/ +/.jio-chrome-profile/ /.specs/ /docs/ diff --git a/404.php b/404.php index b96e1535..7d6856a7 100644 --- a/404.php +++ b/404.php @@ -2,15 +2,15 @@ /** * 404 template. * - * @package AKSRT + * @package Jio */ defined('ABSPATH') || exit; get_header(); -$search_placeholder = function_exists('aksrt_get_search_placeholder') ? aksrt_get_search_placeholder() : __('开启精彩搜索', 'aksrt'); -$hot_keywords = function_exists('aksrt_get_search_hot_keywords') ? aksrt_get_search_hot_keywords() : []; +$search_placeholder = function_exists('jio_get_search_placeholder') ? jio_get_search_placeholder() : __('开启精彩搜索', 'jio'); +$hot_keywords = function_exists('jio_get_search_hot_keywords') ? jio_get_search_hot_keywords() : []; $hot_query = new WP_Query([ 'post_type' => 'post', @@ -39,33 +39,33 @@ $top_cats = get_terms([

404

-

+

- +

- + - +
- - + +
-
-

+
+

@@ -78,8 +78,8 @@ $top_cats = get_terms([ have_posts()) : ?> -
-

+
+

    have_posts()) : $hot_query->the_post(); ?>
  • diff --git a/README.md b/README.md index 5e209590..de79c479 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# AKSRT WordPress Theme +# Jio WordPress Theme > **版本**: 3.4.0-dev | **架构**: 原生 PHP + WordPress (非 headless) > **要求**: WordPress >= 6.4 | PHP >= 8.1 @@ -7,7 +7,7 @@ ## 项目概述 -AKSRT 是一款现代化的 WordPress 主题,采用**原生 WordPress 主题架构**开发(PHP + HTML + CSS + JavaScript),不依赖 REST API 进行前端渲染。 +Jio 是一款现代化的 WordPress 主题,采用**原生 WordPress 主题架构**开发(PHP + HTML + CSS + JavaScript),不依赖 REST API 进行前端渲染。 ### 核心特性 @@ -22,14 +22,14 @@ AKSRT 是一款现代化的 WordPress 主题,采用**原生 WordPress 主题 ## 文件结构 ``` -AKSRT-theme/ +Jio-theme/ ├── functions.php # 入口:常量 + Composer autoload + bootstrap + 单例 init ├── style.css # WordPress 主题声明头 -├── composer.json # 第三方依赖 + 主题 PSR-4(AKSRT\ → src/) +├── composer.json # 第三方依赖 + 主题 PSR-4(Jio\ → src/) │ ├── *.php # WP 核心模板保留根目录 │ -├── src/ # Composer PSR-4 类型根(namespace AKSRT\) +├── src/ # Composer PSR-4 类型根(namespace Jio\) │ ├── Admin/ # SPA 编排 + 域控制器 + Schema + Native ops │ ├── Auth/ # 登录 / OAuth / 审核 / 邮箱 │ ├── Content/ # 下载 token / 付费内容 / VIP / 可见性 @@ -89,7 +89,7 @@ AKSRT-theme/ ## 安装方式 -主题类型(`AKSRT\…`)通过 Composer PSR-4 从 `src/` 自动加载;`vendor/` 不进 Git。**部署或更新主题后必须在主题根目录生成 autoload**,否则会出现 `Class "AKSRT\Core\DomainModel" not found` 等致命错误。 +主题类型(`Jio\…`)通过 Composer PSR-4 从 `src/` 自动加载;`vendor/` 不进 Git。**部署或更新主题后必须在主题根目录生成 autoload**,否则会出现 `Class "Jio\Core\DomainModel" not found` 等致命错误。 ### 前置:Composer(必做) @@ -106,16 +106,16 @@ composer dump-autoload -o 确认: ```bash -php -r "require 'vendor/autoload.php'; echo class_exists('AKSRT\\\\Core\\\\DomainModel') ? \"ok\\n\" : \"missing\\n\";" +php -r "require 'vendor/autoload.php'; echo class_exists('Jio\\\\Core\\\\DomainModel') ? \"ok\\n\" : \"missing\\n\";" ``` 应输出 `ok`。若 PHP 开启了 OPcache,重载 php-fpm / 重启 PHP 后再访问站点。 ### 方式一:直接上传(推荐) -1. 将整个 `AKSRT-theme` 文件夹上传到 `wp-content/themes/` +1. 将整个 `Jio-theme` 文件夹上传到 `wp-content/themes/` 2. 在服务器主题目录执行上一节的 `composer install`(若打包时已带上完整 `vendor/` 且已 `dump-autoload`,可跳过) -3. WordPress 后台 → **外观** → **主题** → 找到 **AKSRT** → **激活** +3. WordPress 后台 → **外观** → **主题** → 找到 **Jio** → **激活** ### 方式二:ZIP 打包上传 @@ -126,7 +126,7 @@ php -r "require 'vendor/autoload.php'; echo class_exists('AKSRT\\\\Core\\\\Domai SSH 进入主题目录后: ```bash -cd /path/to/wp-content/themes/AKsrt-theme # 以实际路径为准 +cd /path/to/wp-content/themes/Jio-theme # 以实际路径为准 composer install --no-dev --optimize-autoloader # 或仅刷新映射:composer dump-autoload -o # 可选:reload php-fpm / 清 OPcache @@ -150,9 +150,9 @@ composer install --no-dev --optimize-autoloader ### 2. 后台配置路径 -WordPress 后台左侧 **Admin Bar** → ⚡ **AKSRT 主题设置** +WordPress 后台左侧 **Admin Bar** → ⚡ **Jio 主题设置** -或直接访问:`/wp-admin/admin.php?page=aksrt-settings` +或直接访问:`/wp-admin/admin.php?page=jio-settings` ### 3. 当前后台域 @@ -173,7 +173,7 @@ WordPress 后台左侧 **Admin Bar** → ⚡ **AKSRT 主题设置** ### 5. 部署注意事项 - **佣金结算时效**:结算依赖小时级 wp-cron,并有收益页访问触发的懒结算兜底。高流量站点建议禁用 `WP_CRON_LOCK` 场景下的默认 WP-Cron,改用系统 crontab 定时请求 `wp-cron.php`,保证结算与过期任务准时执行。 -- **反代 / CDN 与 IP 风控**:主题默认按 Cloudflare → 通用代理头顺序识别真实 IP。若需收紧伪造风险,添加 `add_filter('aksrt_trusted_proxies', fn() => ['10.0.0.0/8', '173.245.48.0/20'])`(填入你的代理/CDN 网段);名单非空时仅当 `REMOTE_ADDR` 命中名单才采纳转发头,否则直接使用 `REMOTE_ADDR`(推广奖励的 IP 日上限、验证码等均依赖该函数)。 +- **反代 / CDN 与 IP 风控**:主题默认按 Cloudflare → 通用代理头顺序识别真实 IP。若需收紧伪造风险,添加 `add_filter('jio_trusted_proxies', fn() => ['10.0.0.0/8', '173.245.48.0/20'])`(填入你的代理/CDN 网段);名单非空时仅当 `REMOTE_ADDR` 命中名单才采纳转发头,否则直接使用 `REMOTE_ADDR`(推广奖励的 IP 日上限、验证码等均依赖该函数)。 --- @@ -181,20 +181,20 @@ WordPress 后台左侧 **Admin Bar** → ⚡ **AKSRT 主题设置** ### Settings Facade 分层 -- `AKSRT_Settings` 仍是主题设置的**唯一静态 facade**,外部调用方式保持 `AKSRT_Settings::*` +- `JIO_Settings` 仍是主题设置的**唯一静态 facade**,外部调用方式保持 `JIO_Settings::*` - 具体运行时 getter 已按领域拆分到 `inc/classes/settings/`,例如: - - `class-aksrt-settings-theme-search.php` - - `class-aksrt-settings-post-display.php` - - `class-aksrt-settings-home-cms.php` - - `class-aksrt-settings-user-runtime.php` - - `class-aksrt-settings-integration.php` - - `class-aksrt-settings-display-runtime.php` - - `class-aksrt-settings-extension-runtime.php` - - `class-aksrt-settings-credits-runtime.php` - - `class-aksrt-settings-category-runtime.php` - - `class-aksrt-settings-capabilities.php` -- `inc/bootstrap.php` 会先加载 `settings/class-aksrt-settings.php`,再按领域加载这些 delegate 类 -- 新增设置运行时逻辑时,优先放入对应 settings 子类;仅把聚合输出、统一入口和跨域装配保留在 `AKSRT_Settings` + - `class-jio-settings-theme-search.php` + - `class-jio-settings-post-display.php` + - `class-jio-settings-home-cms.php` + - `class-jio-settings-user-runtime.php` + - `class-jio-settings-integration.php` + - `class-jio-settings-display-runtime.php` + - `class-jio-settings-extension-runtime.php` + - `class-jio-settings-credits-runtime.php` + - `class-jio-settings-category-runtime.php` + - `class-jio-settings-capabilities.php` +- `inc/bootstrap.php` 会先加载 `settings/class-jio-settings.php`,再按领域加载这些 delegate 类 +- 新增设置运行时逻辑时,优先放入对应 settings 子类;仅把聚合输出、统一入口和跨域装配保留在 `JIO_Settings` ### 添加新辅助函数 @@ -202,14 +202,14 @@ WordPress 后台左侧 **Admin Bar** → ⚡ **AKSRT 主题设置** ### 添加新页面模板 -将 `page-{name}.php` 放入 `templates/pages/`,并在 `class-aksrt-templates.php` 中注册。 +将 `page-{name}.php` 放入 `templates/pages/`,并在 `class-jio-templates.php` 中注册。 ### CSS 组织规范 | 目录 | 用途 | 加载场景 | |------|------|---------| | `css/frontend/` | 前端公共样式 | 所有前台页面 | -| `css/admin/` | 后台管理样式 | 仅 AKSRT 设置页面 | +| `css/admin/` | 后台管理样式 | 仅 Jio 设置页面 | | `css/shared/` | 共用组件样式 | 前后端按需加载(如验证码) | --- diff --git a/archive-resources.php b/archive-resources.php index 6be35693..8d60ae1d 100644 --- a/archive-resources.php +++ b/archive-resources.php @@ -2,9 +2,9 @@ /** * Resource Archive Template * - * Virtual list at /resources/ — ordinary posts marked with _aksrt_is_resource. + * Virtual list at /resources/ — ordinary posts marked with _jio_is_resource. * - * @package AKSRT + * @package Jio */ defined('ABSPATH') || exit; @@ -25,18 +25,18 @@ if (!in_array($current_price, ['all', 'free', 'paid'], true)) { $price_min = isset($_GET['price_min']) && $_GET['price_min'] !== '' ? (float) $_GET['price_min'] : ''; $price_max = isset($_GET['price_max']) && $_GET['price_max'] !== '' ? (float) $_GET['price_max'] : ''; -$archive_url = function_exists('aksrt_resource_archive_url') ? aksrt_resource_archive_url() : home_url('/resources/'); +$archive_url = function_exists('jio_resource_archive_url') ? jio_resource_archive_url() : home_url('/resources/'); $sort_options = [ - 'date' => __('最新', 'aksrt'), - 'downloads' => __('热门下载', 'aksrt'), - 'views' => __('阅读最多', 'aksrt'), + 'date' => __('最新', 'jio'), + 'downloads' => __('热门下载', 'jio'), + 'views' => __('阅读最多', 'jio'), ]; $price_options = [ - 'all' => __('全部', 'aksrt'), - 'free' => __('免费', 'aksrt'), - 'paid' => __('付费', 'aksrt'), + 'all' => __('全部', 'jio'), + 'free' => __('免费', 'jio'), + 'paid' => __('付费', 'jio'), ]; $preserve = []; @@ -59,18 +59,18 @@ $has_filter = $current_orderby !== 'date' || $current_price !== 'all' || $price_
    - -
    @@ -79,9 +79,9 @@ $has_filter = $current_orderby !== 'date' || $current_price !== 'all' || $price_
    -
    '; if ($has_sidebar) { get_sidebar(); } diff --git a/assets/admin/extract-naive-styles.mjs b/assets/admin/extract-naive-styles.mjs index 838de687..82be1608 100644 --- a/assets/admin/extract-naive-styles.mjs +++ b/assets/admin/extract-naive-styles.mjs @@ -104,7 +104,7 @@ const COMPONENT_STYLES = [ ] async function extractStyles() { - console.log('\n[AKSRT] 开始提取 NaiveUI 组件样式...\n') + console.log('\n[Jio] 开始提取 NaiveUI 组件样式...\n') const allCss = [] let successCount = 0 @@ -137,9 +137,9 @@ async function extractStyles() { // 静默跳过的后果是组件样式整体缺失(取色器曾因此没有尺寸和边框,糊成一团), // 而页面不报错,只能靠肉眼发现。 if (code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND') { - console.error(`[AKSRT] 样式路径不存在,已跳过: ${componentPath}`) + console.error(`[Jio] 样式路径不存在,已跳过: ${componentPath}`) } else { - console.error(`[AKSRT] 样式提取异常,已跳过: ${componentPath}: ${err && err.message}`) + console.error(`[Jio] 样式提取异常,已跳过: ${componentPath}: ${err && err.message}`) } failCount++ } @@ -148,7 +148,7 @@ async function extractStyles() { const cssOutput = allCss.join('\n\n') if (!cssOutput.trim()) { - console.warn('[AKSRT] 警告:未提取到任何 NaiveUI 样式!') + console.warn('[Jio] 警告:未提取到任何 NaiveUI 样式!') return null } @@ -165,7 +165,7 @@ ${cssOutput}` await writeFile(cssFile, fullContent, 'utf-8') - console.log(`[AKSRT] NaiveUI 样式提取完成:`) + console.log(`[Jio] NaiveUI 样式提取完成:`) console.log(` 成功: ${successCount} 个组件`) console.log(` 跳过: ${failCount} 个组件`) console.log(` 输出: ${cssFile}`) @@ -176,6 +176,6 @@ ${cssOutput}` // 执行 extractStyles().catch((err) => { - console.error('[AKSRT] 样式提取失败:', err) + console.error('[Jio] 样式提取失败:', err) process.exit(1) }) diff --git a/assets/admin/index.html b/assets/admin/index.html index 7418cf13..b5855ff6 100644 --- a/assets/admin/index.html +++ b/assets/admin/index.html @@ -3,10 +3,10 @@ - AKSRT 主题设置 + Jio 主题设置 -
    +
    diff --git a/assets/admin/package-lock.json b/assets/admin/package-lock.json index fdbdc2d7..9d983df7 100644 --- a/assets/admin/package-lock.json +++ b/assets/admin/package-lock.json @@ -1,11 +1,11 @@ { - "name": "aksrt-admin", + "name": "jio-admin", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "aksrt-admin", + "name": "jio-admin", "version": "1.0.0", "dependencies": { "@codemirror/lang-css": "^6.3.1", diff --git a/assets/admin/package.json b/assets/admin/package.json index c7dee7a0..7580efcf 100644 --- a/assets/admin/package.json +++ b/assets/admin/package.json @@ -1 +1 @@ -{"name":"aksrt-admin","version":"1.0.0","private":true,"type":"module","scripts":{"dev":"vite","build":"vite build && node extract-naive-styles.mjs","build:public":"node ../../tools/build-public-assets.mjs","build:pay-charts":"node ../../tools/build-pay-charts.mjs","preview":"vite preview"},"dependencies":{"@codemirror/lang-css":"^6.3.1","@codemirror/lang-html":"^6.4.11","@codemirror/lang-javascript":"^6.2.5","@codemirror/theme-one-dark":"^6.1.3","codemirror":"^6.0.2","naive-ui":"^2.40.0","pinia":"^2.2.0","vue":"^3.5.0","vue-router":"^4.4.0","vuedraggable":"^4.1.0"},"devDependencies":{"@vitejs/plugin-vue":"^5.1.0","echarts":"^6.1.0","esbuild":"^0.25.12","vite":"^6.0.0"},"allowScripts":{"esbuild@0.25.12":true,"vue-demi@0.14.10":true}} \ No newline at end of file +{"name":"jio-admin","version":"1.0.0","private":true,"type":"module","scripts":{"dev":"vite","build":"vite build && node extract-naive-styles.mjs","build:public":"node ../../tools/build-public-assets.mjs","build:pay-charts":"node ../../tools/build-pay-charts.mjs","preview":"vite preview"},"dependencies":{"@codemirror/lang-css":"^6.3.1","@codemirror/lang-html":"^6.4.11","@codemirror/lang-javascript":"^6.2.5","@codemirror/theme-one-dark":"^6.1.3","codemirror":"^6.0.2","naive-ui":"^2.40.0","pinia":"^2.2.0","vue":"^3.5.0","vue-router":"^4.4.0","vuedraggable":"^4.1.0"},"devDependencies":{"@vitejs/plugin-vue":"^5.1.0","echarts":"^6.1.0","esbuild":"^0.25.12","vite":"^6.0.0"},"allowScripts":{"esbuild@0.25.12":true,"vue-demi@0.14.10":true}} \ No newline at end of file diff --git a/assets/admin/src/App.vue b/assets/admin/src/App.vue index 6a4981b4..43c45f0d 100644 --- a/assets/admin/src/App.vue +++ b/assets/admin/src/App.vue @@ -6,9 +6,9 @@ - + -