文章首先发表在 码蜂笔记 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文章下载增强插件源码 - CoreDownload** 在WordPress平台中,开发和使用插件是扩展网站功能的重要手段。CoreDownload是一款专为WordPress设计的高级下载增强插件,其核心目的是提供一种灵活且强大的解决...
例如,“Advanced Custom Fields”插件允许你添加自定义字段来存储文章顺序,然后在模板文件中根据这些字段进行排序。这种方法更为灵活,但需要一定的编程知识。 总的来说,对于大多数非技术用户来说,通过修改文章...
- 创建数据库:在开始安装前,你需要一个MySQL数据库来存储WordPress的内容。联系你的主机提供商获取数据库信息。 - 修改配置:将wp-config-sample.php重命名为wp-config.php,然后用文本编辑器打开,填写数据库名...
2. **架构**:WordPress基于LAMP(Linux, Apache, MySQL, PHP)架构,其中PHP负责处理服务器端的逻辑,MySQL用于存储和检索数据,Apache作为Web服务器运行这些组件。 3. **主题和插件**:WordPress拥有丰富的主题库...
如`$posts`存储了查询到的文章对象数组,`$post_count`表示当前查询到的文章数量,`$max_num_pages`是总页数,而`$current_post`则是当前循环中的文章在数组中的索引。此外,WP_Query还有许多方法来处理查询,如`...
3. wp-includes:存储核心函数库、类和模板。 4. wp-admin:后端管理界面的代码。 5. index.php:入口文件,引导整个WordPress框架。 四、建站流程 1. 安装与配置:下载WordPress 5.5.1,解压到服务器,配置wp-...
此外,正确配置Yoast SEO可以帮助改善网站的内部链接结构,提供XML站点地图以帮助搜索引擎更好地索引网站,以及提供内容分析工具,确保你的文章既对人类读者友好,也符合搜索引擎的偏好。 如果你遇到大部分界面仍然...
- `wordpress-seo-zh_CN.json`:JSON格式的翻译文件,存储了插件的文本字符串和对应的中文翻译。 - `wordpress-seo-zh_CN.mo`:机器可读的二进制文件,用于WordPress加载翻译。 - `wordpress-seo-zh_CN.po`:人类可...
- **免责声明**:尽管编写过程中已尽力确保信息的准确性,但由于技术和市场环境的不断变化,书中提供的信息可能不完全准确或最新。因此,对于因使用本书而导致的任何直接或间接损失,作者及出版社不承担任何责任。 ...
4. `wp/wp-content/`:这个文件夹存储了WordPress的主题、插件和上传的媒体文件。 5. `wp/ebak2/`:这个文件夹可能是网站数据的备份,通常包含数据库和其他重要文件的备份。 6. `wp/ebak2/bdata/`、`wp/ebak2/...
- **index.php**:作为WordPress的核心索引文件,它是网站的入口点,负责加载其他必要的组件和文件,确保网站的正常运行。 - **license.txt**:此文件包含了WordPress的GPL许可证信息,明确了软件的开源性质和使用...
在WordPress博客运营过程中,更换主域名可能因各种原因变得必要,比如品牌调整、域名到期或购买新域名。然而,单纯地更改域名设置并不足以确保博客的正常运行,因为WordPress内部和数据库中还可能存在大量与旧域名...
4. **MySQL**: 是一个关系型数据库管理系统,用于存储和管理网站数据。 5. **WordPress**: 是基于PHP和MySQL的开源博客平台,也可用于构建各种类型的网站。 **安装步骤**: 一、**Apache的安装**: 安装Apache是最...
wp_posts表存储了网站所有的文章和页面数据,其中可能包含了大量的垃圾或不需要的信息。可以通过以下SQL命令来删除这些空内容的帖子,以及类型为“revision”(修订版本)的记录: ```sql DELETE FROM `wp_posts` ...
VPM相关文章 VPM Related Posts是一个WordPress插件,用于简单,简洁的相关帖子。 传递一个ID并获得一组相关的帖子。 就这么简单。 您应该注意的一些注意事项/花絮: 相关帖子被暂时存储为48小时(默认)。 使用...
- **WordPress与MySQL**:WordPress存储所有内容(如文章、页面、用户信息)在MySQL数据库中。开发者需要了解如何通过PHP的MySQLi或PDO_MySQL进行数据库查询。 - **WP_Query**:这是WordPress用来获取和处理数据库...
- **字段(Fields)**: 每个字段都有一个特定的名称和类型,例如`title`、`content`、`post_date`,它们对应WordPress中的文章属性。 - **索引与存储**: 你可以指定字段是否被索引(用于搜索)和存储(用于展示结果...
自定义字段是一种功能,它允许站长为文章或页面添加各种属性,通常用于存储特定数据或元数据。这种灵活性让WordPress站点可以适用于各种复杂的场景。例如,通过自定义字段,站长可以为文章添加SEOMetaDescription,...
例如,使用合适的字段类型和长度,设置合适的索引以提高查询效率,同时确保数据的完整性,比如通过设置外键约束来保证用户ID、分类ID与文章ID之间的关联关系。此外,为了防止垃圾信息,可能还需要设计相应的过滤机制...