问题描述

我想在没有父帖子的自己的页面上显示发表评论。我知道我可以在单个帖子上使用 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>

最佳解决方法

您可能只需在 WordPress 中创建一个新页面,并为该页面提供自定义模板。那么 url 将是通常会到达该页面的任何东西。唯一的区别是,您使用的自定义模板将被设置为通过 querystring 接受 comment_id,然后只需获取特定注释的详细信息,并在模板代码中回显注释的详细信息。

所以,如果您创建了一个名为”Comment Details” 的 wordpress 页面,您可以通过 http://www.domain.com/comment-details 访问该页面 (假设您已启用固定链接) 。所以你的链接看起来像这样:

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

“Comment Details” 页面将被设置为使用一个自定义模板,其中包含代码以吐出细节。

次佳解决方法

有许多不同的方法来实现这一点,一些比其他的更好,几乎所有这些都有可能与其他插件冲突,但忽略所有这一切都非常接近你所要求的一切。 🙂

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

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

首先,您需要使用以下代码配置 URL 重写。希望它是合理的 self-explanitory 但毫不犹豫地问:

$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.
    }
}

接下来,您将需要使用 template_include 过滤器将代码钩在/wp-includes/template-loader.php 中。这将在 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 重写刷新规则,应该在插件激活钩子中,如果你要包括它,而不是我们在管理控制台的 「永久链接」 部分手动刷新它们。我没有显示如何注册一个激活钩做,但如果你想了解更多,你可以阅读 here

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。