简介
在论坛经常看到“未找到 ID 为 [2025xxxxxxxxxxxx-xxxxxxx] 的内容块”,这样的问题。
究其原因,是因为思源的引用通过块 id 实现,但由于剪切等操作会导致块 id 改变,很容易在用户不知情的情况下,导致块 id 丢失,从而引起引用链接失效。
有没有办法解决这个问题呢?
本人设计了一套解决方案,原理如下:
- 当插入引用链接时,自动给引用链接和被引用的块添加 custom-id 属性,这个属性以后都不会变。
- 当被引用的块 id 被改变后,通过引用链接的 custom-id 属性获取被引用的块,并修正引用链接的 id 为新块的 id。
- 当有多个块具有相同的 custom-id 属性时(比如复制导致),自动弹出选项对话框,让用户选择引用哪个块,用户选择后更新引用链接的 id 为用户选择块的 id。
- 在情况 3 时,如果你不小心选错了要引用的块,也不要紧,只需要在引用链接上 ctrl+ 点击,会再次弹出选项对话框,可以再次选择。
详情可参考 issue Issue #15236 · siyuan-note/siyuan
思源 v3.2.1 之前版本不能使用思源的右键粘贴,必须 ctrl+v 粘贴才行(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。
思源 v3.2.1 之前版本不支持手机版(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。
不知是否还有潜在问题,如果有大佬能发现敬请告知。十分感谢!
以上仅抛砖引玉,如果你有更好的方案,请不吝赐教!十分感谢!
如果你支持该方案,请前往投票 属性引用:彻底解决引用丢失问题,方案可行性探讨和投票 十分感谢!
关联帖子
演示
如何使用?
和之前一样,正常使用即可。
比如,右键菜单中复制为块引用,[[搜索,模板添加等。


常见问题
如何插入引用链接?
和之前一样,正常操作即可,比如,右键菜单中复制为块引用,[[搜索,模板添加等。
通过 custom-id 找到新块的 id 后,引用链接的文本会更新吗?
动态引用会更新,静态引用不会更新。
安装代码前的旧引用链接也能有效避免引用丢失问题吗?
不能,仅对新插入的引用链接有效。
如果我卸载了这个代码片段,对文档有影响吗?
没有,只是块属性中多了一个自定义属性而已。
卸载后,再次安装,对文档有影响吗?
没有影响,安装后带有自定义属性的链接,当访问时,可以自动恢复块引用(已删除的块除外)。那些在未安装期间未带有 custom-id 且失效的块无法恢复。
已删除的块,能恢复引用吗?
不能,如果已删除的块被恢复后可以。
custom-id 是如何生成的?会不会重复?
默认取出自被引用块的 id,仅第一次引用时添加,不会重复。
如果多个人链接引用同一个块,会怎样?
没有影响,这两个链接共用同一个 custom-id(即任何时候被引用块始终只有一个 custom-id,从第一次创建后就不再改变)。
有没有办法实现,未安装代码前的引用块也能支持 custom-id,从而避免引用块丢失问题
可以,只需要用下面的 SQL,筛选出所有未添加 custom-id 属性的被引用块和引用链接所在块,然后给块和引用链接分别加上 custom-id 属性即可。
筛选未添加 custom-id 的被引用块
SELECT *
FROM blocks
WHERE id IN (
SELECT def_block_id
FROM refs
WHERE block_id NOT IN (
SELECT id
FROM blocks
WHERE markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
)
);
筛选未添加 custom-id 的引用链接所在块
SELECT *
FROM blocks
WHERE (
(markdown LIKE '%((% ''%''))%'
OR markdown LIKE '%((% "%"))%')
)
AND id NOT IN (
SELECT id
FROM blocks
WHERE markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
);
能否查看文档中所有设置了 custom-id 的块和引用链接?
可以,可以通过书签 + 插件,然后用以下 SQL 汇总即可。
-- 带有custom-id属性的块和引用链接
SELECT *
FROM blocks
WHERE ial LIKE '%{:%custom-id="%"%}'
OR markdown LIKE '%((% ''%''))%{:%custom-id="%"%}%'
OR markdown LIKE '%((% "%"))%{:%custom-id="%"%}%'
ORDER BY created DESC
LIMIT 500;
支持手机版吗?
思源 v3.2.1 之前版本不支持(建议升级到 v3.2.1+ 使用)。原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。
为什么思源右键粘贴的块不起作用?
思源 v3.2.1 之前版本不能使用思源的右键粘贴,必须 ctrl+v 粘贴才行(建议升级到 v3.2.1+ 使用),原因见 Issue #15268 · siyuan-note/siyuan (v3.2.1+ 已修复)。
打赏作者

声明
免责声明: 本方案尚处于实验阶段,仅供学习和参考,请充分测试后谨慎使用,使用过程中造成的任何问题,作者不承担任何责任。
版权声明: 如需转载、翻译、演绎或二次开发请保留作者信息及原文链接。未经许可,不得用于商业用途。
最终解释权归作者所有。
代码
👇 打赏后可见(为什么要打赏后可见?主要想通过这种方式统计使用人数及用户需求,以帮助作者分析哪些功能是用户最需要的)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于