Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче
Прочитав сегодня еще раз статью «Комментатор уже читал пост», решил реализовать описанную Сергеем технику более простым способом.
Кроме того, в WordPress 2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев.
Я вижу два способа решения поставленной задачи:
- Изменение шаблона
single.php
. - Добавление функции в
functions.php
темы.
Я начну рассмотрение со второго способа — после него реализация первого способа будет тривиальной.
Начнём со скучной теории (skip it).
При использовании разбиения комментариев на страницы, WordPress добавляет переменную cpage
в массив $wp_query->query_vars
. Но здесь есть парочка нюансов:
- На первой странице комментариев (она же может быть последней — всё зависит от настроек WordPress) — той, которая отображается при просмотре статьи — WordPress не устанавливает переменную
cpage
в номер страницы. - При отправлении комментария (и использовании многостраничных комментариев) WordPress перенаправляет пользователя на страницу с изменившейся постоянной ссылкой: к постоянной ссылке страницы добавляется
comment-page-PAGE/#comment-ID
.PAGE
— это номер страницы комментариев,ID
— ID комментария. - Если в постоянной ссылке присутствует параметр
comment-page-XXX
(он жеcpage
при отключённом ЧПУ), то WordPress устанавливает переменную$wp_query->query_vars['cpage']
(сюрприз!)
Какие из этого можно сделать выводы? Если посетитель просматривает не первую страницу комментариев, либо только что оставил свой комментарий, $wp_query->get('cpage')
вернёт ненулевое значение. В противном случае переменная $wp_query->query_vars['cpage']
не будет установлена. Что и требовалось по условию.
Теперь переходим к отрывку (который excerpt). Плохая новость заключается в том, что многие люди (в том числе и я) его просто не заполняют. Хорошая новость — WordPress (по крайней мере, 2.8; хотя в комментариях к коду написано, что работает, начиная с версии 1.5) умеет его заполнять самостоятельно — это делает функция wp_trim_excerpt()
, которая устанавливается фильтром на событие get_the_excerpt
. У этой функции (по сравнению с методом Сергея) есть два недостатка:
- Она убирает напрочь всю HTML-разметку (anybody cares?)
- У WordPress своё представление о том, как выглядит знак типографского пропуска (лечится установкой своего фильтра на событие
wp_trim_excerpt
).
Есть одна особенность: вызов функций the_excerpt()
/get_the_excerpt()
из фильтра the_content
может привести к рекурсивному вызову этого же фильтра из функции wp_trim_excerpt()
.
В functions.php
темы добавляем такой код (в WordPress младше 2.8 вместо esc_atrr()
нужно использовать attribute_escape()
):
{
static $in_here = 0;
if (0 != $in_here) {
return $s;
}
$in_here = 1;
global $wp_query;
$cpage = (int)$wp_query->get('cpage');
if ($cpage > 0) {
$s = get_the_excerpt() . '<p>← Вернуться к полной версии записи «<strong>' . sprintf('<a href="%s">%s</a>', esc_attr(get_permalink()), get_the_title()) . '</strong>»…</p>';
}
$in_here = 0;
return $s;
}
if (true == function_exists('add_filter')) {
add_filter('the_content', 'show_excerpt_on_paged_comments');
}
Для тех, кто ждёт первый вариант: в шаблоне single.php
заменяем вызов the_content()
следующим кодом:
if ((int)$wp_query->get('cpage') > 0) {
echo get_the_excerpt() . '<p>← Вернуться к полной версии записи «<strong>' . sprintf('<a href="%s">%s</a>', esc_attr(get_permalink()), get_the_title()) . '</strong>»…</p>';
}
else {
the_content("Далее…");
}
?>
В принципе, вариант №2 (тот, который был рассмотрен первым) при желании можно реализовать в виде плагина.
Спасибо очень нужный скрипт на выходных постараюсь установить!
Подключи последний кусок на add_action(‘the_content’,”) и будет плагин. Так и обрезание текста можно вынести в отдельную функцию - мне вот как работает эксерпт не шибко нравится.
Вах, а еще у тебя прямо здесь на странице проблема - я из-под Хрома, так что не вижу, где ты использовал способ уравновешивающих паддингов-марджинов для равной высоты колонок (сайдбар, где пунктирные бордеры?), но при добавлении комментария (и вообще, любому переходу по анкору в пределах страницы), весь контент уходит вверх за шапку.
Получается куда круче, чем описанный способ “убирания” контента =)
Это известный баг WebKit’а. Я знаю, как с ним справиться в FireFox, но для Safari/Chrome решения пока не нашел.
Так в том то и дело, что это не лечится ни в ИЕ, ни в вебките. Так что не рекомендуется его использовать на страницах с анкорами. Впрочем, я так, на всякий случай, если это вдруг случайно вышло =)
И в IE тоже? Чёрт! В 7 и 8?
Спасибо за скрипт. Установил, работает)))