fix(lightbox): 无附件 ID 的图片改用 img 的 data-full 作原图兜底

3.2.40 初版把「原图地址」只做了两级兜底:附件 ID → href。
`yang_lightbox_img_src()`(读 data-full / data-large-file /
data-orig-file)当时是**定义了但没人调用**的死代码,等于白写。

后果是这一类结构取不到原图:

    <a href="xxx-300x200.png"><img src="xxx-300x200.png" data-full="xxx.png">

三处都是缩略图,只有 data-full 里是真原图,且 img 没有 wp-image 类
—— 编辑器之外插入的图、部分插件输出的图常是这种形态。用户点开
看到的还是那张小图,会认为灯箱根本没起作用。

改成三级兜底:附件 ID → img 上的 data-full 等属性 → href。
第二级取到的值必须再过一次「像不像图片」,因为有些插件会在
data-full 里放页面地址,不验就会让灯箱加载出一个 HTML 页面。

守卫补在服务端探针 B2 段(4 条,直接看输出里的 href,不看函数里
有没有出现那个字符串),并新增两条反向注入:
S12 砍掉第二级兜底、S13 去掉图片校验。同时更新 S2 的注入锚点 ——
它原来只删第一级,会被第二级救回来,注入等于没做。

Refs #10
This commit is contained in:
2026-10-25 22:17:45 +08:00
parent 7125fdd3ce
commit 1cf4267c18
+19 -1
View File
@@ -357,8 +357,26 @@ function yang_lightbox_content($content)
$img = $imgs->item(0);
$imgHtml = $doc->saveHTML($img);
// 原图优先从附件 ID 取(最可靠),其次 href 自己
/* 原图地址的三级兜底,顺序不能换:
* ① 附件 ID → full 尺寸(最可靠:多站点/子目录/换过原图都能对上)
* ② <img> 自己带的 data-full / data-large-file / data-orig-file
* (很多插件会把原图塞在这些属性里,而 href 反而是缩略图)
* ③ 最后才是 href 本身
*
* 🔴 ② 这一步不能省。有些站点的结构是
* `<a href="xxx-300x200.jpg"><img src="xxx-300x200.jpg" data-full="xxx.jpg">`
* —— 三处都是缩略图、只有 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;
}