Остановить 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.

Это возможно? Как мне это сделать? Спасибо!

Shaun
источник
1
upvotet the Q. Как сказал Майк: хороший :)
kaiser

Ответы:

7

Отличный вопрос! WordPress назначает номер страницы вашего комментария для запроса var, 'cpage'который устанавливается /comment-page-1/в конце вашего URL . Итак, ваш виновник в redirect_canonical()функции, строка 192 из /wp-includes/canoncial.php.

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

Поскольку redirect_canonical()функция устанавливается как действие, мы можем вставить собственную функцию, которая будет вызываться вместо нее , чтобы наша функция установила для 'cpage'запроса var значение false, call redirect_canonical(), а затем 'cpage'вернула обратно то, что было; это удержит WordPress от перенаправления на вас.

Чтобы вставить свою собственную функцию, вам нужно вызвать две ловушки 'init'и тому 'template_redirect'подобное, поэтому обязательно установите 'init'ловушку, которая будет вызываться после do_action()внутреннего ядра WordPress, которое добавляет redirect_canonical():

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 )

MikeSchinkel
источник
Короче .... вау! Жаль, что мы не можем сделать +10 здесь ...
Кайзер
Спасибо за подробный ответ, но вопрос - куда я могу поместить этот код? Я пробовал в functions.php, но не очень удачно. Предполагая, что я использую двадцатилетнюю тему, где в файле я могу добавить код?
Шон
@Shaun - Цифры. :) Однажды, когда я не добавил следующий текст в свой ответ, меня вызвали: «Вы можете добавить следующий код в functions.phpфайл вашей темы или в .phpфайл плагина, который вы, возможно, пишете». Но вы говорите, что не работает? Что именно он не делает? Вы поместили echo "Test"; exit;операторы в каждую из функций, чтобы убедиться, что хуки запускаются? Есть ли у вас плагины, которые могут быть конфликтующими? Вы пытались изменить 11в двух местах на 100?Вы включили весь код? Вы создали файл шаблона темы под названием single[comments].php?
MikeSchinkel
@MikeSchinkel Отлично, спасибо. Я не создал ни одного [комментария] .php!
Шон
@Shaun - Рад, что смог помочь!
MikeSchinkel