停止WordPress将comment-page-1重定向到帖子页面?


8

我想为帖子上的评论提供一个单独的页面,这样的页面:/2011/02/post-name/仅显示帖子,然后单击链接以查看评论,将您带到这样的页面:/2011/02/post-name/comment-page-1/

然后,我将检查URL以查看其中是否包含“ comment-page-x”,如果显示的话,则以不同的方式显示该页面(删除帖子,这样人们就不必每次都滚动过去了,并且还可以设置样式有点不同)。

这可以工作,但是WordPress会重定向comment-page-1到帖子页面-我需要它将其保留comment-page-1在URL中。

这可能吗?我该怎么做?谢谢!


1
正如迈克所说:好人:)
kaiser

Answers:


7

好问题!WordPress将您的注释页号分配给查询var 'cpage',当您的URL /comment-page-1/末尾有该查询时将进行设置。因此,您的罪魁祸首是该redirect_canonical()函数的第192行/wp-includes/canoncial.php

if ( get_query_var('paged') || is_feed() || get_query_var('cpage') ) {

由于将redirect_canonical()函数设置为操作,因此我们可以做的是插入要调用的函数,将函数'cpage'var 设置为false,调用redirect_canonical(),然后再设置'cpage'为原来的值。这将使WordPress无法重定向到您。

要插入自己的函数,您需要调用两个钩子'init''template_redirect'就像这样,确保将'init'钩子设置为在do_action()添加了redirect_canonical()以下内容的内部WordPress核心之后调用:

add_action('init','yoursite_init',11); //11=lower priority
function yoursite_init() {
  remove_action('template_redirect','redirect_canonical');
  add_action('template_redirect','yoursite_redirect_canonical');
}

add_action('template_redirect','yoursite_redirect_canonical');
function yoursite_redirect_canonical($requested_url=null, $do_redirect=true) {
  $cpage = get_query_var('cpage');
  set_query_var('cpage',false);
  redirect_canonical($requested_url, $do_redirect);
  set_query_var('cpage',$cpage);
}

然后,当然,您需要对自己的计算机做一些事情'cpage'。您可以检查返回的值,get_query_var('cpage')也可以添加另一个挂钩,以允许您创建我所做的特定于注释的模板。这将增加查找具有相同主题的模板文件,因为它会正常加载,但与[comments].php这个名字,而不是结束.php,即single[comments].php请注意,我将此过滤器的优先级设置为11;如果您使用的插件在钩子之后添加自身,则可能需要设置更大的数字:

add_filter('single_template','yoursite_single_template',11);
function yoursite_single_template($template) {
  if (get_query_var('cpage'))
    $template = str_replace('.php','[comments].php',$template);
  return $template;
}

这是所有工作的证明!

自定义WordPress页面模板的屏幕截图以进行评论
(来源:mikeschinkel.com


简短....哇!太糟糕了,我们不能在这里+10 ...
kaiser

感谢您的详细答复,但有一个问题-我可以将这段代码放在哪里?我已经尝试过functions.php,但运气不佳。假设我使用二十个主题,我应该在文件的哪个位置添加代码?
肖恩

@Shaun-数字。:)有一次,我没有在答案中添加以下文本:“您可以将以下代码添加到主题functions.php文件或.php您正在编写的插件文件中。” 但是你说那行不通吗?它到底在做什么?您是否echo "Test"; exit;在每个函数中都添加了语句以确保钩子正在触发?您是否有可能会冲突的插件?您是否尝试过11在两个位置更改为100?是否包含所有代码?您是否创建了一个名为的主题模板文件single[comments].php
MikeSchinkel

@MikeSchinkel很棒,谢谢。我没有创建single [comments] .php!
肖恩

@Shaun-很高兴我可以帮忙!
MikeSchinkel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.