建站初期总有一些事情考虑不周,前几天调整了固定链接,从/category/id.html调整为/archive/id,然后总觉得哪里不踏实。趁着周末去考试的时间想了一下,如果固定链接依赖于文章ID或分类,那么一旦ID或分类发生变化,文章的固定链接就会失效。再者,从长远来说,将来如果要改版或重构网站,基于ID或分类的链接将变得不稳定。
由此,可以得出结论,固定链接最好不要依赖文章ID和分类,而是要依赖于文章的内容。这样的固定链接显得更稳定,而且具有更好的可读性,有利于SEO优化,分享链接时,链接本身也变得更有意义。
所以,决定把本站的固定链接改成基于postname的形式。修改固定链接后,要把之前的文章链接做一个跳转,但是由于文章有点多,手动修改很费时间,于是动手写了一段PHP代码,用于生成Nginx的跳转规则,代码如下:
<?php
// 数据库连接设置
$servername = "localhost"; // 数据库主机
$username = "your_username"; // 数据库用户名
$password = "your_password"; // 数据库密码
$dbname = "your_database"; // 数据库名
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询已发布的文章
$sql = "SELECT ID, post_title, post_name FROM wp_posts WHERE post_status='publish' AND post_type='post'";
$result = $conn->query($sql);
// 检查查询结果
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id = $row['ID'];
$post_name = $row['post_name'];
// 生成 Nginx 重定向规则
echo "rewrite ^/archives/$id$ /$post_name permanent;" . "<br>";
}
} else {
echo "没有找到已发布的文章。";
}
// 关闭连接
$conn->close();
?>
运行这段代码,就会在浏览器页面输出重定向规则,我们把它复制到nginx配置里就可以了。
location /archives/ {
rewrite ^/archives/3681$ /letting-go-of-tech-obsession permanent;
# 为了便于展示,这里只粘贴了一条规则...
}
后记:这种基于postname的permalink就是写文章的时候麻烦一点,写完后,还要再把标题翻译成英文,看个人取舍了。后面如果我忍受不了这多余的一步,也可能换成基于post_id的形式。使用postname还有一个好处理就是,如果要换成其它形式,WP可以自动实现跳转,而不用再另写跳转规则。