🐕🦺 修复小部件排序下拉框问题
问题描述
Boxmoe_文章侧栏小部件的排序下拉框无法点击,影响用户选择文章排序方式。
问题分析
- 主题加载了自定义的下拉框美化脚本(admin-select-ui.js),将原生的select元素替换为自定义的美化版本
- 美化脚本没有排除小部件编辑区域,导致小部件中的select元素也被美化
- 美化后的下拉框与WordPress的小部件系统产生冲突,导致无法点击
初次修复方案
- 在admin-select-ui.js中添加对小部件编辑区域的排除规则
- 排除小部件编辑区域(.widget-inside)、小部件内容区域(.widget-content)等
- 问题:服务器环境下仍然无法点击
深入分析
- 检查SMTP设置页面的下拉框实现方式,发现关键区别:
- SMTP设置页面的下拉框使用了class="regular-text"类
- 小部件中的下拉框没有使用class="regular-text"类
- 服务器环境可能存在缓存问题,JS文件版本号固定导致缓存不更新
最终修复方案
- 修改JS文件版本控制:
- 使用文件修改时间作为版本号,确保文件更新后缓存自动失效
- 更新CSS文件版本号到1.2,确保样式也是最新的
- 增强JavaScript兼容性:
- 添加jQuery加载检查,确保在jQuery完全加载后才执行代码
- 添加额外的延迟初始化(500ms),确保在所有环境下都能正常工作
- 添加控制台日志,便于调试
- 精确的选择策略:
- 第一层过滤:只美化有regular-text类的select元素
- 第二层过滤:排除所有小部件区域中的select元素,无论它们是否有regular-text类
- 排除的小部件区域包括:.widget-inside、.widget-content、#widgets-right、.widgets-holder-wrap、.widget
修复效果
- SMTP设置页面的下拉框(有regular-text类且不在小部件区域)会被美化,保持美观
- 小部件中的下拉框(即使有regular-text类,但在小部件区域内)不会被美化,保持原生功能
- 其他有regular-text类的下拉框(不在小部件区域内)会被美化,保持主题一致性
修改文件
/core/module/fun-admin.php- 修改JS文件加载方式,使用动态版本号/assets/js/admin-select-ui.js- 修改下拉框美化逻辑,添加双重过滤机制
📃 修复代码块中的MD语法被解析为html
🎯 问题描述:
在Markdown解析过程中,代码块中的MD语法被错误地解析为HTML代码,导致代码块显示异常。
🔍 问题分析:
- 在
fun-markdown.php文件中,代码块被正确识别并替换为占位符(如)// 先处理段落,添加<p>标签 $parts = preg_split('/\n\n+/', trim($text)); foreach($parts as &$p){ // 🎯 检查是否是代码块占位符,如果是则不添加<p>标签 if(!preg_match('/^\s*<(h\d|ul|ol|pre|blockquote|img|a|table|audio|video)/i',$p) && !preg_match('/^__MD_CODE_\d+__$/', $p)){ $p = '<p>'.$p.'</p>'; } } $text = implode("\n", $parts); - 但在段落处理阶段(第183-189行),这些占位符可能会被错误地包裹在
标签中 - 虽然有占位符替换回HTML的代码,但顺序和逻辑存在问题
🛠️ 修复方案:
- 段落处理优化:在段落处理时添加对代码块占位符的检查,确保占位符不会被错误地包裹在
标签中 - 代码块HTML修复:在代码块占位符替换为HTML后,添加正则表达式移除可能包裹在代码块HTML外的
标签
📝 具体修改:
- 修改段落处理逻辑(第183-189行):
// 先处理段落,添加<p>标签
$parts = preg_split('/\n\n+/', trim($text));
foreach($parts as &$p){
// 🎯 检查是否是代码块占位符,如果是则不添加<p>标签
if(!preg_match('/^\s*<(h\d|ul|ol|pre|blockquote|img|a|table|audio|video)/i',$p) &&
!preg_match('/^__MD_CODE_\d+__$/', $p)){
$p = '<p>'.$p.'</p>';
}
}
$text = implode("\n", $parts);
- 添加代码块HTML清理逻辑(第204-208行):
// 处理代码块占位符
$html = $text;
foreach($blocks as $k=>$v){
$html = str_replace($k,$v,$html);
}
// 🎯 移除包裹在代码块HTML外的<p>标签
$html = preg_replace('/<p>\s*(<pre class="prettyprint linenums.*?<\/pre>)\s*<\/p>/s', '$1', $html);
return $html;
✅ 修复效果:
- 代码块能够正确渲染,不会被额外的HTML标签干扰
- 确保代码块占位符(格式为
__MD_CODE_数字__)在段落处理时被正确识别 - 在最终输出前清理可能包裹在代码块外的段落标签
📁 相关文件:
wp-content/themes/lolimeow-shiroki/core/module/fun-markdown.php

评论(2)