其实直接操作数据库更简单,原理为:如果新建文章或上传图片就获取数据库中最后一条有用记录(post_type 为 publish、draft 或 private 的行或 post_type 为 inherit 且类型为 attachment 的行)的 ID,并把之后的无用行(post_type 为 auto-draft 的行和 post_type 为 inherit 且类型为 revision 的行)删除掉,再重设自增。这样无论如何新建文章,数据库中最多有且仅有一条 auto-draft 记录(WordPress 刚刚创建的行,保存之后 post_type 变为 publish、draft 或 private),这样文章 ID 就能连续了。 function keep_id_continuous(){ global $wpdb; $lastID = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' OR post_status = 'draft' OR post_status = 'private' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ORDER BY ID DESC LIMIT 1"); $wpdb->query("DELETE FROM $wpdb->posts WHERE ( post_status = 'auto-draft' OR ( post_status = 'inherit' AND post_type = 'revision' ) ) AND ID > $lastID"); $lastID++; $wpdb->query("ALTER TABLE $wpdb->posts AUTO_INCREMENT = $lastID"); } // 将函数钩在新建文章、上传媒体和自定义菜单之前。 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' ); // 禁用自动保存,所以编辑长文章前请注意手动保存。 add_action( 'admin_print_scripts', create_function( '$a', "wp_deregister_script('autosave');" ) ); // 禁用修订版本 remove_action( 'pre_post_update' , 'wp_save_post_revision' );只要将上面的代码插入到主题functions.php中就可以了,支持 WordPress 3.0~3.6 的任何版本,而且未来升级也不会影响功能,基本算是一劳永逸。以上的代码考虑了使用媒体库和自定义菜单的可能,如果需要文章 ID 完全连续,就不要使用 WordPress 内置的媒体库功能和自定义菜单功能。 此段代码已经过我的长时间测试,应该是没有问题的,但是由于代码涉及到DELETE这条极其危险的 MySQL 语句,所以我仍然建议你在使用这段代码之前先做个数据库备份,然后再测试。 参考:http://xiaoxia.de/keep-wordpress-post-id-continuous/ 转载请保留固定链接: https://linuxeye.com/jianzhan/1919.html |