# Argon 主题开发文档 ## 项目概述 Argon 是一款基于 WordPress 的现代化博客主题,采用 Material Design 设计语言,提供丰富的功能和高度的可定制性。 ### 核心特性 - Material Design 风格界面 - 响应式布局,支持多种页面布局模式(单栏/双栏/三栏) - 夜间模式与 AMOLED 暗黑模式 - 沉浸式主题色系统 - PJAX 无刷新页面加载 - 瀑布流文章列表布局 - 完整的评论系统(支持 Markdown、表情、点赞、置顶) - 说说功能(类似微博的短内容发布) - AI 摘要生成 - 代码高亮与数学公式渲染 - 友链管理系统 - 反馈系统 - 性能优化模块 ### 技术栈 - PHP 7.0+ - WordPress 4.4+ - jQuery 3.x - Bootstrap 4 (Argon Design System) - Highlight.js (代码高亮) - MathJax/KaTeX (数学公式) - Headroom.js (顶栏自动隐藏) ## 项目文件结构 ### 核心文件 ``` argon/ ├── style.css # 主题样式表 (核心样式定义,包含配色、排版、组件样式) ├── argontheme.js # 主题核心 JavaScript (负责 PJAX、界面交互、功能初始化) ├── functions.php # WordPress 主题函数 (功能入口、Hook 挂载、核心逻辑实现) ├── settings.php # 后台设置页面 (提供外观、功能开关等配置选项) ├── header.php # 页面头部模板 (HTML Head、顶部导航栏、全局变量输出) ├── footer.php # 页面底部模板 (页脚区域、JavaScript 脚本引入) ├── index.php # 首页模板 (文章列表展示) ├── single.php # 文章页模板 (单篇文章内容展示) ├── page.php # 页面模板 (独立页面展示) ├── archive.php # 归档页模板 (分类、标签、日期归档) ├── search.php # 搜索结果页模板 ├── 404.php # 404 错误页面模板 ├── comments.php # 评论区模板 (评论列表与发表评论表单) ├── sidebar.php # 侧边栏模板 (个人信息卡片、小工具挂载点) ├── admin.css # 后台设置页面样式 └── languages/ # 多语言包目录 (.po/.mo 文件) ``` ### 功能模块文件 ``` argon/ ├── shuoshuo.php # 说说页面模板 ├── timeline.php # 时间线页面模板 ├── msgboard.php # 留言板页面模板 ├── friend-links.php # 友链页面模板 ├── feedback.php # 反馈系统 ├── emotions.php # 表情系统 ├── parsedown.php # Markdown 解析器 ├── useragent-parser.php # User Agent 解析 ├── ai-summary-query.php # AI 摘要查询接口 ├── unsubscribe-comment-mailnotice.php # 评论邮件退订 └── argon-performance.js # 性能优化模块 ``` ### 模板片段 ``` template-parts/ ├── content-single.php # 单篇文章内容 ├── content-page.php # 页面内容 ├── content-preview-1.php # 文章预览样式 1 ├── content-preview-2.php # 文章预览样式 2 ├── content-preview-3.php # 文章预览样式 3 ├── content-shuoshuo.php # 说说内容 ├── content-shuoshuo-preview.php # 说说预览 ├── content-shuoshuo-details.php # 说说详情 ├── content-timeline.php # 时间线内容 ├── content-none-search.php # 搜索无结果 ├── content-none-tag.php # 标签无结果 ├── ai-summary.php # AI 摘要组件 ├── emotion-keyboard.php # 表情键盘 ├── post-actions.php # 文章操作按钮 └── shuoshuo-operations.php # 说说操作按钮 ``` ### 资源文件 ``` assets/ ├── css/ │ ├── argon.css # Argon Design System 样式 │ └── bootstrap/ # Bootstrap 样式 ├── js/ │ ├── argon.js # Argon Design System 脚本 │ └── easter-egg.js # 彩蛋功能 ├── img/ # 图片资源 ├── icons/ # 图标资源 ├── vendor/ # 第三方库 ├── tinymce_assets/ # TinyMCE 编辑器资源 ├── argon_css_merged.css # 合并后的 CSS └── argon_js_merged.js # 合并后的 JS ``` ### 邮件模板 ``` email-templates/ ├── base.php # 邮件模板基类 ├── comment-notify.php # 评论通知 ├── reply-notify.php # 回复通知 ├── feedback-notify.php # 反馈通知 ├── spam-notify.php # 垃圾评论通知 ├── blacklist-spam-notify.php # 黑名单垃圾评论通知 └── username-change-notify.php # 用户名变更通知 ``` ## 代码规范 ### CSS 规范 #### 格式化规则 - 使用 Tab 缩进(1 Tab = 4 空格宽度) - 每个属性独占一行 - 属性之间不要有空行 - 规则块之间保留一个空行 - 选择器与 `{` 之间有一个空格 - 属性值后的 `;` 前不要有空格 #### 示例 ```css /* 正确 */ .selector { property: value; another-property: value; } .another-selector { property: value; } /* 错误 - 属性之间有空行 */ .selector { property: value; another-property: value; } ``` #### 注释规范 ```css /* ========================================================================== 大区块标题 ========================================================================== */ /* ---------- 小区块标题 ---------- */ /* 普通注释 */ ``` ### JavaScript 规范 #### 格式化规则 - 使用 Tab 缩进 - 字符串优先使用单引号 `'` - 比较运算符使用严格相等 `===` 和 `!==` - 语句末尾必须有分号 `;` - 函数名与括号之间无空格 - 关键字后有空格(if, for, while, function 等) #### 变量声明 - 优先使用 `let` 和 `const` - 避免使用 `var`(除非需要函数作用域或全局变量) #### 全局变量(需保留 var) 以下全局变量必须使用 `var` 声明以确保跨作用域访问: - `argonConfig` - 主题配置对象 - `translation` - 多语言翻译表 - `pjaxLoading` - PJAX 加载状态 - `headroom` - Headroom 实例 #### 注释规范 ```javascript // ========================================================================== // 大区块标题 // ========================================================================== // ---------- 小区块标题 ---------- /** * 函数说明 * @param {string} param - 参数说明 * @returns {boolean} 返回值说明 */ function functionName(param) { // 单行注释 if (param === 'value') { return true; } return false; } ``` ### PHP 规范 #### 格式化规则 - 使用 Tab 缩进 - 字符串优先使用单引号 - 数组使用短语法 `[]` - 类名使用 PascalCase - 函数名使用 snake_case(遵循 WordPress 规范) - 箭头操作符 `->` 前后不要有空格 #### WordPress 特定 - 使用 `esc_html()`, `esc_attr()` 等函数转义输出 - 使用 `wp_nonce_field()` 进行安全验证 - 遵循 WordPress Coding Standards #### 示例 ```php // 正确 $theme->Version get_option('argon_theme_color') // 错误 $theme -> Version ``` ## 核心架构 ### 主题初始化流程 主题的初始化分为服务器端(PHP)和客户端(JavaScript)两个阶段。 #### 服务器端初始化 1. **functions.php 加载**(WordPress 加载主题时执行) ```php // functions.php // 检查 WordPress 版本兼容性 if (version_compare($GLOBALS['wp_version'], '4.4-alpha', '<')) { echo "
Argon 主题不支持 Wordpress 4.4 以下版本
"; } // 设置主题支持功能 function theme_slug_setup() { add_theme_support('title-tag'); // 标题标签 add_theme_support('post-thumbnails'); // 特色图片 load_theme_textdomain('argon', get_template_directory() . '/languages'); // 多语言 } add_action('after_setup_theme','theme_slug_setup'); // 设置全局变量 $argon_version = !(wp_get_theme()->Template) ? wp_get_theme()->Version : wp_get_theme(wp_get_theme()->Template)->Version; $GLOBALS['theme_version'] = $argon_version; $GLOBALS['assets_path'] = get_bloginfo('template_url'); ``` 2. **导航菜单注册** 主题通过 `init` 挂钩注册了四个核心菜单位置,用于定义页面的不同导航区域: ```php // functions.php function init_nav_menus(){ register_nav_menus( array( 'toolbar_menu' => __('顶部导航', 'argon'), // 顶部工具栏菜单 'leftbar_menu' => __('左侧栏菜单', 'argon'), // 左侧主要导航菜单 'leftbar_author_links' => __('左侧栏作者个人链接', 'argon'), // 左侧作者信息下方的图标链接 'leftbar_friend_links' => __('左侧栏友情链接', 'argon') // 左侧底部的友情链接区域 )); } add_action('init', 'init_nav_menus'); ``` 3. **header.php 渲染**(输出 HTML 头部) ```php // header.php // 1. 生成 HTML 类名(根据后台设置) $htmlclasses = ""; if (get_option('argon_page_layout') == "single"){ $htmlclasses .= "single-column "; } if (get_option('argon_enable_immersion_color') == "true"){ $htmlclasses .= "immersion-color "; } // ... 更多类名 // 2. 获取主题色配置 $themecolor = get_option("argon_theme_color", "#5e72e4"); if (isset($_COOKIE["argon_custom_theme_color"])){ if (checkHEX($_COOKIE["argon_custom_theme_color"]) && get_option('argon_show_customize_theme_color_picker') != 'false'){ $themecolor = $_COOKIE["argon_custom_theme_color"]; } } // 3. 输出 HTML 文档头 ?> class="no-js "> ``` #### 客户端初始化 1. **兼容性修复**(argontheme.js 开头) ```javascript // argontheme.js // 确保 Prism 存在 if (typeof window.Prism === 'undefined') { window.Prism = { highlightAll: function() {}, highlightElement: function() {}, plugins: {} }; } // 确保 jQuery 插件存在 if (typeof jQuery !== 'undefined') { (function($) { // 修复空选择器问题 if (!$.fn._argonInit) { $.fn._argonInit = $.fn.init; $.fn.init = function(selector, context, root) { if (typeof selector === 'string') { let trimmed = selector.trim(); if (trimmed === '' || trimmed === '#') { return new $.fn._argonInit(); } } return $.fn._argonInit.call(this, selector, context, root); }; $.fn.init.prototype = $.fn; } })(jQuery); } ``` 2. **工具函数定义** ```javascript // argontheme.js // Cookie 操作 function setCookie(cname, cvalue, exdays) { /* ... */ } function getCookie(cname) { /* ... */ } // 多语言翻译 var translation = {}; translation['en_US'] = { /* ... */ }; translation['ru_RU'] = { /* ... */ }; function __(text) { if (typeof translation[argonConfig.language] !== 'undefined' && typeof translation[argonConfig.language][text] !== 'undefined') { return translation[argonConfig.language][text]; } return text; } ``` 3. **DOM 加载完成后初始化** ```javascript // argontheme.js $(document).ready(function() { // 初始化顶栏 initNavbar(); // 初始化侧边栏 initSidebar(); // 初始化瀑布流 waterflowInit(); // 初始化懒加载 if (argonConfig.lazyload) { initLazyload(); } // 初始化图片缩放 if (argonConfig.zoomify) { $('.post-content img').zoomify(argonConfig.zoomify); } // 初始化代码高亮 if (argonConfig.code_highlight.enable) { initCodeHighlight(); } // 初始化评论系统 initCommentSystem(); // 初始化浮动按钮 initFloatButtons(); // 初始化 PJAX if (!argonConfig.disable_pjax) { initPjax(); } // 移除加载类 $('#float_action_buttons').removeClass('fabtns-unloaded'); }); ``` #### 资源加载策略 1. **CSS 加载顺序** ```php // header.php // 1. 合并的 CSS(包含 Bootstrap 和 Argon Design System) wp_enqueue_style("argon_css_merged", ".../argon_css_merged.css"); // 2. 主题样式(依赖合并的 CSS) wp_enqueue_style("style", ".../style.css", array('argon_css_merged')); ``` 2. **JavaScript 加载顺序** ```php // header.php // 1. 资源加载器(用于备用资源加载) wp_enqueue_script("resource_loader", ".../resource-loader.js"); // 2. 合并的 JS(包含 jQuery 和其他库)- 在头部同步加载 wp_enqueue_script("argon_js_merged", ".../argon_js_merged.js", array(), $assets_version, false); // 3. Argon 修复补丁(必须在 wp_head() 之后) // 4. 主题核心脚本(在 footer.php 中加载) ``` 3. **按需加载** ```javascript // argontheme.js // Google Fonts 按需加载 if (typeof ArgonResourceLoader !== "undefined") { ArgonResourceLoader.smartLoad("//fonts.googleapis.com/css?family=...", "css"); } // 数学公式渲染库在 footer.php 中按设置输出(get_option('argon_math_render')) // 可选:mathjax3 / mathjax2 / katex / disabled ``` #### 强制刷新机制 当主题更新后,可能需要清除客户端缓存: ```php // functions.php function argon_is_force_refresh_enabled() { $enabled_time = get_option('argon_force_refresh_enabled_time', 0); if ($enabled_time == 0) { return false; } // 1 小时后自动关闭 if (time() - $enabled_time > 3600) { update_option('argon_force_refresh_enabled_time', 0); return false; } return true; } function argon_get_assets_version() { if (argon_is_force_refresh_enabled()) { $enabled_time = get_option('argon_force_refresh_enabled_time', 0); return $GLOBALS['theme_version'] . '.r' . $enabled_time; } return $GLOBALS['theme_version']; } ``` 强制刷新时,header.php 会输出清除缓存的脚本: ```javascript // header.php ``` ### 全局配置对象 `argonConfig` 是主题的核心配置对象,在 header.php 中通过 PHP 动态生成并输出到页面: ```javascript var argonConfig = { wp_path: "/", // WordPress 安装路径 language: "zh_CN", // 当前语言代码 dateFormat: "YMD", // 日期显示格式 // 图片缩放配置(Zoomify) zoomify: { duration: 200, // 缩放动画时长(毫秒) easing: "cubic-bezier(0.4,0,0,1)", // 缓动函数 scale: 0.9 // 缩放比例 }, // 如果禁用则为 false pangu: "false", // 盘古之白(中英文间自动加空格) // 懒加载配置 lazyload: true, // 是否启用懒加载 lazyload_effect: "fadeIn", // 懒加载显示效果 lazyload_threshold: 800, // 提前加载阈值(像素) fold_long_comments: false, // 是否折叠长评论 fold_long_shuoshuo: false, // 是否折叠长说说 // PJAX 配置 disable_pjax: false, // 是否禁用 PJAX pjax_animation_durtion: 600, // PJAX 切换动画时长(毫秒) headroom: "false", // 顶栏自动隐藏模式(false/true/absolute) // 文章列表布局 waterflow_columns: "1", // 瀑布流列数(1/2/3) article_list_layout_mobile: "1", // 移动端文章列表布局样式 // 代码高亮配置 code_highlight: { enable: false, // 是否启用代码高亮 hide_linenumber: false, // 是否隐藏行号 transparent_linenumber: false, // 行号是否透明 break_line: false // 是否自动折行 } }; ``` 配置对象的值从 WordPress 后台设置中读取,通过 PHP 的 `get_option()` 函数获取。例如: ```php // header.php lazyload: , ``` ### CSS 变量系统 主题使用 CSS 自定义属性(CSS Variables)实现动态主题色和样式配置。这些变量在 header.php 中通过 PHP 动态生成。 #### 主题色变量 ```php // header.php - 获取主题色 $themecolor = get_option("argon_theme_color", "#5e72e4"); // 支持用户自定义主题色(通过 Cookie) if (isset($_COOKIE["argon_custom_theme_color"])) { if (checkHEX($_COOKIE["argon_custom_theme_color"]) && get_option('argon_show_customize_theme_color_picker') != 'false') { $themecolor = $_COOKIE["argon_custom_theme_color"]; } } // 转换为 RGB 和 HSL 值 $RGB = hexstr2rgb($themecolor); $HSL = rgb2hsl($RGB['R'], $RGB['G'], $RGB['B']); ``` 生成的 CSS 变量: ```css :root { /* 主题色 - 十六进制 */ --themecolor: #5e72e4; /* 主题色 - RGB 分量(用于 rgba() 函数)*/ --themecolor-R: 94; --themecolor-G: 114; --themecolor-B: 228; /* 主题色 - HSL 分量(用于生成色调变体)*/ --themecolor-H: 231; --themecolor-S: 71; --themecolor-L: 63; } ``` #### 动画系统变量 ```css :root { /* 动画时长 - 遵循 Material Design 3 规范 */ --animation-fast: 150ms; // 快速动画(按钮点击等) --animation-normal: 250ms; // 标准动画(卡片展开等) --animation-slow: 400ms; // 慢速动画(页面切换等) /* 缓动函数 - 融合 Material 3 + Apple 风格 */ --ease-standard: cubic-bezier(0.25, 0.1, 0.25, 1); // 标准缓动,流畅自然 --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); // 弹性缓动,有活力 } ``` #### 卡片样式变量 ```css :root { --card-radius: 4px; // 卡片圆角 --card-opacity: 0.7; // 卡片透明度 --card-blur: 20px; // 毛玻璃模糊度 --card-saturate: 180%; // 饱和度增强 --toolbar-blur: 12px; // 顶栏模糊度(卡片的 60%) --page-background-opacity: 1; // 页面背景透明度 } ``` 这些值可以通过后台设置动态调整: ```php // header.php $card_opacity = get_option('argon_post_background_opacity', '0.7'); $card_blur = get_option('argon_card_blur', '20'); $card_saturate = get_option('argon_card_saturate', '180'); ``` #### 颜色变量 ```css :root { /* 日间模式颜色 */ --color-background: #f4f5f7; // 页面背景色 --color-foreground: #fff; // 卡片背景色 --color-widgets: #fff; // 小工具背景色 --color-border: #dce0e5; // 边框颜色 --color-text-deeper: #212529; // 深色文本 } ``` 夜间模式通过 `html.darkmode` 类切换颜色变量: ```css html.darkmode body { --color-background: #282828; // 深色背景 --color-foreground: #424242; // 深色卡片 --color-widgets: #555; // 深色小工具 --color-text-deeper: #eee; // 浅色文本 } ``` AMOLED 暗黑模式提供更深的黑色: ```css html.darkmode.amoled-dark body { --color-background: #111; // 纯黑背景 --color-foreground: #000; // 纯黑卡片 --color-widgets: #151515; // 深黑小工具 } ``` ### 后台设置框架 Argon 主题不依赖第三方设置框架(如 Redux 或 Codestar),而是使用原生 PHP + HTML 实现了一个轻量级的设置页面。 #### 1. 设置页面结构 设置页面位于 `settings.php`,通过 `functions.php` 中的 `add_theme_page` 挂载: ```php // functions.php function themeoptions_admin_menu() { add_theme_page("Argon 主题设置", "Argon 主题选项", 'edit_themes', basename(__FILE__), 'themeoptions_page'); } add_action('admin_menu', 'themeoptions_admin_menu'); ``` 页面内容主要由 `themeoptions_page()` 函数输出,采用 HTML Table 布局,包含多个选项卡(如“全局设置”、“侧栏设置”等)。 #### 2. 选项存储与更新 设置数据的保存逻辑集成在 `settings.php` 顶部: ```php // settings.php if (isset($_POST['update_themeoptions']) && $_POST['update_themeoptions'] == 'true') { // 1. 验证 Nonce 安全令牌 check_admin_referer('argon_update_themeoptions', 'argon_update_themeoptions_nonce'); // 2. 处理复选框(未选中的 checkbox 不会提交,需要手动设为 false) if (!isset($_POST['argon_enable_lazyload'])) $_POST['argon_enable_lazyload'] = 'false'; // 3. 循环更新所有选项 foreach ($_POST as $key => $value) { if (isset($value) && $value != '') { update_option($key, $value); } else { delete_option($key); // 空值则删除选项 } } // 4. 提示保存成功 echo '

