求解 WordPress 最新评论无法定位问题

自从解决了 Feedsky 无法正常更新Opera 下侧边栏错位的问题,我就学会了,有关于 WordPress 技术上的难题就直接作为日志发布出来求助。因为把问题发布到 WordPress 中文论坛中总是被无数水帖淹没,而且论坛的牛人又都喜欢潜水,只看不回,囧~~~所以还不如在我的日志里爆光率高一些,也可以引来一些 WordPress 大虾们为我解答疑难杂症。

因为本人喜欢折腾 WordPress,越是折腾,这问题就越多。最近就遇到一个棘手的 WordPress 难题,至少对我来说相当困难,而且这个问题有些离奇,我都不知道怎么描述,请大虾们要有点耐心了,我比较啰嗦。我的评论是用 WordPress 原生的 previous_comments_link 和 next_comments_link 两个函数进行分页的,免插件。我在后台开启了分页显示评论,并且每页显示10条评论(嵌套的评论数不被计算在内)。

当评论数未超过一页时,评论链接地址形如:http://日志地址/comment-page-1#comment-ID,而侧边栏的最新评论版块中该评论的相应链接地址形如:http://日志地址#comment-ID。虽然前后两者网址各不相同,但是点击侧边栏的最新评论还是能够跳转到相应评论之上。

当评论数超过一页时,评论链接地址形如:http://日志地址/comment-page-ID#comment-ID,而侧边栏的最新评论版块中该评论的相应链接地址依然形如:http://日志地址#comment-ID。前后两者网址依旧各不相同,但是这时候点击侧边栏的最新评论就不能跳转到相应评论之上,而是停留在该评论所对应的日志页面的起始位置。

也就是说,某条评论的实际所在的页面不在日志当前页,那么侧边栏上的该条最新评论就无法定位。这样就会造成一个问题,如果某访客的留言已经被埋在日志评论的第二、三……页中,则侧边栏的最新评论就只能跳转到这条评论的相应日志,而不能跳转到此评论上。

说的好费劲,连我自己都有些晕了,不知道大家有没有看懂,相信如果有相同经历的朋友应该会很快理解我的。下面是我的最新评论代码,也是非插件的,供大虾参考,希望能给予提示和帮助,在此先万分感谢各位咯~

<?php
global $wpdb;
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,25) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND comment_author != '万戈' AND post_password = '' ORDER BY comment_date_gmt DESC LIMIT 10";
$comments = $wpdb->get_results($sql);
$output = $pre_HTML;
foreach ($comments as $comment) {
$output .= "n<li>". " <a href="" . get_permalink($comment->ID) . "#comment-" . $comment->comment_ID . "" title="" . $comment->post_title . " 上的评论">".strip_tags($comment->comment_author) .": ". strip_tags($comment->com_excerpt) ."</a></li>";
}
$output .= $post_HTML;
$output = convert_smilies($output);
echo $output;
?>
  1. 其实那天也是用手机看你这篇日志,回去试试了自己的发现也存在这问题,于是晚上舍不得睡觉一直捣鼓,然后居然成功啦 :lol:

  2. global $wpdb;
    $sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,
    comment_post_ID, comment_author, comment_date_gmt, comment_approved,
    comment_type,comment_author_url,
    SUBSTRING(comment_content,1,20) AS com_excerpt
    FROM $wpdb->comments
    LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID =
    $wpdb->posts.ID)
    WHERE comment_approved = '1' AND comment_type = '' AND comment_author != '成' AND
    post_password = ''
    ORDER BY comment_date_gmt DESC
    LIMIT 10";
    $comments = $wpdb->get_results($sql);
    $output = $pre_HTML;
    foreach ($comments as $comment) {
    $output= '';
    $output .= $before."comment_ID) . "\" title=\"《" .
    $comment->post_title . "》上的评论\">".strip_tags($comment->comment_author)
    .": ". strip_tags($comment->com_excerpt)
    ."
     ".$after;
    echo convert_smilies($output);
    }

    万戈,试试,我那里是成功解决了,我弄了一下午到现在 :sad:

  3. 我直接使用了内部的widget,所以没什么问题,所以你最好看一下他内部的写法。
    --
    我懒得动。呵呵。。
    大约在
    "\wp-includes\default-widgets.php"(645行左右):

  4. 经测试,可以了

    comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 15 ";

    $comments = $wpdb->get_results($sql);

    $output = '最新评论';
    foreach ($comments as $comment) {
    $output .= "\n\t".$comment->comment_author.":comment_ID) . "\" title=\"" . $comment->comment_author . "-" . get_the_title($comment->comment_post_ID) . "\">" .strip_tags($comment->comment_content) . "...";
    }
    $output .= '';

    echo convert_smilies($output); ?>

    那个评论内容过长,你就截断一下

  5. <?php $src_count=25;$src_length=60;

    $sql = "SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 15";
    $comments = $wpdb->get_results($sql);
    $output = '<li><h3><span onclick="showhidediv("newcomment")">最新评论</span></h3><ul id="newcomment">';
    foreach ($comments as $comment) {
    $output .= "\n\t<li id=\"comment\"><span style=\"font-weight:bold;\">".$comment->comment_author.":</span><a href=\"" . get_comment_link($comment->comment_ID) . "\" title=\"" . $comment->comment_author . "-" . get_the_title($comment->comment_post_ID) . "\">" . get_the_title($comment->comment_post_ID) . "...</a></li>";
    }
    $output .= '</ul></li>';

    echo convert_smilies($output); ?>

  6. 你不说那么详细罗嗦我也知道你说啥了,因为我早折腾了,我懒,没写教程 - - ,而且我改了竟然在后来修改主题时又忘了更正 :arrow: ,下面是方法:

    . get_permalink($comment->ID) . "#comment-" . $comment->comment_ID .
    改为
    . htmlspecialchars( get_comment_link( $comment->comment_ID ) ) .

    效果可以去我博客看看

      • 不过我认真检查了一下,也在你测试了一下,还是有些问题——或者说问题依旧,例如一篇文章已经有2页评论了,有人在第一页回复嵌套评论后的正确地址是:……/comment-page-1#comment-10242,但却显示为:……/comment-page-2#comment-10242,所以看来问题还是没得到解决,粗心大意啊

  7. 你这个问题应该不难解决的,其实你已经找到了问题的原因,把侧边栏的评论链接改成http://日志地址/comment-page-ID#comment-ID这样的形式就行了,或者调用get_comment_link()来自动获取评论的链接地址。
    另外,如果你的wordpress版本在2.7以上,评论的分页你可以用paginate_comments_links()这个函数就行了,而且效果也比较好

  8. 你的暴光率高是因为你的博客热门啊。
    别人的博客,例如我的,不应一定有这么多人看……