不在当前页的评论定位问题

May 4th, 2010 Add Comment

我发布过一款命名为 WP-RecentCommens 的插件. 顾名思义, 这插件主要用于显示最新评论, 因为其 AJAX 翻页, 查看详细的评论内容等特性, 获得了一些用户的肯定, 但一个看似不可调和的问题让插件显得有点尴尬 (最近收到几个关于该问题的来信).

关于这个问题, 我在很早之前应该就交代过. 如果用户从最新评论栏内点击进入文章内页, 如果刚好评论不在本页, 则无法通过锚点定位到该评论. 这个问题肯定会发生的, 但是几率很低.

这是一位国外朋友在邮件中的描述, 把问题说得清清楚楚.

The links to comments on pages are broken so any comment appearing on a page with an extended /comment-page-1/ type URL is not being linked correctly.

I really need to use paged comments as frequently my comments go up and beyond 1000. However, my visitors are becoming frustrated with not being able to link back to comments made on previous pages.

是否有办法解决这个问题呢? 有的, 而且解决办法不只一个. 下面是我想到的两个解决方案.

1. 在获取评论链接时, 通过排序评论和每页显示数量计算出评论所在页面.
这个方法看似可以完全解决问题, 但其加大数据库负担, 且影响文章的 SEO. 使用评论分页时文章内页的 SEO 处理可以参考 《对评论分页的 SEO》

2. 点进文章内页后, 搜索对应的评论. 如果找不到评论, 则通过 AJAX 将该条评论加载到评论列表的顶部或者底部, 再定位到锚点上.
这个方法开销相对较小 (这样的评论出现几率确实很小), 但评论 DOM (页面结构) 的构造可是相当的麻烦, 且不能保证所有主题显示正确.

