WordPress两种方法实现文章id连续性

  • A+
所属分类:WordPress
摘要

折腾了一下午,只为测试WordPress禁止修订和自动保存草稿的代码,经过进行研究,完美实现id连续。

细心的人可以发现,本站从第一篇文章直到现在,id号都是连续的,看着一点都不臃肿,你博客的id不连续是由多个原因呢造成的。

WordPress编辑文章时,会产生大量的修订版本和草稿,你会发现,没几篇文章,就几十,几百开外了,非常让人不舒服,这个功能虽然很方便,但都占据ID号,而且让数据库变的臃肿。精心编辑了这篇wordpress教程,教你实现文章id连续性。

第一步、修改数据库

即使新建的wordpress在发第一篇文章时,编号也是3,这是因为一篇文章和一个页面占用了两个ID,就算删除了页面,那么也是从3开始排。

登录phpmyadmin修改修改mysql数据库中的posts表,自带的页面占的ID2,不需要删除,guid改成http://duimin.com/?p=2。

wordpress修改数据库

将页面的格式post_type类型改成post,之后发布文章都是连号了。

wordpress修改数据库页面编号

第二步:修改代码

1、在主题里的functions.php里的<?php下边添加下边代码,禁止生成修订和草稿。

// 禁用自动保存,所以编辑长文章前请注意手动保存。

add_action( 'admin_print_scripts', create_function( '$a', "wp_deregister_script('autosave');" ) );

// 禁用修订版本

add_filter( 'wp_revisions_to_keep', 'specs_wp_revisions_to_keep', 10, 2 );

function specs_wp_revisions_to_keep( $num, $post ) {

return 0;

}

2、这段代码也是禁止修订和稿件,加上这段就是双保险了,避免主题升级、wordpress版本升级时,有可能导致之前添加的代码消失,在网站根目录配置文件wp-config.php中的define('WP_DEBUG', false);下边添加。

define( 'AUTOSAVE_INTERVAL', false );

define('WP_POST_REVISIONS', false);

3、调用之前占用的ID

禁用修订和稿件后,id的连续性变的紧密了,但并不是挨着的,这是因为保存草稿和更新,以及预览时还是会占用Iid,只是不保存了而已。所以在发布文章时,我们必须调用这些浪费的id,在主题里的functions.php里的<?php下边添加下边代码可以实现调用之前没用过的id。

// WordPress连续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' );

// WordPress连续ID,禁用草稿功能函数结束

// 使WordPress在原生编辑器(tiny)下发表文章时,不去除空格

add_filter('tiny_mce_before_init', 'preserve_nbsp_chars');

function preserve_nbsp_chars($initArray) {

$initArray['entities'] = '160,nbsp,'.$initArray['entities'];

return $initArray;

}

4、禁止添加多媒体、附件、页面、自定义菜单。

这一步,很多博主接受不了,然而添加的这些都会占用ID,所以在编辑文章时,图片等文件内容使用媒体的外链插入,如此一来有个缺点,媒体库中不会显示图片。自定义菜单直接在header.php里手动添加导航菜单。

不修改的代码,可以修改固定链接/%postname%.html

大家知道在发布文章时,会生成一个别名,如果你使用的/%postname%.html,这样样式的固定链接,那么就需要改动别名,网页后缀就以英文.html的样式展现,这种方式对英文关键词优化有利,就是设置麻烦,链接过长,不太美观。

可以实现把你已经发布的文章的ID号,套用为别名,再发布文章时发布那些没用被占用的ID作为别名。尽管如此,你会发现ID号的顺序被打乱了,从上到下6、3、1这样的样子,这就需要手动去修改发布文章时间,如此所有的ID完美实现了连续。

如果博客很多文章,可以修改文章的别名为连续的数字,如果你文章过多,手动设置太麻烦。如果你是新建博客,可以在主题functions.php里<?php下边添加如下代码。

/*新文章自动使用ID作为别名 */

add_action( 'save_post', 'using_id_as_slug', 10, 2 );

function using_id_as_slug($post_id, $post){

global $post_type;

if($post_type=='post'){

if (wp_is_post_revision($post_id))

return false;

remove_action('save_post', 'using_id_as_slug' );

wp_update_post(array('ID' => $post_id, 'post_name' => $post_id ));

add_action('save_post', 'using_id_as_slug' );

}

}

使用了这段代码,无论是你的固定链接使用的是/%post_id%.html,还是/%postname%.html,链接后缀都是数字+html的形式展现。

对于已经发布的文章,如果发的文章不多的话,更新一下,就会别名就会变成数字;文章多的话,可以在根目录文件wp-config.php的最底部添加如下代码。

//批量更改旧文章的别名为ID

$slug_done = array();

$posts = $wpdb->get_results( "

SELECT

`ID`,

`post_title`

FROM

`" . $wpdb->posts . "`

WHERE

`post_type` = 'post'

" );

foreach( $posts AS $single ) {

$this_slug = $single->ID;

$slug_done[] = $this_slug;

$wpdb->query( "

UPDATE

`" . $wpdb->posts . "`

SET

`post_name` = '" . $this_slug . "'

WHERE

`ID` = '" . $single->ID . "'

LIMIT 1

" );

}

添加后,访问下首页,然后再删除这段代码就行了,你再编辑文章查看别名,会发现所有的别名都变成数字了,数据库立刻小了很多。

我把这种两种方式都用上了,第一种就来排ID,第二种用来修改别名,精简数据库,依然使用/%post_id%.html的固定链接,给力吧。

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: