常阳时光

删删删…

删删删……自上次删除日志,这几天又删了好几页,以后估计不会再删了。一不做二不休,顺手把固定链接也修改了,改成了 /%post_id% 形式,用 /%postname%.html 形式虽然更直观,但是一不留神就长得老长老长的……

接着把文章 ID 不连续的问题参照露兜的教程【WordPress完美解决文章ID不连续问题】折腾了一下,目测有效。

因为历史问题,归档页的读者乱七八糟的,看着长长的归档页,狠下心来打开数据库管理后台把 wp_comments 给清空了。不过这样只是把评论全部清空了,文章/页面虽然一条评论都没有了,但是评论总数还是清空之前的数据,有新评论后数据才会更新,这是因为 wp_posts 里面的 comment_count 数据没有清掉,运行一下下面的 SQL 语句就可以了。(操作数据库前记得先备份!!!)

UPDATE wp_posts SET comment_count = 0;

还请原谅我因为偷懒,直接把评论全部给清空了。

最后附上露兜解决文章 ID 不连续的方法,以备不时之需。

1、禁用文章修订版

wp-config.php 文件中添加代码:define('WP_POST_REVISIONS', false);

2、删除文章修订版

在 phpmyadmin 中执行以下 SQL 语句(会影响置顶文章,慎用!并做好备份)即可。

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision';

3、禁用自动保存

在当前主题的 functions.php 中添加以下代码:

// 禁用自动保存,编辑长文章前请注意手动保存。
add_action( 'admin_print_scripts', create_function( '$a', "wp_deregister_script('autosave');" ) );

4、重新排列不连续的文章 ID

可在当前主题的 functions.php 中加入以下 PHP 代码,这样如果你只是单纯发文章,不发页面,不添加菜单,不上传媒体的话,基本上此后的文章ID是连续的,而且不改变之前已经发布的文章ID。

// WordPress 4.2.3 目测有效
function keep_id_continuous(){
global $wpdb;

// 删掉自动草稿和修订版
$wpdb->query("DELETE FROM `$wpdb->posts` WHERE `post_status` = 'auto-draft' OR `post_type` = 'revision'");

// 自增值小于现有最大ID,MySQL会自动设置正确的自增值
$wpdb->query("ALTER TABLE `$wpdb->posts` AUTO_INCREMENT = 1");
}

add_filter( 'load-post-new.php', 'keep_id_continuous' );
add_filter( 'load-media-new.php', 'keep_id_continuous' );
add_filter( 'load-nav-menus.php', 'keep_id_continuous' );

5、让以前的文章 ID 重新排序

注意:如果你使用了置顶文章、菜单或者父子页面等功能,下面的方法失效。

把下面的代码保存为 ID_Update.php,根据实际修改数据库信息,然后将该 PHP 文件上传至博客根目录,运行一下(就是打开一下 //cyhour.com/ID_Update.php),看到 OK 就可以了。如果你的数据表前缀不是 wp_ ,请根据实际修改好再上传运行。

特别提醒:开始之前请先备份你的数据库。如果你使用了post id作为固定链接,那么将可能改变所有文章的网址,会影响搜索引擎收录;如果你用的插件建立了新的数据库表,如投票插件等,也将会出现问题;如果你的博客中创建了父子关系的页面,运行了以下脚本将会失去此关系。请慎用!

<?php
/**
* WordPress重新排列不连续的文章ID
* 作者 :Ludou
* Email:zhouzb889@gmail.com
* Blog :http://www.ludou.org/
* 相关文章:http://www.ludou.org/wordpress-post-id-continuous.html
* 最后修改:2010年10月01日
*/

$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($id)
{
global $no;

// 修改post id,并修改分类、标签、自定义字段、评论的对应关系
$sql = 'update wp_posts set ID = ' . $no . ' where ID = ' . $id;
mysql_query($sql);
$sql = 'update wp_term_relationships set object_id = ' . $no . ' where object_id = ' . $id;
mysql_query($sql);
$sql = 'update wp_postmeta set post_id = ' . $no . ' where post_id = ' . $id;
mysql_query($sql);
$sql = 'update wp_comments set comment_post_ID = ' . $no . ' where comment_post_ID = ' . $id;
mysql_query($sql);

$no = $no + 1;
}

mysql_select_db($database_blog, $blog);
$query_postRecord = "SELECT ID FROM wp_posts ORDER BY ID ASC";
$all_postRecord = mysql_query($query_postRecord);
$row_postRecord = mysql_fetch_assoc($all_postRecord);

do {
change_id( $row_postRecord['ID'] );
} while ($row_postRecord = mysql_fetch_assoc($all_postRecord));

// 重新设置post id自增起点
mysql_query('alter table wp_posts AUTO_INCREMENT = ' . $no);

echo 'ok';

?>

6、调整文章/页面 guid 和 postname

因为文章、页面链接变了,根据自己时间情况调整文章/页面的 guid 和文章的 postname。我是让文章/页面的 guid 和文章的 postname 与其 ID 一致,执行下面的 SQL 语句即可。

update wp_posts set guid = concat('http://cyhour.com/?p=',ID) where post_status = 'publish'and post_type = 'post';
update wp_posts set guid = concat('http://cyhour.com/?page_id=',ID) where post_status = 'publish'and post_type = 'page';
update wp_posts SET post_name = REPLACE( post_name, post_name, ID ) WHERE post_type = 'post';

----------后记:2015-08-10----------

可以用张戈大师障眼大法来实现 WordPress 文章 ID 看起来完美连续。

思路:固定链接设置为 /%postname% 的形式;然后写文章时,将文章别名设置为阿拉伯数字形式,并且和上下文保持连续即可

至于以前文章的链接,根据个人实际情况处理,如果不纠结旧文章 ID 是否连续和要考虑 SEO 的话,旧文章 ID 不作处理。如果纠结,可以用前面的方法先把旧文章 ID 处理为连续。然后运行下面的 SQL 语句,将旧文章 postname 更改为文章 ID 即可。

update wp_posts SET post_name = REPLACE( post_name, post_name, ID ) WHERE post_type = 'post';