思其利弊, 我觉得这两种处理方式都不靠谱, 在想到更好的办法之前或许不作为是最好的. 如果哪位想到好的解决办法, 欢迎联系我或者在此留言, 不胜感激.

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 不在当前页的评论定位问题

  1. http://0.gravatar.com/avatar/ee260950fb41a56d40518a0d9201be88?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    I feel strongly about it and love reading more on this topic. If possible, as you gain expertise, would you mind updating your blog with more information? It is extremely helpful for me.

  2. http://0.gravatar.com/avatar/6ee0d36d53b482297f145012716ebb99?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    Nice effort, very informative, this will help me to complete my research.

  3. http://0.gravatar.com/avatar/8c5e785584e0d5b2af93f320dcdf23f0?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    I want to help but I do not know what it is. sory

  4. http://0.gravatar.com/avatar/62e3a6a54fb100a716f5c117c9ef32fa?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  5. http://1.gravatar.com/avatar/747b129f5934864375dc29f48c95fba3?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Justice
    恩~我少想了一层

  6. http://0.gravatar.com/avatar/28ea04650153a2dc99acd9b8d1b6fc4e?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    WordPress 自带一个 get_comment_link 的函数.

    直接将的 comment 对象传进去就能得到一个带有分页的连接(如果已经设置了分页的话).

    这个函数的缺点是:
    1, 即使评论在第一页能找到(这时候不需要带分页地址也能正确找到评论)它也会返回一个带分页的地址.
    解决方案是. 先判断一下, 根据评论的设置. 如果评论在第一页出现. 不使用该函数. 而是直接使用文章地址#评论ID形式
    2, 该函数会增加数据库的查询次数. 应该是该函数内部调用 get_permalink 等造成的.

  7. http://1.gravatar.com/avatar/bb6eeca6c19f5f11c8aaaa061ccde5e7?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @Justice
    恩~我少想了一层

  8. http://0.gravatar.com/avatar/28706468db54b787d38a5f72ae295070?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这种情况下,可以在查询的结果前插入匹配的评论数据然后再返回呀。这样的话,前台页面的Dom结构就不用改了

  9. http://0.gravatar.com/avatar/cc2e321cab4614329021e5be78a60d7c?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    现在这个插件很多人都在引用

  10. http://1.gravatar.com/avatar/78b0fd25b4aadfa50d9dde0ba2cc5d50?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我直接将评论不分页了

  11. http://0.gravatar.com/avatar/ac7435d38b90712335b3fe9268655d82?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    元老们都只是偶出来聊聊。

  12. http://0.gravatar.com/avatar/c2ef5a055d3267156d2cd04f1e1e53ba?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    对于评论更新比较快的,是一个麻烦的事情,而且,每页评论数如果设置的数字比较小的话,这个问题是非常常见的。

  13. http://1.gravatar.com/avatar/ffa9ac42c56fd4776ccef37c57664965?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    默认的评论分页也会有这样的问题吧,就好像地址被缓存了和实时后推无法同步

  14. http://0.gravatar.com/avatar/4dfbd693401458acb2f672f2c811fbc3?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    辛苦了 试试u

  15. http://1.gravatar.com/avatar/53ac5e73cc4436c21bc5364bb95aac49?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    不喜欢评论分页,评论长就长呗,往下拉不就完了,比点按钮翻页好吧,加载慢就慢呗,能慢到那去?是吧,呵呵~

  16. http://0.gravatar.com/avatar/4fd2b353a39be99689a4c0f475dbd8ee?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G
  17. http://1.gravatar.com/avatar/94edba5ccaf4f54d0891cf3a7b1e1280?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我现在评论都不翻页了
    呵呵
    一下拉老长~

  18. http://1.gravatar.com/avatar/bbcf836078ebc4b6e3ace39ecd55a260?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    向NeoEase学习,我用的的主题就是拟设计的

  19. http://0.gravatar.com/avatar/eefde0b28ef0c51408b6d3039e99117a?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    来了阿里巴巴之后博客产出明显减少了,可见这里是多么快活!
    求交换链接,你懂的!

  20. http://1.gravatar.com/avatar/1cfd6b67e61a959b431aa1bc3e4f6736?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @ZhouQi
    你不知道要取的评论在这篇文章的评论中排行老几,必须要查数据库吧。而且这不是在输出某篇文章评论的循环中做的呀。

    @mg12
    我觉得第二个方案不太现实,毕竟主题评论区不在你插件控制范围之内了。第一个方案为插件显示出来的每条评论 select count 一下同篇文章中发布时间更早的评论数,这个开销也还行吧。SEO 的话,不是有 rel="canonical" 么,不过这个要看主题和其他插件了。

  21. http://0.gravatar.com/avatar/e41d06048fe9d04f0811c966842abcd6?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    。。。我还想来找答案的,困惑我很久了

  22. http://0.gravatar.com/avatar/cb60a4734dcdd29d351f2f8915e09205?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    请问,如何让指定页面的评论进行分页呢?

  23. http://1.gravatar.com/avatar/bb6eeca6c19f5f11c8aaaa061ccde5e7?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    循环输出评论的时候,用i计算评论所在页,怎么会加大数据库负担呢?最多是微乎其微的服务器负担。

  24. http://1.gravatar.com/avatar/b2986defdd28dcaa196e317a94d82e31?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    这个是有解决办法。。。。一直以分页形式调用评论就行。。。

  25. http://1.gravatar.com/avatar/1cfd6b67e61a959b431aa1bc3e4f6736?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    @bolo
    最近评论栏内的大多数都被截断的,所以 AJAX 获取评论还是必须的吧。

  26. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    把最新评论栏内该条评论的内容替换进评论列表的最后一条评论里,可以省略Ajax这一步,貌似也就是类似jQuery里append的效果。
    如果实在找不到更好的方案就干脆用你的第二个想法好了,任何插件都不可能兼容所有的主题,关键是要提供详细的使用说明。
    再提一个建议,你可以提供一个详细的设置,把该条评论装到一个独立的容器里,插到评论列表的尾部,让用户自定义这个容器的样式啊,只要用户的样式写得好,这个容器完全可以伪装成一条本来就有的评论的样子。

  27. http://1.gravatar.com/avatar/fd126aa64db6755fe66749e7870b9c9c?s=32&d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    我用的时候没发现这个问题。。

  28. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G

    搞个有奖问答才能调动读者的热情啊

  29. http://0.gravatar.com/avatar/2a9c4f525050372a6fe0b10ce4fe8957?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D32&r=G