Wordpress细节之post id意义上的偏差
Poshi
Wordpress
Wordpress中post的id,实际上开发者对post id的理解,跟我们用户需求的,是不一样的。我想象中的post id,就是你已经公开发表的文章的一个排列,你可以清楚知道,你发表的文章
这是第一篇了,你一共发表了多少篇文章。
可是在Wordpress中并不是这样的,而是每一个未发表的草稿也占用一个id了,这么说,有时候我们的草稿最后并不一定都会发表,那么,当我们删除其中的一些没用的草稿,人们看到的post id,实际上就对不上了,我们不能直观地从post id知道我们一共写了(发表的)多少篇文章。
或者,我有一篇草稿,在两个月以前写出来的,id是101,在两个月以后我发表的post已经达到500篇了,那么假设最新的一篇id为500吧,两个月以前我写的那篇草稿我这时终于把他完成,而人们在id为500的文章之后,又突然看到一篇id为101的文章,还是挺错乱了。
上面所说的情况,就是永久链接默认形式(?p=1这种),或者其他带有%post_id&的形式,就像我的博客是http://poshi.org/post/500,人们有时候就会注意到了,而我觉得就算对于永久链接里没有%post_id%的人,这也同样是有问题的,在数据库里一样是要有对应的post id,你同样不知道自己有多少文章发表。
这不是很重要,但确实是一个问题,如果Wordpress在这方面重新考虑一下,已经发表的,和未发表的id,是否可以区分开来,如果能这样就最好,请还我们一个真正意义上的post id,那些草稿就不要计算在内了…
说起来,Wordpress其实有很多细节,不知道为什么,人家正常应该是可以做好的 ,他却没办法解决,或者出现一些比较尴尬的情形,我希望Wordpress的开发者们 ,就不要想着把Wordpress越做功能越强大了,先把一些细节的问题给解决一下吧!

