文章 ID 不连续是很多 「强迫症」 博主的烦恼,尤其是使用了文章 ID 作为固定连接之后,每篇文章的 ID 并不连续,非常不好。

从原因来看,文章 ID 不连续主要是因为自动保存的文章、媒体、页面和其它文章类型占用了 ID 导致的,网上的解决方法一般是强制的禁止自动草稿、不在媒体库上传媒体、不建立页面等等,但这种方法会导致使用上的不便利,而且很有局限性。

解决方案

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

批量设置

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

/**

    *WordPress 完美解决文章 ID 不连续的问题

    *批量设置别名,此代码使用完后不需要删除,之后还可能用到

    *https://www.weixiaoduo.com/post-id-continuous/

*/

functionBing_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($arras$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://example.com?post_id_continuous_query=yes

文章多的话网页加载会很慢,耐心等待加载完,加载好后,别名也就批量设置好了。

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

新文章自动设置

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

    *WordPress 完美解决文章 ID 不连续的问题

    *Update:

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

    *https://www.weixiaoduo.com/post-id-continuous/

*/

functionBing_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」 不连续了,可以使用上边的那个批量设置的代码重新归位。