本站主题加入全站pjax,进入加密文章多少存在点bug,于是找到这个插件,很好用。
插件原作者:
GitHub 项目地址:
原版插件本站镜像下载:
当前版本支持自定义加密块的样式,以及配置加密块上的提示文本。详细内容请参考 原作者插件中README.md
,在此不再赘述。
插件功能
Typecho 文章部分加密插件(PartiallyPassword)支持对某一篇文章的特定部分创建密码,访客需要正确输入密码才能查看内容。
原生 Typecho 文章加密功能仅支持加密整篇文章,设置密码后该篇文章包括标题全部对未正确输入密码的访客不可见,这在有时并不能满足我们更加细致的要求。很可能一篇文章中有部分文字我们仅希望『获得许可的个人或群体』查看,而另一部分则希望『所有人』都可见;又或者,我们需要对这个加密内容添加一个注释信息或说明文本,而不想完全隐藏这段思想。这时,使用 PartiallyPassword 即可轻松解决问题。
来个栗子?本站对插件式样进行调整,你也可以根据说明进行修改😜
开发笔记
最初的版本(v1.0.0)是挂钩了 Widget_Abstract_Contents
中的 contentEx
,算是妥协的方案。这个钩子在内容被解析后触发,也就是如果有什么旁路直接拿 text
,我是拦不掉的,加密的内容会吐出来,不严谨,心里一直很不舒服,也在寻求解决方案。这一版本的默认样式也极难看,是本着能用就行的策略随意设置的,对密码输入的处理也极不协调,是在前端写入 Cookie 并刷新页面。唯一的优点是可以 PJAX 无刷新加载。
之后很快更新了 v1.1.1 版本,新增挂钩了 Widget_Abstract_Contents
中的 excerpt
,在摘要中做一些处理。同时优化了默认样式,仔细想想极简风格不仅好写而且好看。
然后 v1.x 时代就结束了,v2.0.0 版本全面优化了整个流程,包括加密块的处理和密码提交的逻辑,前者交给了 Widget_Abstract_Contents
的 filter
钩子,后者在 Widget_Abstract_Contents
中的 singleHandle
中进行,前端把密码 POST 上来,在后端走验证。filter
钩子是大杀器,text
在从数据库中取出来后立即经过 filter
处理,在这里搞定替换可以几乎完全避免加密内容意外泄露,唯一的不确定性只有当第三方插件也挂钩 filter
时,这个处理顺序问题……猜测是根据插件启用的先后顺序确定的,没有进行验证。自这个版本起,默认样式放弃了对 PJAX 的直接支持,换来的是更好的可移植性(在 Typecho 默认主题上可以直接使用),但是你仍然可以开动脑筋根据自己的主题情况自定义代码,实现 PJAX。
寒夜方舟向我提了 issue,称在后台编辑时,加密块保存后自动消失,吓得我心肺停止慌忙 fix。这时注意到后台取 text
也要走 filter
,我直接给换掉了那么后台也看不见,保存后还能喜提数据丢失……遂 fix 该重大 bug,发布 v2.0.1 版本。通过 __TYPECHO_ADMIN__
常量判断了一下前后端,照着 Typecho 的样子做了一点权限控制。
关于之后的开发工作,大方向是搞一个不同密码对应不同内容的新玩法,目前开发工作已全面暂停(咕)
你好, 启用加密插件后, 后台点开撰写新文章页面会出现一下错误
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'PartiallyPassword_Plugin' does not have a method 'pluginFields' in /www/wwwroot/Localhost/var/Typecho/Plugin.php on line 489
加密语法无效。
但是创建页面正常,是什么问题呢?
兄弟,解决了吗?
这个问题可以去原作者这里反馈一下。我估计是其他插件也使用了 Widget_Abstract_Contents 的 filter 导致冲突。
原作者:https://ucw.moe/archives/typecho-partially-password.html
好的,谢谢。我没装其他插件,就是这款主题里面的2个插件。
我知道什么问题了。如果你用的是我这款主题,那么就要用我主题中的加密插件,因为主题中这个插件我修改过,不用再单独下载这篇文章中的原版加密插件了。
恩,没有下这里的插件,用的的就是主题里面的插件。
大佬,你的pjax如何实现的?
给form添加一个class,比如class="ppblock",然后在pjax的js中加入这个class,让这个表单加入pjax加载。具体用法,你可以下载我的主题,在footer.php中查找“form[class=ppblock]”
非常感谢,我试试