Typecho文章cid不连续的解决方法

0、说明

Typecho的文章cid经常会不连续,看数据库应该是独立页面、附件占用了一部分cid。因此,需要修改数据库或Typecho的源码来解决这个问题。

1、PHP7以下解决方法

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$hostname_blog = "localhost";
$database_blog = "数据库名";
$username_blog = "数据库用户名";
$password_blog = "数据库密码";
$blog = mysql_pconnect($hostname_blog, 
$username_blog, $password_blog) or trigger_error(mysql_error(),E_USER_ERROR);  
$no = 1;    
function change_id($cid)
{
global $no;     
// 修改post cid,并修改分类、标签、自定义字段、评论的对应关系
$sql = 'update typecho_contents set cid = ' . $no . ' where cid = ' . $cid;
mysql_query($sql);
$sql = 'update typecho_relationships set cid = ' . $no . ' where cid = ' . $cid;
mysql_query($sql);
$sql = 'update typecho_comments set cid = ' . $no . ' where cid = ' . $cid;
mysql_query($sql);    
$no = $no + 1;
}    
mysql_select_db($database_blog, $blog);
$query_postRecord = "SELECT cid FROM typecho_contents ORDER BY cid ASC";
$all_postRecord = mysql_query($query_postRecord);
$row_postRecord = mysql_fetch_assoc($all_postRecord);    
do {
change_id( $row_postRecord['cid'] );    
} while ($row_postRecord = mysql_fetch_assoc($all_postRecord));    
// 重新设置post id自增起点
mysql_query('alter table typecho_contents AUTO_INCREMENT = ' . $no);
    echo 'ok';
?>

将此php文件上传至Typecho博客根目录,运行一遍即可。

提示:此方法会导致附件不匹配,请酌情使用。

2、PHP7解决方法

2.1、修改配置文件

修改网站根目录下

config.inc.php

约第61至71行为

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/** 定义数据库参数 */
$hostname_blog = "数据库连接地址";
$database_blog = "数据库名";
$username_blog = "数据库用户名";
$password_blog = "数据库密码";

$db = new Typecho_Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
  'host' => $hostname_blog,
  'user' => $username_blog,
  'password' => $password_blog,
  'charset' => 'utf8',
  'port' => '3306',
  'database' => $database_blog,
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

2.2、增加排序程序

新建

/admin/change-cid.php
/admin/change-mid.php

分别填入:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。


此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

2.3、修改文件

/admin/manage-posts.php
/admin/manage-categories.php
/admin/manage-tags.php

原内容前加入

PHP
1
2
3
4
5
<?php
require "../config.inc.php";
require "change-cid.php";
require "change-mid.php";
?>

3、不修改数据库解决方法

本方法可以不用修改数据库,虚拟主机可以使用。

自定义文章路径,设置自定义文章路径为 wordpress 格式。

修改文章路径

修改

/var/Widget/Contents/Post/Edit.php

中,的execute()函数为:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    /**
     * 执行函数
     *
     * @throws Exception|DbException
     */
    public function execute()
    {
        /** 必须为贡献者以上权限 */
        $this->user->pass('contributor');

        /** 获取文章内容 */
        if (!empty($this->request->cid)) {
             // .......
        }
        else {    //  <--------------- 新增 else 分支
            /* 获取文章下一个(连续)自增的slug */
            $this->slug = $this->getNextPostSlug();
            $select = $this->db->select('MAX(slug + 0) AS slug_max')
                ->from('table.contents')
                ->where('table.contents.type = \'post\'');
            //echo $select->__toString();
            $res = $this->db->fetchRow($select);
            $slug_max = $res['slug_max'];
            $this->slug = $slug_max ? (string)(intval($slug_max) + 1) : '1';
        }
    }

即可实现CID严格按照每次+1自增,新文章自动填写。

自动填充

4、参考文章

Typecho自动修正文章cid、分类标签mid不连续的方法
https://ghostinto.top/archives/22.html

5、注意事项

运行前记得备份数据库!

Typecho文章cid不连续的解决方法

https://blog.tsinbei.com/archives/58/

文章作者
Hsukqi Lee
发布于

2022-01-18

修改于

2022-08-29

许可协议

CC BY-NC-ND 4.0

# Typecho  SQL

评论

昵称
邮箱
网址
2 条

Yakito

Yakito

看看

  回复

moebest

看看

  回复