后台代码配色预览不上色 + donate.png 404 一并修复 #14

Bug 1:后台预览的示例代码没有高亮。三层原因叠在一起。
  ① yang_hl_admin_assets() 从未 enqueue hljs 本体,而 yang_hl_enqueue()
     开头 `if (is_admin() || is_feed()) return;` 挡掉后台
     ⇒ 后台 window.hljs 恒 undefined ⇒ recolor() 静默 return。
     卡片的边框/顶栏是 data-kind 驱动的纯 CSS,切深浅配色时照样会变,
     看起来像"预览在工作,只是代码没颜色"。
  ② init() 里 applyTheme(sel.value, true) 传 noRecolor=true ⇒ 首屏永不上色,
     只有手动拨下拉框才有颜色(正是报障的"下面的示例代码并没有高亮")。
  ③ recolor() 缺 hljs 时只是 return,控制台零输出 ⇒ 极难定位。

  修法:
  - inc/theme-highlight.php:后台 enqueue hljs 本体,并作为 preview 脚本的
    硬依赖(不靠 WP 的加载顺序碰运气);前台 yang_hl_enqueue() 仍挡后台。
  - assets/js/highlight-admin.js:删掉 noRecolor 这个"能否跳过核心动作"的
    参数(调用方迟早会用错);首屏与切换走同一条路径。
  - 缺 hljs / 上色失败时 console.error 出声,并给 code 打
    data-unhighlighted、给卡片打 data-hl-failed;CSS 画橙色虚线框 +
    顶栏文字,让失败在画面上也看得出来,不再是一坨单色字。
  - 配色样式加载主路径改为 setTimeout(once, 125),link.onload 只作加速。
    onload 三情形不触发:样式表已在缓存、link 移除后重插、jsdom 无网络。

Bug 2:后台设置页报 donate.png 404。
  库里 g_donate_alipay / g_donate_wechat 存的是旧主题目录名
  `.../themes/kratos-master/assets/img/donate.png` 的绝对 URL。前台走
  yang_option_image() 有 yang_image_url_is_stale() 兜底,后台
  class-options-media-uploader.php 直接 echo $value,绕过检测。
  修在渲染处:预览图与"浏览文件"href 走检测后的 $preview(带
  function_exists 兜底),输入框仍显示库里的原值,不偷偷改用户数据。

