From 1cf4267c18911be16c771d62410664e8b85fbf26 Mon Sep 17 00:00:00 2001 From: laoyang Date: Sun, 25 Oct 2026 22:17:45 +0800 Subject: [PATCH] =?UTF-8?q?fix(lightbox):=20=E6=97=A0=E9=99=84=E4=BB=B6=20?= =?UTF-8?q?ID=20=E7=9A=84=E5=9B=BE=E7=89=87=E6=94=B9=E7=94=A8=20img=20?= =?UTF-8?q?=E7=9A=84=20data-full=20=E4=BD=9C=E5=8E=9F=E5=9B=BE=E5=85=9C?= =?UTF-8?q?=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 3.2.40 初版把「原图地址」只做了两级兜底:附件 ID → href。 `yang_lightbox_img_src()`(读 data-full / data-large-file / data-orig-file)当时是**定义了但没人调用**的死代码,等于白写。 后果是这一类结构取不到原图: 三处都是缩略图,只有 data-full 里是真原图,且 img 没有 wp-image 类 —— 编辑器之外插入的图、部分插件输出的图常是这种形态。用户点开 看到的还是那张小图,会认为灯箱根本没起作用。 改成三级兜底:附件 ID → img 上的 data-full 等属性 → href。 第二级取到的值必须再过一次「像不像图片」,因为有些插件会在 data-full 里放页面地址,不验就会让灯箱加载出一个 HTML 页面。 守卫补在服务端探针 B2 段(4 条,直接看输出里的 href,不看函数里 有没有出现那个字符串),并新增两条反向注入: S12 砍掉第二级兜底、S13 去掉图片校验。同时更新 S2 的注入锚点 —— 它原来只删第一级,会被第二级救回来,注入等于没做。 Refs #10 --- inc/theme-lightbox.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/inc/theme-lightbox.php b/inc/theme-lightbox.php index e57d31b..542591a 100644 --- a/inc/theme-lightbox.php +++ b/inc/theme-lightbox.php @@ -357,8 +357,26 @@ function yang_lightbox_content($content) $img = $imgs->item(0); $imgHtml = $doc->saveHTML($img); - // 原图优先从附件 ID 取(最可靠),其次 href 自己 + /* 原图地址的三级兜底,顺序不能换: + * ① 附件 ID → full 尺寸(最可靠:多站点/子目录/换过原图都能对上) + * ② 自己带的 data-full / data-large-file / data-orig-file + * (很多插件会把原图塞在这些属性里,而 href 反而是缩略图) + * ③ 最后才是 href 本身 + * + * 🔴 ② 这一步不能省。有些站点的结构是 + * `` + * —— 三处都是缩略图、只有 data-full 里是真原图,且 img 没有 + * wp-image 类(编辑器之外插入的图常这样)。只做 ①③ 就会 + * 「点开还是那张小图」,用户会觉得灯箱没作用。 + * ⚠️ 取到的值必须再验一次「像不像图片」,否则某些插件会在 + * data-full 里放页面地址。 */ $full = yang_lightbox_full_url(yang_lightbox_attachment_id($imgHtml)); + if ($full === '') { + $cand = yang_lightbox_img_src($imgHtml); + if ($cand !== '' && yang_lightbox_is_image_url($cand)) { + $full = $cand; + } + } if ($full === '') { $full = $href; }