设置已保存

'; } ``` #### 3. 添加新选项指南 要在主题中添加一个新的设置项,需遵循以下步骤: 1. 在 `settings.php` 的对应表格行中添加 HTML 输入控件。 2. `name` 属性必须以 `argon_` 开头(这是约定,方便管理)。 3. 使用 `get_option('option_name')` 获取当前值回显。 示例:添加一个“显示版权信息”的开关 ```php ``` ### 前端交互架构 (PJAX & SPA) Argon 主题采用 PJAX (PushState + AJAX) 技术实现单页应用 (SPA) 体验,核心逻辑位于 `assets/js/argontheme.js`。 #### 1. PJAX 工作原理 1. **拦截点击**:监听所有 `a` 标签点击事件。 2. **获取内容**:通过 AJAX 请求目标页面 URL。 3. **解析响应**:从响应 HTML 中提取 `#content` 容器内容。 4. **替换容器**:将当前页面的 `#content` 替换为新内容。 5. **更新状态**:使用 `history.pushState` 更新浏览器 URL。 6. **重载资源**:重新执行内联脚本,重置事件监听器。 #### 2. 初始化与重载机制 由于 PJAX 会替换页面的部分 DOM,依赖旧 DOM 的事件绑定与第三方实例需要在 PJAX 完成后重新初始化。Argon 的实现采用“首屏最小初始化 + PJAX 完整重初始化”的策略。 首屏加载完成后的初始化入口位于 `argontheme.js` 的 `$(document).ready(...)`,主要执行性能优化模块初始化(如已加载)以及基础渲染: ```javascript $(document).ready(function(){ if (typeof initArgonPerformance === 'function') { initArgonPerformance(); } highlightJsRender(); waterflowInit(); }); ``` PJAX 主流程通过 `$(document).pjax(...)` 建立,并在 `pjax:beforeReplace` 统一清理旧页面资源,在 `pjax:complete` 完整初始化新页面模块(包含数学公式渲染、脚本执行与各功能模块的错误隔离初始化)。 #### 3. 脚本执行器 (Inline Script Executor) PJAX 替换的 DOM 片段中可能包含内联 `