2008年09月1日 at 11:20 am
post_id,本意是wp_posts表里表示文章编号的字段。后来,这个表里也开始保存WordPress新增的其他的内容,比如page、附件、草稿。post_id的值是在新增一篇文章或页面或附件的时候,由MySQL自动给分配的一个值,MySQL确保这个值是表中唯一的。
所以,用post_id的值表示当前文章是第几篇文章,一般都是不准的,因为一个Blog总会有几个page。
从设计角度来讲,一般的博客和论坛程序,都是把ID这个字段设置成自增字段,由数据库负责在新增记录的时候给这个字段赋值,并确保该值唯一。即使这条记录被删除了,其中的ID值也不会被再次使用。这是最简单的设计方法,也是最保险的设计方法,因为网页的访问是并发的,所以程序在第一条语句执行的这一秒钟检测到这个值可用,但是很难保证在第二条语句开始写入记录的时候这个值依然可用。所以,只有数据库软件自身才有能力确保每条记录赋的值都是这个表里的唯一值,因为数据库在写入一条记录的时候可以锁定当前数据表,禁止其他进程写入。
假如你想知道现在博客里有多少篇已发布的文章,直接在后台就可以看到。假如你想在每篇文章的网页里显示这是本博客的第几篇文章,那么,取一下当前文章的发布日期,然后到数据库里查询所有文章中发布日期小于等于这个日期的文章数,就是你要的数字了。
WordPress 2.0和2.1的时代里,曾经看到很多人不满意文章删除后,ID号不能被回收用于新的文章,所以曾想写一个可以给所有文章按照发布日期的顺序重新排列ID号的插件。但是后来,我发现这件事太复杂,因为文章ID号被用在很多表里,比如每条评论的记录都有一个post_id字段记录这条评论属于哪篇文章。再加上有些插件在数据库里新增的数据表也会包含post_id字段,比如tag插件,所以要改动文章ID号是件很困难的事。
所以,自从我用WordPress写Blog以来,从没点过删除文章的按钮。如果有哪篇文章不想要了,记录下地址,下次写新文章的时候直接修改这篇要删除的文章就可以了。
[回复(Reply)]
2008年08月24日 at 8:24 am
这个id是post表里的对应id。由于已发表和未发表的都在这个表里,所以估计你想要的那个他不会给你,呵呵。
况且那个id也就是区分不同日志的静态地址只用而已,何必太在意。
[回复(Reply)]
2008年08月20日 at 9:41 am
Test…
[回复(Reply)]
2008年08月19日 at 12:56 pm
纯个人意见:
你这个需求不合理。知道文章是第几篇,貌似没有任何意义。就好像你知道自己是第几个来到地球上的生命,对你也没有任何意义。真正有意义的是,知道你是谁,对吧?那么id对于文章来说,除了其唯一性能方便程序处理以外,也没有包含其他意义的需要。就好像你有个身份证号码一样。
[回复(Reply)]
Poshi 回复:
08月 19th, 2008 at 4:03 pm
问题是,有时候连图片他也会占用id,你这个说法,基本上就没什么意义了,虽然说可以知道是第几篇文章也不是很重要,但其准确性是重要的,至少,其他程序,比如说论坛的程序,不会随便就给你加几个id~~~
[回复(Reply)]
2008年08月16日 at 11:19 pm
保存很多草稿确实很麻烦,不过在哪儿看到有个什么解决方法来着
[回复(Reply)]
2008年08月16日 at 7:09 pm
嗯,我现在都是用slug了,不用id呵呵
[回复(Reply)]
2008年08月16日 at 5:07 pm
这个没什么吧,id不连续貌似没什么影响,谁会去注意这个呢
[回复(Reply)]
2008年08月16日 at 4:35 pm
你用后台编辑或者发布文章的时候,随便上传一个图片,系统好自动分一个ID给这个图片的,从一开始就这样,这个不算BUG了,改也改不掉了,建议楼主更换永久链接
不只是上传图片,你保存一个草稿,删除一个草稿都占用一个ID的
我以前测试过的,到现在的2.6.1也是这样
[回复(Reply)]
2008年08月16日 at 4:34 pm
不要用id作为文章url不就行了么…
[回复(Reply)]
2008年08月16日 at 3:48 pm
楼上几位解释已经很好了
我就不多说了,呵呵……
[回复(Reply)]
2008年08月16日 at 2:08 pm
不对不对…post_id就是id!!它不会代表你的文章数的
如果你删过文章..例如删了post_id为2的文章…那么下篇文章是从post_id为3开始的…
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 3:04 pm
这个当然知道啦,你没看清楚我这篇文章的主旨,这里讲的就跟你想的是一样的~~~~
post id,就算你写了草稿,也会占用一个id的,在你发表之前删了,一样占用着~~~
[回复(Reply)]
2008年08月16日 at 11:55 am
为啥不用 slug 呢,第一篇文章 slug 写为1,第二篇写为2,伪装地给 post_id一样,不就看起来舒服啦,哈哈~~~
ps. post_id 的确不是设计用来让你计算文章数目的
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 12:21 pm
呵呵,现在我想到有另一个办法可以得到真正的发表文章篇数了,这几天试验一下,再写出来
[回复(Reply)]
noiry 回复:
08月 16th, 2008 at 6:36 pm
厄。大家都很专业的样子。。这个id问题在其他好多地方也有,比如很火的那个nextgen-gallery插件。期待你的办法。。。
[回复(Reply)]
任平生 回复:
08月 16th, 2008 at 7:58 pm
文章数目在wp后台直接就有啊,这个还用真的去数。。。
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 8:32 pm
对呀,你没听懂我的意思,我就是说,既然有这个参数的话,像时间的参数我们可以用到slug中去,这个文章篇数的参数,是不是也可以调用呢?
[回复(Reply)]
2008年08月16日 at 10:40 am
这个功能的确很垃圾,但如果要求不高的话可以完全不用理会
[回复(Reply)]
2008年08月16日 at 10:08 am
不对,不对。
post_id就是id,id字段不会像你想象的那样设计的。
当然,你可以提用户需求,而且你的需求也是有道理的(希望获得公开发表的文章的序列数据),但开发者不会在post_id上实现你的需求,他们会想其它办法,因为id字段有其本身的特征和使命,这个如果你有兴趣,咱可以私下交流。
至于你说的在URL上用post_id,然后跳跃的post_id会让访问者错乱的情况,这个不是post_id本身的错误,而是你对post_id(或者说WP)的期望有偏差罢了。好比你拿一根绣花针,希望它能剪纸,它肯定是做不好滴。
供你参考。
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 10:22 am
你说的对,应该说,我们需要的并不是现在的这个post_id,而是我们已发表文章的数量的这种“id“?
应该说他们还没设计我们需要的那种~~~
[回复(Reply)]
Estyle 回复:
08月 16th, 2008 at 10:36 am
对,正是如此。
不过俺还是要说,已发表文章的数量的这种“id”,这个东西也挺值得商权的,比如URL的规律如此:
http://poshi.org/第1篇文章
http://poshi.org/第2篇文章
http://poshi.org/第3篇文章
假如你某一天把第2篇文章删了,然后新发的一篇,新的那一篇,究竟是第2篇?还是第4篇?还是第3篇(原来的第3篇提前到第2篇的位置)?
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 3:01 pm
这个就简单啦,已经公开发表的,就不能改了,不管怎么删,id就是不变了
[回复(Reply)]
2008年08月16日 at 8:24 am
邮件已发,查收。
[回复(Reply)]
Poshi 回复:
08月 16th, 2008 at 8:32 am
真的吗?第一时间去查收,真是太感谢了~~~
[回复(Reply)]