Typecho自动修正文章cid、分类标签mid不连续的方法
网上有些关于自动调整Typecho的cid、mid的php脚本,然而其中使用的mysql方法过于老旧且不支持php7,每次需要手动访问运行很麻烦。本文就上述的脚本进行了修改,使其支持php7且能够在发布文章后自动运行。
1、修改网站根目录下config.inc.php
最后定义数据库部分
/** 定义数据库参数 */
$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、在/admin
目录下新建change-cid.php
文件。因示例中关于页、归档页、分类页、标签页占据了1~4的cid(需要手动进入mysql修改表typecho_contents
中的cid
列),所以本脚本会从表typecho_contents
的第五行开始自动修改文章别名slug为cid-4
,请按照自己的需求在第19-20行进行修改
<?php
/**
* Typecho重新排列不连续的文章ID
* 作者:https://ghostinto.top/
*/
$blog = mysqli_connect($hostname_blog,$username_blog,$password_blog,$database_blog) or trigger_error(mysqli_error(),E_USER_ERROR);
$no = 1;
function change_cid($cid)
{
global $no;
global $blog;
// 修改post cid,并修改分类、标签、自定义字段、评论的对应关系
$sql = 'update typecho_contents set cid = ' . $no . ' where cid = ' . $cid;
mysqli_query($blog,$sql);
//按照自己的需求修改cid调整的起始序号
if ($no > "4") {
$sql = 'update typecho_contents set slug = ' . ($no - "4") . ' where cid = ' . $no;
mysqli_query($blog,$sql);
}
$sql = 'update typecho_relationships set cid = ' . $no . ' where cid = ' . $cid;
mysqli_query($blog,$sql);
$sql = 'update typecho_comments set cid = ' . $no . ' where cid = ' . $cid;
mysqli_query($blog,$sql);
$no = $no + 1;
}
$query_postRecord = "SELECT cid FROM typecho_contents ORDER BY cid ASC";
$all_postRecord = mysqli_query($blog,$query_postRecord);
$row_postRecord = mysqli_fetch_assoc($all_postRecord);
do {
change_cid( $row_postRecord['cid'] );
} while ($row_postRecord = mysqli_fetch_assoc($all_postRecord));
// 重新设置post id自增起点
mysqli_query($blog,'alter table typecho_contents AUTO_INCREMENT = '.$no);
//echo 'ok'; //测试时使用,正式使用时注释掉
mysqli_close($blog);
?>
3、在/admin
目录下新建change-mid.php
文件
<?php
/**
* Typecho重新排列分类和标签(meta)不连续的mid
* 作者:https://ghostinto.top/
*/
$blog = mysqli_connect($hostname_blog,$username_blog,$password_blog,$database_blog) or trigger_error(mysqli_error(),E_USER_ERROR);
$no = 1;
function change_mid($mid)
{
global $no;
global $blog;
// 修改meta id,并修改分类、标签、自定义字段、评论的对应关系
$sql = 'update typecho_metas set mid = ' . $no . ' where mid = ' . $mid;
mysqli_query($blog,$sql);
$sql = 'update typecho_relationships set mid = ' . $no . ' where mid = ' . $mid;
mysqli_query($blog,$sql);
$no = $no + 1;
}
//mysqli_select_db($database_blog, $blog);
$query_postRecord = "SELECT mid FROM typecho_metas ORDER BY mid ASC";
$all_postRecord = mysqli_query($blog,$query_postRecord);
$row_postRecord = mysqli_fetch_assoc($all_postRecord);
do {
change_mid( $row_postRecord['mid'] );
} while ($row_postRecord = mysqli_fetch_assoc($all_postRecord));
// 重新设置meta id自增起点
mysqli_query($blog,'alter table typecho_metas AUTO_INCREMENT = ' . $no);
//echo 'ok'; //测试时使用,正式使用时注释掉
mysqli_close($blog);
?>
4、修改/admin/manage-posts.php
文件,在原内容前加入如下内容。如果对于分类、标签修改管理较多,可以在/admin/manage-categories.php
和/admin/manage-tags.php
文件前加入相同内容。
<?php
//发布文章后会跳转manage-posts.php文章管理页面,加载该页面时自动进行cid、mid调整
require "../config.inc.php";
require "change-cid.php";
require "change-mid.php";
?>
很nice!但是不是 只有新安装的博客 可以一直这样按 顺序来旧博客太多文章 好像还是有断续的 可能独立页面 搞得吧~