解决wordpress文章id不连续问题

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
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

    暂无评论内容