链接到只显示评论而不显示父帖子的页面

时间:2010-08-12 作者:kevtrout

我想在没有父帖子的情况下在自己的页面上显示帖子评论。我知道我可以在单个贴子页面上使用wp\\u list\\u comments(),并传递回调函数以使用我自己的注释显示标记。我计划这样做,这样我就可以在每个评论中包含一个链接,在自己的页面上显示该评论。

如果这不是WordPress,我会使用:

<a href = " www.example.com/individual_comment.php?comment_id = $comment_id">View single comment</a>
。。。并从查询字符串中获取$comment\\u id。

这个链接在WordPress中会是什么样子?ie:我会包括什么字符串来直接访问,比如说,my\\u评论。php,其中我调用get\\u comment($comment\\u id)和comment\\u template()?

<a href = "<?php bloginfo(\'url\');?>/what/goes/here?comment_id = $comment_id"<View single comment</a>

2 个回复
最合适的回答,由SO网友:Todd Perkins 整理而成

你可以在WordPress中创建一个新页面,并为该页面提供一个自定义模板。然后,url将是访问该页面的正常方式。唯一的区别是,您使用的自定义模板将设置为通过querystring接受comment\\u id,然后只获取特定注释的详细信息,并在模板代码中回显注释的详细信息。

因此,如果您在wordpress中创建了一个名为“评论详细信息”的页面,您可以通过http://www.domain.com/comment-details (假设已启用永久链接)。因此,您的链接如下所示:

<a href = "<?php bloginfo(\'url\');?>/comment-details?comment_id=$comment_id">View single comment</a>
“评论详细信息”页面将被设置为使用自定义模板,该模板将包含吐出详细信息的代码。

SO网友:MikeSchinkel

有许多不同的方法可以实现这一点,有些方法比其他方法更精巧,几乎所有的方法都有可能与其他插件发生冲突,但忽略所有这些,这里有一种方法非常接近您的要求。:)

此解决方案将支持如下URL格式:%comment_id% 是来自wp_comments 表格:

http://example.com/comments/%comment_id%/

首先,您需要使用以下代码配置URL重写。希望这是合理的自我嘲讽,但请毫不犹豫地问:

$wp->add_query_var(\'comment_id\');  // Add the "behind-the-scenes" query variable that WordPress will use
$wp_rewrite->add_rewrite_tag(\'%comment_id%\', \'([0-9]+)\',\'comment_id=\');  // Define a rewrite tag to match that assigns to the query var 
$wp_rewrite->add_permastruct(\'comment-page\', \'comments/%comment_id%\');   // Define a URL pattern to match the rewrite tag.
您还需要在插件激活挂钩中调用此代码来刷新规则,或者如果是您的站点,您可以在管理控制台的设置区域保存永久链接:

global $wp_rewrite;
$wp_rewrite->flush_rules(false);
下一步添加aparse_query 过滤器挂钩。这将在WordPress检查查询后调用。它测试您的comment_id query\\u var set,如果是,则测试您是否在所需的URL上。如果是,则使用get_comment() 为了设定\'p\' 与评论相关的帖子的参数(应设置为帖子ID)。这样,当WordPress运行它将要运行的查询时,不管发生什么,它都会加载您在comment.php 主题模板文件,以后需要时无需再运行另一个查询。这段代码还告诉WordPress使用命名奇怪的caller_get_posts 选项:

add_filter( \'parse_query\', \'my_parse_query\' );
function my_parse_query( $query ) {
    global $wp;
    if (isset($query->query[\'comment_id\']) && substr($wp->request,0,9)==\'comments/\') { 
        $comment = get_comment($query->query[\'comment_id\']);
        $query->query_vars[\'p\'] =  $comment->comment_post_ID; // Causes the comment\'s post to be loaded by the query.
        $query->query_vars[\'caller_get_posts\'] = true;  // Keeps sticky posts from invading into the top of our query.
    }
}
接下来,您需要将代码挂接进来/wp-includes/template-loader.php 使用template_include 滤器WordPress检查查询并加载评论帖子后,将调用此函数。在这里,您将首先再次检查comment_id 在query_var中,以及您想要的URL。如果是,我们将更换/index.php 模板页面与/comment.php 这是您需要创建的主题模板文件:

add_filter( \'template_include\', \'my_template_include\' );
function my_template_include( $template ) {
    global $wp,$wp_query;
    if (isset($wp_query->query[\'comment_id\']) && substr($wp->request,0,9)==\'comments/\') {
        $template = str_replace(\'/index.php\',\'/comment.php\',$template);
    }
    return $template;
}
最后,现在您需要创建我选择调用的主题模板文件/comment.php. 因为这是你的主题,你会想让它看起来像你想要的,但这里有一个例子让你开始:

<?php 
/*
 *  File: /wp-content/themes/my-theme/comment.php
 */ 
global $wp_query,$post;
$comment_id = $wp_query->query[\'comment_id\'];
$comment = get_comment($comment_id);
$permalink = get_permalink($post->ID);
get_header();
?>
<div id="container">
    <div id="comment-<?php echo $comment_id; ?>" class="comment">
        <p>Comment by: <span class="comment-author">
            <a href="<?php echo $comment->comment_author_url; ?>"><?php echo $comment->comment_author; ?></a></span>
            on <span class="comment-date"><?php echo date("D M jS Y", strtotime($comment->comment_date)); ?></span>
          at <span class="comment-time"><?php echo date("h:ia", strtotime($comment->comment_date)); ?></span>
        </p>
        <p>About: <a href="<?php echo $permalink; ?>"><?php echo $post->post_title; ?></a></p>
        <blockquote><?php echo $comment->comment_content; ?></blockquote>
    </div>
</div>
<?php 
get_sidebar();
get_footer();
有什么问题吗?问问吧。

P、 我上面描述的所有代码都可以放在你的主题中functions.php 文件和/或您自己的插件。对于URL重写刷新规则有一个警告,如果你打算在管理控制台的permalinks部分手动刷新它们,那么它应该放在插件激活挂钩中。我没有展示如何注册激活钩子,但是如果你想了解更多,你可以阅读here.

结束

相关推荐