问题描述
我想在没有父帖子的自己的页面上显示发表评论。我知道我可以在单个帖子上使用 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:
首先,您需要使用以下代码配置 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。