Typecho自动修正文章cid、分类标签mid不连续的方法

Posted on

网上有些关于自动调整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";
?>

添加新评论