让 WordPress 兼容 SAE 附件上传的插件:ChloroAttachment

试过才知道原来 WordPress for SAE 升级起来那么方便. 我本来使用的是很久以前应用仓库里的 3.2.1, 最近突然发现应用仓库里的升级到 3.4.1 了,但那已经是去年六月的事了,如今都 3.5.1 了,于是就自己升级了.

我先注册了一个新应用做测试,我把 SAE 移植版的 3.4.1 装好以后直接把 3.5.1 覆盖上,然后就… 成功了…… 但是很快我就发现附件上传不能使用. 也就是说其实原版 WordPress 只要配置好数据库就是能直接在 SAE 上跑的?果然是牛X的项目.

好,切入正题. 由于发现不能上传附件,我就开始找手动修复(或者说重新移植)的方法,我觉得大不了再把尘封已久的 ChloroWrapper 请出来呗.. 移植方法 其实很简单,相比于以前移植 thbr、smf 来说工作量根本不是一个数量级的. 但是这个方法其实也并非一劳永逸,由于修改了内核文件,再次升级之后依然会造成附件失效.

不修改内核而兼容 SAE 的方法那只有开发插件了. 以前从未接触过 WordPress 插件的开发,而从开始开发到现在还不到 12 小时,beta 版已经发布了,可喜可贺.

我以前一直以为替换原功能的插件是通过重载函数,但实际上不是这样. 我这次开发主要参考了 荒野无灯Hacklog Remote Attachment ,荒野无灯替换原生附件上传的方法是在附件上传完成后将本地的附件传至远程,然后在保存附件信息前通过 Filter 修改路径. 这就是 WordPress API 的一大特点—— Filter. Filter 顾名思义,就像是自来水管中间的过滤器,有了这个过滤器就可以控制水流出水管以后的状态了. 而实际上 PHP 比自来水净化器更厉害,Filter 还可以作为“触发器”来使用,就像荒野无灯的那个插件,上传附件成功以后就触发了发送到远程的功能,被过滤后流出的信息是最终用户可以访问到的新附件 URL.

稍微叙述一下 ChloroAttachment 大致的运作原理. 由于 SAE 提供的 Wrappers 不能正常使用 file_exists 等函数,因此解决方法为上传附件的时候将上传路径改到 TmpFS,上传完毕后转移至 Storage. 缩略图生成很讨厌,需要用到的函数必须保证原图像仍在 TmpFS 里才能正常运作,导致最终缩略图和主附件在数据库里的本地路径有点差别,让我做删除功能的时候费了不少功夫,不过不影响使用. 删除如果不考虑缩略图带来的影响就比较简单了,一个 Filter 就搞定了.

ChloroAttachment 已经能够正常使用,通过 svn 上传后作为插件启动即可,附件上传的操作与原来相同. 目前支持的功能有:附件上传、缩略图生成、附件删除;已知的问题有:同名文件不会重命名而是覆盖. 如果哪位仁兄知道如何通过插件的方式解决同名文件问题,或者发现有我尚未考虑到并且仍未兼容功能的请联系我.

晒一张 WordPress for SAE 3.5.1 的截图

WP351
ChloroAttachment for WordPress beta1 下载:
https://martin1994.sinaapp.com/uploads/2013/02/sae-attachment_beta1.zip

2013.02.24更新:

beta2发布,已支持重命名同名附件

ChloroAttachment for WordPress beta2 下载:
https://martin1994.sinaapp.com/uploads/2013/02/sae-attachment_beta2.zip

下载全部迁移至:http://martincl2.me/archives/453

发表评论?

9 条评论。

  1. WordPress for SAE 补丁发布 | Chloride Factory - pingback on 2013 年 3 月 7 日 在 下午 6:58
  2. 来试试上传文件看行不行 | 李俊杰的博客 - pingback on 2013 年 7 月 1 日 在 上午 12:00
  3. 恩,试试看!多谢啦!

  4. Dor博文 | WordPress for SAE 补丁发布 附安装教程(转) - pingback on 2014 年 9 月 11 日 在 下午 3:59
  5. :razz: 整理收藏夹的时候发现这个13年的链接还活着,网站也还在SAE上没变 :lol:

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">