由于没有使用过加密文章,所有之前从未注意过这方面,幸亏前几天一位朋友帮我测试主题,他有几篇加密文章,才发现一些关于加密文章的问题,但是想要解决这些问题,首先就是要判断文章是否是加密文章,查看了文档,也搜索了一圈,并没有发现有这方面答案,只好自己找了。

发现问题

先说说加密文章都有哪些问题吧,折腾了几天发现了几处,最主要是跟Pjax冲突,如果不用Pjax,问题不太大:

  • 加密文章无法Pjax进入,由于返回403状态码,所以无法使用Pjax进入文章链接
  • 加密文章与普通文章没有特殊标识来区分,比如给加密文章一个name或者id或者class
  • 加密文章的密码cookie有问题,所有加密文章统一使用一个cookie😰
  • 官方并没有给加密文章提供一个判断函数(目前我还没有找到)(已发现😉)

如何判断

后续更新:

最近翻了很多后台文件,发现Typecho是有直接判断加密文章的方法的

如下:(是不是清爽许多)

if ($this->hidden) {
    //是加密文章并且未解锁
} else {
    //不是加密文章或者已解锁
}

下面是老的判断方法:

代码摘自后台然后修改了一下,完整代码如下(这个是最初的方法,等于是上面新方法的详细说明,建议使用上面的新方法😏)

if (isset($this->password) && $this->password !== Typecho_Cookie::get('protectPassword') && $this->authorId !== $this->user->uid && !$this->user->pass('editor', true)) {
    //是加密文章并且未解锁
} else {
    //不是加密文章或者已解锁
}

//解释一下这几个因素:文章设置了密码 且 输入的密码不正确 且 用户不是作者 且 用户无编辑及以上权限

如果单纯的只判断是否加密文章,只用第一个因素isset($this->password)就行。

解决问题

有了最主要的判断,就可以解决问题了,说一下目前我的解决办法吧,不是最完美的,但是算是够用了

  • 无法Pjax进入,我是把密码输入这一步提前到打开链接前进行,拦截链接的跳转,强制用户先输入密码,密码是否正确用Ajax获取,正确则Pjax跳转页面。
  • 加密文章标识,这个容易了,判断是否加密文章后,标识自己手动随便添加。
  • 这个是Typecho程序机制问题,在我这暂时无解(本人技术有限🤣),这个确实很不严谨,希望官方能够解决。
  • 如何判断,上面已经说过

打完收功。

其实这些问题只要是带Pjax功能的主题,都会存在,我试了几个Typecho比较有名的主题,也确实都存在,我这个办法个人感觉有点笨,希望大家能够找到更好的解决办法😊