Иногда из эстетических или сайтораскруточных соображений возникает необходимость вынести комментарии на отдельную страницу (бишь, выделить отдельный урл). Ниже я покажу один из множества возможных способов.

Одной из интересных особенностей WordPress является то, что при использовании популярной схемы ЧПУ /%category%/%postname%.htm слаг рубрики в урле служит скорее украшением, чем функциональным элементом. Воспользуемся этим. Придумаем рубрику comments (создавать ее при этом  совершенно не обязательно, пусть будет виртуальная). Зачем? Для того чтобы иметь возможность записать урл поста в виде /comments/слаг_поста.htm.  Можете проверить, WP на такой урл прореагирует точно также, как и на урл с реально существующей рубрикой. Если не получилось, можете дальше не читать.

Итак, что мы имеем? Работающие линки /comments/слаг_поста.htm и /слаг_рубрики/слаг_поста.htm. Теперь нам нужно сделать так, чтобы в штатном выводе не показывались комментарии, зато показывались в нештатном. Копируем файл шаблона single.php в single-comments.php. В single.php находим строку
<?php comments_template(); ?>
и удаляем её. На этом месте нам нужно бы вывести ссылочку на /comments/слаг_поста.htm, но об этом позже, ссылки — отдельная тема.

Теперь вернемся к шаблону single-comments.php. Как вы уже догадались, мы будем использовать его для вывода комментариев. Для этого в functions.php нашей Темы добавляем следующий код:

add_filter('single_template', 'yube_comments_temlate');
function yube_comments_temlate($template) {
	global $wp_query;
	if ( $wp_query->query_vars['category_name'] == 'comments' and
		file_exists(TEMPLATEPATH . '/single-comments.php') )
			$template = TEMPLATEPATH . '/single-comments.php';
	return $template;
}

Теперь, увидев пост в «рубрике» comments, WordPress выведет его, использовав шаблон single-comments.php. Если вывод текста поста на этой странице вы считаете неуместным, то можете убрать из Цикла (Loop) the_content() или, если используете теги <!—more—>, после the_post(); можете добавить $more = 0; Да и the_excerpt() никто не отменял.

Есть и «ленивый» метод: ничего не добавлять в functions.php, ничего не копировать, только вышеупомянутую строку в single.php (или в index.php) модифицировать так:

<?php if ( $wp_query->query_vars['category_name'] == 'comments')
    comments_template(); ?>

Как получить в нужных местах ссылку на эту страницу, я расскажу в следующий раз.

P.S. На этом блоге сделано не так 🙂