# 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 片段中可能包含内联 `