文章首先发表在 码蜂笔记 http://coderbee.net/index.php/db/20140113/712
最近想给本站加上文章索引的页面,就是在一个页面上展示所有的分类及该分类的文章,然后置顶到首页,效果见本站文章索引。开始的思路是:先新建一个页面,然后设置好置顶等,用存储过程更新该页面的内容,用触发器在有新文章发表或文章标题有更新时触发执行存储过程。看起来应该挺顺利的,不过实现过程倒没想象那么好了。
更新索引存储过程
这个存储过程的功能是从数据库里查询出所有的分类以及该分类下的文章的ID和标题,然后用游标生成html内容(wordpress直接存储页面的html内容),再更新为索引页面的内容。
SET NAMES utf8;
use blog;
delimiter //
drop procedure if exists sp_updateIndex;
create procedure sp_updateIndex ()
begin
declare categroies varchar(21845);
declare details varchar(21845);
declare done int default 0;
declare lastCatgName varchar(100);
declare catgName varchar(200);
declare postId bigint(20);
declare postTitle varchar(200);
declare cur cursor for
select cast(convert(terms.name using utf8) as char), post.id, cast(convert(post.post_title using utf8) as char)
from wp_term_taxonomy tax
join wp_terms terms on tax.term_id = terms.term_id
join wp_term_relationships rel on tax.term_taxonomy_id = rel.term_taxonomy_id
join wp_posts post on rel.object_id = post.id
where tax.taxonomy = 'category' and post.post_status = 'publish' order by tax.term_id desc;
declare continue handler for not found set done = 1;
set lastCatgName = '';
set categroies = '<h3>index</h3><ul>';
set details = '';
open cur;
repeat fetch cur into catgName, postId, postTitle;
if not done then
if strcmp(lastCatgName, catgName) != 0 then
set categroies = concat(categroies, '<li><a href="#', catgName, '">', catgName, '</a></li>');
if strcmp(lastCatgName, '') = 0 then
set details = concat(details, '<br><hr><a name="', catgName, '"></a><h3>', catgName, '</h3><ul>');
else
set details = concat(details, '</ul><br><hr><a name="', catgName, '"></a><h3>', catgName, '</h3><ul>');
end if;
set lastCatgName = catgName;
end if;
set details = concat(details, '<li><a target="_blank" href="http://coderbee.net/?p=', postId, '">', postTitle, '</a></li>');
end if;
until done end repeat ;
close cur;
set categroies = concat(categroies, '</ul>');
set details = concat(details, '</ul>');
update wp_posts set post_content = concat(categroies, '<!--more-->', details) where id = 697;
end;
//
实现是不怎么复杂的。
乱码坑
碰到的第一个坑是乱码,由于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;
个人博客的发表频率是很低的,把频率设置为每天一次已完全足够。
相关推荐
支持文章自动生成缩略图,可以给文章设置默认缩略图。支持在文章内容页显示缩略图。 如果文章有缩略图,则会显示文章原缩略图。只有文章没有缩略图,才会显示插件自动获取的缩略图。 如果文章内容没有图片,可以...
自己在用的wordpress微信机器人插件,可同步wordpress文章内容,亲测可用!后台上传后按照说明设置。
如果我们的网站发展到文章数量达到成千上万之后,很难记得以前是否发布过相同标题的文章,而 WordPress 默认相同标题的文章也是可以正常发布的,这样的话会对 SEO 优化非常不利,所以今天仙踪小栈就向大家推荐一款...
水淼·WordPress站群文章更新器v1.3.6.0破解版
WordPress文章发布工具--V1.0个人版,由宏拓软件工作室以WordPress 4.0版本为基础开发,其他版本请自己测试! WordPress文章发布工具--V1.0个人版为终身免费版,宏拓软件工作室不会以任何理由,要求用户付费! 如果...
NULL 博文链接:https://justcoding.iteye.com/blog/606221
已验证,真实可用的wordpress插件. 对网站的SEO有很强帮助
WordPress导航主题源码添加搜索自动索引百度热搜关键词插图1 文章内容元素样式调整 经典编辑器添加对应样式预览 网址块添加nofollow属性开关(基础设置) 添加全站图片灯箱 增加go跳转白名单(基础设置) 修复投稿成功后...
auto-wordpress博客文章自动采集插件
本插件不会修改原文章表中的内容,插件会创建一张表用来存储与文章对应的标题数据,在页面显示文章标题时,通过过滤器修改标题内容。 如果使用双标题后效果不是很好,只需要删除插件或停用插件,就可以恢复到未使用...
wordpress文章加分插件
WordPress采集插件,WordPress自动采集发布插件WP-AutoPost-pro,可采集任何网站内容并自动发布到WordPress站点,使用最简单,功能最强大的WordPress采集插件 WordPress自动采集发布插件WP-AutoPost-pro专业版3.6.3下载...
WordPress文章后面加入指定内容插件
这款WordPress 响应式大型门户博客文章资讯主题源码,做为文章资讯类门户网站很不错! 详情:http://ban.maonius.cn/wps/167.html
gggggghhhhhh开了空调群马路永久居留旅进旅退我某图考虑考虑咯摸摸可口可乐了可口可乐了看看监控墨迹
WordPress很多插件可以实现相关文章的功能,插件的优点是配置简单,但是可能会对网站的速度造成一些小的影响,所以很多人还是比较喜欢用代码实现需要的功能,但是话又说回来了,代码实现也有缺点,就是配置复杂,不...
自己在用的wordpress插件,可同步wordpress文章内容,亲测可用!后台上传后按照说明设置。
WordPress实现本地文章批量上传,上传为,txt,html,等格式的文章类型,经过测试5.3版本完全能够使用,并且上传速度很快,适合新站批量上传文章
设置 -> Post Encryption And Decryption 进行文章的加密和解密 完成 说明: 加密更新成功后,在WordPress后台 – 文章,可以看到对应文章标题后面添加了“密码保护”字样. Plugin name: Post Encryption And ...
WP-Poster是一款免费的WordPress文章分享海报插件,即使是小白也能够轻松使用,如果你想为网站添加一个文章分享海报功能,直接下载插件使用即可。Canvas绘图,非php后端生成,节省服务器资源,安卓系统中个别机型在...