再次对付WordPress文章ID

我严重怀疑这个ID是WordPress开发者故意弄的,这个这个这个必须是逼疯强迫症病人的大杀器啊。。。

曾几何时为了这个文章ID做了不知多少事:
关闭Revision
关闭Auto Draft
冒着丢失几千字的风险关闭自动保存
甚至不惜影响交叉链接和搜索引擎收录而完全重排文章,几乎相当于重新建站

然而最近三观又有改变,喜欢简约风格,把主题给换了不说,而且还不再用Live Writter写文章了而改用dashboard里的在线编辑器。用这个当然不敢再一直冒风险关着自动保存,所以又把保存给打开了。而这样可能过几天发现ID又会呼啦一下跳很多了。所以今天决定再次对付一下文章ID的问题。

我的主要强迫症除了ID连续外,还觉得清理过无用revision后那些释放出来的ID为什么不能重新利用起来。所以我打算实现一下“从不连续的地方开始插入文章”这个目标。显然这个patch需要写的很底层,应该在距离执行sql insert最近的地方。经过对代码的一些阅读,最后决定直接patch在wp-db.php上。

	function insert( $table, $data, $format = null ) {
		//PATCHED BY LXF: Reset Autoincrease
		if ($table == $this->posts) {
			$insId = $this->get_var("SELECT ID+1 FROM $this->posts a WHERE NOT EXISTS (SELECT ID FROM $this->posts WHERE ID = a.ID + 1) LIMIT 1");
			//$this->query("ALTER TABLE $this->posts AUTO_INCREMENT = $insId");
			$data['ID'] = $insId;
		}
		return $this->_insert_replace_helper( $table, $data, $format, 'INSERT' );
	}

开始写的是注释掉的那句ALTER,但是测试发现当前版本的MySQL不能将AUTO_INCREMENT改为小于表中已有数据最大ID的数字。我记得以前似乎是没有这个限制的,因为我曾经遇到过存在与AUTO_INCREMENT数字相等的记录导致insert永远失败的例子。

这样修改后凡是往wp_posts表里插入数据,均会取最小可插入的ID插入数据。读者可以发现这篇文章的ID已经变成了130多号而不是290号左右。先这么试用着,如果有兼容性问题再来改正。

参考文章:
WordPress 文章 ID 连续之终极方法

WordPress 3.4.2、3.5文章ID连续方法—禁用自动草稿、自动保存和文章修订

Leave a Reply

Your email address will not be published. Required fields are marked *