让 WordPress 分页文章也可以静态化

Posted by David on 2008-03-07 in Blog Related

WordPress 提供了多种结构标签,以便我们可以设置各种格式的永久链接结构,再配合一些静态化插件(例如 cos-html-cache),就可以使页面真正静态化。

不过 WordPress 对已分页文章的永久链接的处理方式则会给页面静态化后的访问带来问题。 例如,永久链接结构为 /%year%/%monthnum%/%postname%.html,WordPress 生成的文章相关分页链接如下所示:

yourdomain.com/2008/03/postname.html 
yourdomain.com/2008/03/postname.html/2 
yourdomain.com/2008/03/postname.html/3 

可以看到 WordPress 只是简单地将页码加在了链接尾部,所以当我们静态化其中一页的内容后,我们将只能访问被静态化的那一页内容而无法访问其它分页的内容。为了可以静态化所有分页内容,需要对 WordPress 处理永久链接的方式做些小小的改动,并改变分页链接的形式:

yourdomain.com/2008/03/postname.html 
yourdomain.com/2008/03/postname-2.html
yourdomain.com/2008/03/postname-3.html


以前面提到的永久链接结构为例,作如下修改:

/*
  打开 wp-includes/rewrite.php 文件
  找到 $rewrite = array_merge($rewrite, array($match => $query))
  在这行代码之前添加以下代码:
*/
if (strpos($match, '.html') !== false && strpos($query, '&page=') !== false) {
  $match = str_replace('(/[0-9]+)?/?$', '$', $match);
  $rewrite = array_merge($rewrite, array(str_replace('([^/]+).html', '([^/]+)-([0-9]+).html', $match) => $query));
}

以上代码使 WordPress 可以处理第一页后面的分页链接。其实通过修改 .htaccess 也可以达到同样的效果。

除此之外还需要修改文章分页链接生成模板。打开 wp-includes/post-template.php 文件,修改 wp_link_pages 函数(这段代码不太好贴,点此查看)。

具体效果,可以点击这里还有这里查看。

UPDATE:
已经有了更好的解决方案,点此查看

Tags: , , .

Comments

  1. 1 ddkk3000

    😳 小白的问一下,如何修改“post-template.php”这个没有看懂,能不能贴一个完整的该文件出来?谢谢。

  2. 2 David

    @ddkk3000:
    http://img.voidman.com/wp/2008/03/wp_link_pages.phps 里的代码覆盖wp-includes/post-template.php 里的 wp_link_pages 函数就可以了

  3. 3 ddkk3000

    博主,我覆盖了以后,访问分页显示404未找到。

  4. 4 David

    @ddkk3000:
    wp-includes/rewrite.php 文件修改过后,要到后台设置里重新生成一下永久链接规则

  5. 5 rekey

    为何我修改了永久链接后(/html/%year%/%monthnum%/%day%/%postname%.html),分页面就出现问题,还原到默认永久链接,分页就能浏览,请教解决办法。

  6. 6 David

    @rekey:
    文中举例只适用于 /%year%/%monthnum%/%postname%.html 这样的永久链接结构

  7. 7 life97

    请问如何通过.htaccess 达到这样的效果呢?而且.html/trackback也是不正常,发现博主的会转向解决这一问题,是303永久定向吗?

  8. 8 life97

    请教,如果想用于/%year%/%monthnum%%day%/%postname%.html这样的永久链接呢?该怎么办呢?

  9. 9 David

    @life97:
    只要是以%postname%.html结尾的永久链接,应该都适用。修正一下前面和 rekey 说的。不过为了避免冲突, %postname% 不要以字符 – 加数字的形式结尾,如 -45

    如果想通过修改 .htaccess 实现,按照你的 URL 结构,添加
    RewriteRule ^([0-9]{4})/([0-9]{2})([0-9]{2})/([^/]+)-([0-9]+).html$ index.php?year=$1&monthnum=$2&day=$3&name=$4&page=$5 [L]

    .html/trackback 的问题我也忘记之前是咋整的了,本地测试也是有问题。

  10. 10 life97

    @David:
    添加这个.htaccess规则,并不能正确转向啊,举例:http://alibm.org/2008/0316/popularity-model-leah-dizon-chiedisang.html/2
    另外,trackback这个能不能也通过.htaccess转向呢?

  11. 11 life97

    在没有生成html文件时,添加这个.htaccess规则分页是可以转向的,但生成html后就不生效了。估计还是得用改文件的方法,但楼主提供的文中举例只适用于 /%year%/%monthnum%/%postname%.html 这样的永久链接结构,如果想用/%year%/%monthnum%%day%/%postname%.html这样的永久链接呢?该怎么改呢?

  12. 12 David
  13. 13 life97

    @David: 又是我。分页后,google管理上具里显示很多“重复的元说明”和“重复标题”,这是因分页而导致的。不知有没有解决的方法。google了很久都没人提出这样的问题。难道说这并不重要?

  14. 14 David
  15. 15 chris

    😕 想问下博主,为什么我在永久连接后加入了.html后,文章详细页面会404? 而且那个cos-html-cache的插件具体怎么用呀? 能发个教程上来吗? 谢谢了

  16. 16 David

    @chris: 请先禁用 cos-html-cache 插件,看看还不会出现404错误

  17. 17 M.坏男

    哈哈,谢谢blog主,修改成功了 😆

  18. 18 David
  19. 19 西

    有个问题想请教站长,说来话长,已经发邮件到voidman(at)voidman.com
    希望站长看到后查下邮件,谢谢。

  20. 20 694463

    http://www.voidman.com/2008/11/the-better-solution-for-static-paged-post.html
    这个文章我看了,也用上了你们的代码,感觉很不错,唯一的就是分页的样式太难看了点
    不知道在哪修改,要怎么修改呢?因为是新手对了些不是太懂,还希望你能搞一个CSS样式出来
    http://www.siwazhan.com 这个是我的站点,用上了是快了很多,不过用那插件我的首页无法生成不知道是哪出的问题!

Trackbacks / Pingbacks

  1. » 巧妙美化静态化文章分页链接结构 | 历代志
  2. » 巧妙美化静态化文章分页链接结构 « 得看看-知识速查|分享
  3. » WordPress 分页文章静态化的更优解决方案 | 乐享网

Leave a Reply

You can use these XHTML tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>