1、背景描述
众所周知,wordpress上传图片或者文章自动保存时都会占用post_id,导致文章id的不连续。强迫症患者表示不能接受!
2、解决办法
网上给出的方法或多或少都要手动的去调整数据库。存在很大的隐患,玩意把数据库搞坏了那就得不偿失了。
wordpress伪静态中有%postname%的格式,此处的postname可以理解为文章的别名,修改该字段并不会影响到真正的文章id(post_id),可以通过程序自动替换postname的值来“高仿”文章id的连续。
postname的生成格式可以自己随便定义,本文只介绍id自增的形式。
id自增实现的办法也有很多,这里借助数据库来实现。由于mysql不像oracle支持sequence。因此需要通过mysql的存储过程实现。
2.1、连接数据库
mysql -uroot -p123456
2.2、创建序列表
create table `t_my_sequence` (
`seq_name` varchar(50) not null comment '序列名',
`current_val` bigint(20) not null comment '序列当前值',
`increment_val` bigint(20) not null default '1' comment '序列步长',
primary key (`seq_name`)
) engine=innodb default charset=utf8mb4;
2.3、插入自定义序列名称
insert into t_my_sequence values ('seq_doget_post', 0, 1);
2.4、创建mysql存储过程
--mysql遇到分号会认为命令结束
--因此需要执行该命令将命令结束符临时替换为#
delimiter #
--下个值
create function nextval(v_seq_name varchar(50)) returns bigint(20) deterministic
begin
update t_my_sequence set current_val = current_val + increment_val where seq_name = v_seq_name;
return currval(v_seq_name);
end;
#
--当前值
create function currval(v_seq_name varchar(50)) returns bigint(20) deterministic
begin
declare value bigint(20);
set value = 0;
select current_val into value from t_my_sequence where seq_name = v_seq_name;
return value;
end;
#
2.5、修改主题functions.php
//自定义永久链接
function append_custom_slug($data){
//文章类型的才自定义链接名,页面类型(page)的跳过
if ('post' == $data['post_type']) {
if (empty($data['post_name'])) {
$data['post_name'] = get_post_name_seq();
}
}
return $data;
}
//获取数据库里的id
function get_post_name_seq(){
global $wpdb;
$sql_sid = $wpdb->prepare("select nextval(%s)",'seq_doget_post');
$post_name_sid = $wpdb->get_var($sql_sid);
return $post_name_sid;
}
add_filter('wp_insert_post_data', 'append_custom_slug', 10);
//end
3、以下是数据库完整操作
root@DESKTOP-TQOMQK3:~# mysql -uroot -p1234
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wp |
+--------------------+
5 rows in set (0.00 sec)
mysql> use wp;
Database changed
mysql> create table `t_my_sequence` (
-> `seq_name` varchar(50) not null comment '序列名',
-> `current_val` bigint(20) not null comment '序列当前值',
-> `increment_val` bigint(20) not null default '1' comment '序列步长',
-> primary key (`seq_name`)
-> ) engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t_my_sequence values ('seq_doget_post', 0, 1);
Query OK, 1 row affected (0.00 sec)
mysql> delimiter #
mysql> create function nextval (v_seq_name varchar(50)) returns bigint(20) deterministic
-> begin
-> update t_my_sequence set current_val = current_val + increment_val where seq_name = v_seq_name;
-> return currval(v_seq_name);
-> end;
-> #
Query OK, 0 rows affected (0.00 sec)
mysql> create function currval(v_seq_name varchar(50)) returns bigint(20) deterministic
-> begin
-> declare value bigint(20);
-> set value = 0;
-> select current_val into value from t_my_sequence where seq_name = v_seq_name;
-> return value;
-> end;
-> #
Query OK, 0 rows affected (0.00 sec)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容