升级 wordpress

周末花了点时间来升级 wordpress , 具体做了如下更新.

之所以这样做的原因在于看不惯每次登陆 wordpress 时都标红来提示说有组件需要更新. 当做完这一些更新之后, 整个写作发布过程更加现代化了, 更像在 Github 中写 wiki 了. 比如

1
2
3
```cpp
printf("Hello world !");
```

将转换为

1
2
3
<pre><code class="cpp">
printf("Hello world !");
</code></pre>

并且被 highlight.js 按照 C++ 言语的语法正确渲染. 之所以能够这样写的原因在于 Jp Markdown 插件使用了 Markdwon Extra 语法, 首行 ``` 最末尾的单词会作为改 code 块的 class 属性. 幸运是 highlight.js 会把 code 块的 class 属性作为渲染的语言标记, 完整的语言和 class 属性的列表在 Language names and aliases . 相比 SyntaxHighlighter 需要在 html 中嵌入自定义的非标准的标签来说, 这种形式完全符合 html 的语法, 也完全符合 GFM 的形式.

1
[cpp]printf("Hello world !");[/cpp]

弃用 SyntaxHighlighter 的另外两个原因是渲染速度太慢以及大量使用 table 标签, 而不是 span 标签. 若读者希望更多了解 Wordpress 中的 Markdown 语法还请详细查阅 Markdwon Extra 的文档.

经历了这次大的更新之后, 对 Wordpress 的工作原理多了一些了解. 升级核心版本只需要替换 /wp-content/plugins/wp-content/themes 之外的文件, 保留 wp-config.php 的配置即可. 主题包并不会影响后台的使用, 后台的界面只和核心代码有关. 所有的插件和主题的配置都放到 wp-options 数据表中. 每个插件都有一个主文件, 通过主文件可以了解到插件的版本信息等, 并且插件的功能就是替换 Wordpress 中定义各种过滤器和操作动作. 新版本的 Wordpress 每次保存文章都会生成一条新的数据, 通过在 wp-config.php 中加入 define('WP_POST_REVISIONS', false); 可以将其关闭.

这次升级使用了一种本方法, 就是先将旧的文件使用 svn 删除, 然后再添加回新的文件. 此方法有一个很大的缺陷就是会导致更新期间 wordpress 不可用. 其实有一个很简单的解决的方案, SAE 为每个应用提供了多个版本, 升级时候只需要将新的版本更新到备用的版本去即可, 等更新完成之后在 SAE 的后台切换即可. 当然这个更新最好是两边都要更新, 以免一次更新跳跃太大而造成版本不兼容.


后来想了一想, 手工备份 SAE 中的 mysql 未免过于麻烦, 每次都要去点一下 DeferredJob 中的数据库导出确实非常麻烦. 顺便了解到可以通过 cron 定时任务并调用 SAE DeferredJob API 可以自动完成导出. 定时任务以 GET 方式调用一个 PHP 页面完成. 这个 PHP 最好支持 HTTP 基本认证, 这样可以防止被恶意扫描并大量执行备份. 详细的资料需要参考 SAE 的文档: cronSaeDeferredJob.

备份代码如下:

1
2
3
4
5
$date = date('Y-m-d_H:i:s');
$dj = new SaeDeferredJob();
$db = SAE_MYSQL_DB;
$task_id = $dj->addTask("export", "mysql", "DomainB",
                        "$db-$date.sql.zip", $db, "", "");