wordpress 文章索引 存储过程
?
实现是不怎么复杂的。
乱码坑碰到的第一个坑是乱码,由于MySQL采用源码安装,且安装时没有指定默认编码,所以MySQL使用的默认是 latin1
字符集,好在wordpress在创建表时把表的编码指定为 utf8
,不然处理要更多点,关于编码的解决可以看 MySQL 乱码 与 字符集。
存储过程测试ok后,自然就是用触发器来调用了,触发器也很简单:
SET NAMES utf8;use blog;delimiter //drop trigger if exists trigger_updateIndex;create trigger trigger_updateIndex after insert on wp_posts for each row begin if new.post_status = 'publish' then call sp_updateIndex; end if;end//
触发器的创建没有问题,但是却出现 ERROR 1442 (HY000): Can't update table 'wp_posts' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
异常。
之所以变成坑是因为我一开始直接在页面上进行测试,所以出错了也看不到,只是发现没效果就觉得出问题了。后来在命令行下直接插入才看到错误信息的。
google一番后,知道这是MySQL的一个限制,不能在触发器里对本表进行更新操作,本表就是触发器创建时用 on
指定的表。网上有一些人的解决方法不适用于我这里,因为需求不同,他们的场景是如果新的记录满足一定的条件就更新新的记录,这样可以用 set
语句结合 before
搞定,而我这里是要更新与新记录不同的某一条记录。所以用触发器是行不通了。
解决的一个方法就是在程序里解决,调用插入成功后在执行这个存储过程,不过对wordpress和php都不了解,就不想这样搞了。
现在用 cron 调度 加脚本的方式来搞,脚本的内容: /absolute/path/to/mysql -u username --password='password' < /absolute/path/to/trigger.sql
。
trigger.sql:
use blog;set names utf8;call sp_updateIndex;
个人博客的发表频率是很低的,把频率设置为每天一次已完全足够。