Показ отрывка вместо статьи на страницах комментариев

Избавляемся от повторяющегося контента и делаем жизнь диалапщиков легче

Прочитав сегодня еще раз статью «Комментатор уже читал пост», решил реализовать описанную Сергеем технику более простым способом.

Кроме того, в  2.7 добавлена поддержка многостраничных комментариев; следуя логике статьи, было бы неплохо показывать отрывок (excerpt) вместо полного текста и для страниц комментариев.

Я вижу два способа решения поставленной задачи:

  1. Изменение шаблона single.php.
  2. Добавление функции в functions.php темы.

Я начну рассмотрение со второго способа — после него реализация первого способа будет тривиальной.

Начнём со скучной теории (skip it).

При использовании разбиения комментариев на страницы, добавляет переменную cpage в массив $wp_query->query_vars. Но здесь есть парочка нюансов:

  1. На первой странице комментариев (она же может быть последней — всё зависит от настроек ) — той, которая отображается при просмотре статьи —  не устанавливает переменную cpage в номер страницы.
  2. При отправлении комментария (и использовании многостраничных комментариев) перенаправляет пользователя на страницу с изменившейся постоянной ссылкой: к постоянной ссылке страницы добавляется comment-page-PAGE/#comment-ID. PAGE — это номер страницы комментариев, ID — ID комментария.
  3. Если в постоянной ссылке присутствует параметр comment-page-XXX (он же cpage при отключённом ЧПУ), то устанавливает переменную $wp_query->query_vars['cpage'] (сюрприз!)

Какие из этого можно сделать выводы? Если посетитель просматривает не первую страницу комментариев, либо только что оставил свой комментарий, $wp_query->get('cpage') вернёт ненулевое значение. В противном случае переменная $wp_query->query_vars['cpage'] не будет установлена. Что и требовалось по условию.

Теперь переходим к отрывку (который excerpt). Плохая новость заключается в том, что многие люди (в том числе и я) его просто не заполняют. Хорошая новость —  (по крайней мере, 2.8; хотя в комментариях к коду написано, что работает, начиная с версии 1.5) умеет его заполнять самостоятельно — это делает функция wp_trim_excerpt(), которая устанавливается фильтром на событие get_the_excerpt. У этой функции (по сравнению с методом Сергея) есть два недостатка:

  1. Она убирает напрочь всю HTML-разметку (anybody cares?)
  2. У своё представление о том, как выглядит знак типографского пропуска (лечится установкой своего фильтра на событие wp_trim_excerpt).

Есть одна особенность: вызов функций the_excerpt()/get_the_excerpt() из фильтра the_content может привести к рекурсивному вызову этого же фильтра из функции wp_trim_excerpt().

В functions.php темы добавляем такой код (в младше 2.8 вместо esc_atrr() нужно использовать attribute_escape()):

[-]
View Code PHP
    function show_excerpt_on_paged_comments($s)
    {
        static $in_here = 0;

        if ($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 (function_exists('add_filter')) {
        add_filter('the_content', 'show_excerpt_on_paged_comments');
    }

Для тех, кто ждёт первый вариант: в шаблоне single.php заменяем вызов the_content() следующим кодом:

[-]
View Code PHP
<?php
        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 (тот, который был рассмотрен первым) при желании можно реализовать в виде плагина.

Добавить в закладки

Связанные записи

Автор: Vladimir; опубликовано в: SEO, Советы; метки: SEO, WordPress, комментарии
19
Июнь
2009

RSS Комментарии к статье «Показ отрывка вместо статьи на страницах комментариев» (8)  »

  1. Mishuta

    Спасибо очень нужный скрипт на выходных постараюсь установить!

  2. Подключи последний кусок на add_action(‘the_content’,”) и будет плагин. Так и обрезание текста можно вынести в отдельную функцию – мне вот как работает эксерпт не шибко нравится.

  3. Вах, а еще у тебя прямо здесь на странице проблема – я из-под Хрома, так что не вижу, где ты использовал способ уравновешивающих паддингов-марджинов для равной высоты колонок (сайдбар, где пунктирные бордеры?), но при добавлении комментария (и вообще, любому переходу по анкору в пределах страницы), весь контент уходит вверх за шапку.

    Получается куда круче, чем описанный способ “убирания” контента =)

    • Это известный баг WebKit’а. Я знаю, как с ним справиться в FireFox, но для Safari/Chrome решения пока не нашел.

      • Так в том то и дело, что это не лечится ни в ИЕ, ни в вебките. Так что не рекомендуется его использовать на страницах с анкорами. Впрочем, я так, на всякий случай, если это вдруг случайно вышло =)

  4. Vanyata

    Спасибо за скрипт. Установил, работает)))

  5. Veronika

    спасибо

Оставить комментарий к записи «Показ отрывка вместо статьи на страницах комментариев»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Изображения должны быть включены!

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя