it-swarm.cn

链接到仅显示没有父帖子的评论的页面

我想在没有父帖的情况下在自己的页面上显示帖子评论。我知道我可以在单个帖子页面上使用wp_list_comments()并传递一个回调函数来使用我自己的注释显示标记。我打算这样做,所以我可以在每条评论中加入一个链接,以便在自己的页面上显示评论。

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

<a href = " www.example.com/individual_comment.php?comment_id = $comment_id">View single comment</a>

...并从查询字符串中获取$ comment_id。

WordPress中的链接会是什么样的?即:我将包括哪些字符串直接用于my_comments.php,我调用get_comment($ comment_id)和comment_template()?

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

您可以在WordPress中创建一个新页面,并为该页面提供一个自定义模板。然后,网址将是通常到达该页面的任何内容。唯一的区别是您正在使用的自定义模板将设置为通过查询字符串接受comment_id,然后只获取特定注释的详细信息,并在模板代码中回显注释的详细信息。

因此,如果您在wordpress中创建了一个名为“注释详细信息”的页面,则可以通过 http://www.domain.com/comment-details (假设您已启用永久链接)。所以你的链接看起来像这样:

<a href = "<?php bloginfo('url');?>/comment-details?comment_id=$comment_id">View single comment</a>

“注释详细信息”页面将设置为使用自定义模板,该模板将包含用于吐出详细信息的代码。

2
Todd Perkins

有许多不同的方法可以实现这一点,有些方法比其他方法更精致,实际上所有方法都有可能与其他插件发生冲突,但忽略了所有这些与你所要求的非常接近的方式。 :)

此解决方案将支持如下所示的URL格式,其中%comment_id%wp_comments表中注释的数字ID:

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);

接下来添加一个parse_query过滤器钩子。这将在WordPress检查查询后调用。它会测试你是否添加了comment_id query_var,如果是,它会测试你是否在所需的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检查查询并加载评论的帖子后调用。在这里,您将首先再次检查query_var中的comment_id,以及您想要的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();

任何问题?请问。

附:我上面描述的所有代码都可以放在你的主题的functions.php文件和/或你自己的插件中。需要注意的是URL重写刷新规则应该放在插件激活挂钩中,如果你要包含它而不是我们只是在管理控制台的固定链接部分手动刷新它们。我没有展示如何注册激活钩子但是如果你想了解更多,你可以在这里阅读。

15
MikeSchinkel