原来主题里有个 custom/ 目录(custom.css / custom.js / custom.php), 是给用户随手加样式的入口。问题是它位于主题目录内,而 WordPress 升级 主题的做法是把整个主题目录删掉再解压(class-theme-upgrader.php 里 clear_destination = true,随后 delete_old_theme() 递归删除), 所以每次升级这些文件都会丢。custom.php 还会被 require, 等于在主题里留了一个执行任意 PHP 的口子。 改成后台选项: - 主题选项新增「自定义代码」组,含自定义 CSS / 自定义 JS 两个输入框 - 内容存在数据库的 kratos 选项里,与主题文件解耦,升级、重装都不影响 - 分别在主题样式和主题脚本之后加载,优先级最高 为此新增了 code 字段类型,没有复用 textarea:textarea 的 sanitizer 走 wp_kses(),CSS 的子选择器 > 和 JS 的 < 会被当成 HTML 标签剥掉, 样式会静默失效。code 类型只去掉 PHP 标签、打断 </style> 和 </script>, 其余原样保留。渲染时也不走公共的 stripslashes —— options.php 已经 wp_unslash 过,再剥一层会把 CSS 的 \f101、JS 的 \n 啃坏。 自定义 CSS 的默认值就是原来 custom.css 的内容,逐字节一致(354 字节), 所以升级瞬间站点外观没有任何变化。清空输入框保存即可彻底去掉。 验证:真实 WP 7.1.3 / PHP 8.5.12 环境 20 条断言全过(含 DB 往返、 子选择器 / 反斜杠保真、危险内容过滤),生产选项指纹前后一致; 反向注入「默认值改空」能立刻被抓到。
42 lines
1.1 KiB
PHP
42 lines
1.1 KiB
PHP
<?php
|
|
/**
|
|
* 模板函数
|
|
* @author Seaton Jiang <seaton@vtrois.com>
|
|
* @license MIT License
|
|
* @version 2020.03.17
|
|
*/
|
|
|
|
define('THEME_VERSION', wp_get_theme()->get('Version'));
|
|
|
|
// 主题配置
|
|
require get_template_directory() . '/inc/options-framework/autoload.php';
|
|
|
|
// 自定义代码(CSS / JS,存选项表而非主题目录)
|
|
require get_template_directory() . '/inc/theme-custom-code.php';
|
|
|
|
// 更新配置
|
|
require get_template_directory() . '/inc/update-checker/autoload.php';
|
|
|
|
// 核心配置
|
|
require get_template_directory() . '/inc/theme-core.php';
|
|
|
|
// 站点配置
|
|
require get_template_directory() . '/inc/theme-setting.php';
|
|
|
|
// 文章配置
|
|
require get_template_directory() . '/inc/theme-article.php';
|
|
|
|
// 小工具配置
|
|
require get_template_directory() . '/inc/theme-widgets.php';
|
|
|
|
// 文章增强
|
|
require get_template_directory() . '/inc/theme-shortcode.php';
|
|
|
|
// 添加导航目录
|
|
require get_template_directory() . '/inc/theme-navwalker.php';
|
|
|
|
// 对象存储配置
|
|
require get_template_directory() . '/inc/theme-dogecloud.php';
|
|
|
|
// SMTP 配置
|
|
require get_template_directory() . '/inc/theme-smtp.php'; |