解决方案

本文说的方法也是治标不治本,但却能比较好的解决链接上的 ID 不连续这个问题。这个方法就是利用别名,自动给文章设置一个别名,别名按顺序递增,然后把固定连接设置成别名。

批量设置

首先,如果你之前已经有文章了,需要根据顺序设置一下别名,从 1 开始递增。批量设置别名可以把下边的代码添加到 functions.php 里边:


/**
    *WordPress 完美解决文章 ID 不连续的问题
    *批量设置别名,此代码使用完后不需要删除,之后还可能用到
*/
function Bing_post_id_continuous_query(){
    set_time_limit( 0 );
    remove_action( 'publish_post', 'Bing_post_id_continuous' );
    query_posts( 'posts_per_page=-1' );
    $arr = array();
    while( have_posts() ){
        the_post();
        $post_id = $GLOBALS['post']->ID;
        $arr[] = $post_id;
    }
    wp_reset_query();    
    $arr = array_reverse( $arr );
    $i = 1;
    foreach( $arr as $post_id ){
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => $i++
        ) );
    }
}
if( $_GET['post_id_continuous_query'] == 'yes' && current_user_can( 'level_10' ) ) add_action( 'init', 'Bing_post_id_continuous_query' );

然后访问下边的地址,注意替换成你的域名(访问时需以管理员身份登录):
http://xxx.com?post_id_continuous_query=yes
文章多的话网页加载会很慢,耐心等待加载完,加载好后,别名也就批量设置好了。

注意:此代码用完之后不用删除,留着之后有可能还需要用。

新文章自动设置

老文章设置好了,接下来就要给新文章自动设置别名了,只需要把下边的代码添加到主题的 functions.php 即可:


/**
    *WordPress 完美解决文章 ID 不连续的问题
    *Update:
    *2014-07-31:让更新文章时不重新计算别名
*/
function Bing_post_id_continuous( $id, $post, $update ){
    if( $update || $post->post_status != 'publish' ) return;
    $action = 'save_post_post';
    $func = 'Bing_post_id_continuous';
    remove_action( $action, $func, 10 );
    wp_update_post( array(
        'ID' => $id,
        'post_name' => wp_count_posts()->publish + 1
    ));
    add_action( $action, $func, 10, 3 );
}
add_action( 'save_post_post', 'Bing_post_id_continuous', 10, 3 );

添加好后,每发布一篇文章,别名都会自动设置成当前发布文章的数量加 1.

2014-07-31 更新:让更新文章时不重新计算别名。

修改固定链接

添加完代码之后,需要在后台的 “设置” → “固定连接” 里设置一下固定连接,把 ID 改成别名,也就是把固定连接里的 post_id 改成 postname

错乱

如果因为删除、更新或者其它原因导致文章的 “ID” 不连续了,可以使用上边的那个批量设置的代码重新归位