版本 3.2.44 → 3.2.45。
This commit is contained in:
2026-10-26 12:20:33 +08:00
parent 03b0bc6cc1
commit 9da5e9e2df
5 changed files with 165 additions and 39 deletions
@@ -78,11 +78,38 @@ class Options_Framework_Media_Uploader {
if ( $value != '' ) {
$remove = '<a class="remove-image">删除</a>';
$image = preg_match( '/(^.*\.jpg|jpeg|png|gif|svg|ico*)/i', $value );
if ( $image ) {
$output .= '<img src="' . $value . '" alt="" />' . $remove;
/* 🔴 预览图必须先过一遍「陈旧地址」检查,不能把库里的值直接塞进 src。
*
* 3.2.45 实测:kratos 选项里 g_donate_alipay / g_donate_wechat
* 躺着 `https://站点/wp-content/themes/kratos-master/assets/img/donate.png`
* —— 很早以前保存表单时把当时的 std(绝对 URL)写进了库,
* 后来主题目录从 kratos-master 改名成 kratos_yang。
*
* 前台没事:模板走 yang_option_image(),那个函数里有
* yang_image_url_is_stale() 拦着,会落回默认图。
* 但**后台这里不走那个函数**,直接 echo $value ⇒
* 每打开一次选项页就往控制台报一次 donate.png 404。
*
* 为什么在渲染处修而不是"直接把库改掉":库是所有站点的,
* 而这段代码要保证**任何人**的库里有陈旧地址时后台都不报 404。
* 同时前台的行为一个字都不用变(它本来就有兜底)。
*
* ⚠️ 只影响预览图与"浏览文件"链接的 href,
* **输入框里仍然显示库里的原值** —— 那是用户能看到、
* 能自己改的地方。偷偷改显示值会让人以为设置被篡改了。 */
$preview = $value;
if ( function_exists( 'yang_image_url_is_stale' ) && yang_image_url_is_stale( $preview ) ) {
$preview = function_exists( 'yang_image_default' )
? yang_image_default( $id )
: '';
}
$image = preg_match( '/(^.*\.jpg|jpeg|png|gif|svg|ico*)/i', $preview );
if ( $image && $preview !== '' ) {
$output .= '<img src="' . esc_url( $preview ) . '" alt="" />' . $remove;
} else {
$parts = explode( "/", $value );
$parts = explode( "/", $preview );
for( $i = 0; $i < sizeof( $parts ); ++$i ) {
$title = $parts[$i];
}
@@ -92,7 +119,7 @@ class Options_Framework_Media_Uploader {
// Standard generic output if it's not an image.
$title = __( '浏览文件', 'kratos' );
$output .= '<div class="no-image"><span class="file_link"><a href="' . $value . '" target="_blank" rel="external">'.$title.'</a></span></div>';
$output .= '<div class="no-image"><span class="file_link"><a href="' . esc_url( $preview ) . '" target="_blank" rel="external">'.$title.'</a></span></div>';
}
}
$output .= '</div>' . "\n";
+26 -3
View File
@@ -685,7 +685,7 @@ function yang_hl_enqueue()
* (本项目历史上被 OPcache/缓存这类"文件名对、内容旧"坑过多次)。
* 读主题头用 wp_get_theme()->get('Version'),WordPress 自带缓存,无额外开销。 */
$theme = wp_get_theme();
$ver = $theme && $theme->get('Version') ? $theme->get('Version') : '3.2.44';
$ver = $theme && $theme->get('Version') ? $theme->get('Version') : '3.2.45';
$uri = get_template_directory_uri();
$key = yang_hl_theme_key();
@@ -771,7 +771,7 @@ function yang_hl_admin_assets($hook)
$dir = get_template_directory();
$uri = get_template_directory_uri();
$theme = wp_get_theme();
$ver = $theme && $theme->get('Version') ? $theme->get('Version') : '3.2.44';
$ver = $theme && $theme->get('Version') ? $theme->get('Version') : '3.2.45';
// 卡片骨架(与前台同一个文件)
wp_enqueue_style('yang-hl-admin-card',
@@ -781,8 +781,31 @@ function yang_hl_admin_assets($hook)
wp_enqueue_style('yang-hl-admin-preview',
$uri . '/assets/css/highlight-admin.css', array('yang-hl-admin-card'), $ver);
/* 🔴 hljs 本体必须在后台也加载。
*
* 3.2.44 第一版只 enqueue 了上面两个 CSS + 自己的 JS,**漏了 hljs**。
* 而 yang_hl_enqueue() 开头就是 `if (is_admin() || is_feed()) return;`
* ⇒ 后台 window.hljs 恒 undefined ⇒ highlight-admin.js 的
* `if (!code || !window.hljs) { return; }` 静默 return
* ⇒ 预览里一个 token span 都没有,只剩配色 CSS 给 <pre> 的底色。
*
* 这个 bug 极难从画面上判断:卡片的边框/顶栏颜色是 data-kind 驱动的
* 纯 CSS,不依赖 hljs,切换深/浅配色时**它们照样会变**
* ⇒ 看起来像"预览在正常工作,只是代码没变色"。
* 控制台也一个字都没有(return 不是 throw)。
*
* ⇒ 所以:① 这里把 hljs 作为 preview 脚本的硬依赖;
* ② highlight-admin.js 里缺 hljs 时必须 console.error 出声。 */
wp_enqueue_script(
'yang-hl-admin-lib',
$uri . '/assets/hljs/highlight.min.js',
array(),
$ver,
true
);
wp_enqueue_script('yang-hl-admin-preview',
$uri . '/assets/js/highlight-admin.js', array(), $ver, true);
$uri . '/assets/js/highlight-admin.js', array('yang-hl-admin-lib'), $ver, true);
// 把 20 套配色的 key 和基准 URL 传给 JS
wp_localize_script('yang-hl-admin-preview', 'YANG_HL_ADMIN', array(