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

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

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

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

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

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

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

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

  1. На первой странице комментариев (она же может быть последней — всё зависит от настроек WordPress) — той, которая отображается при просмотре статьи — WordPress не устанавливает переменную cpage в номер страницы.
  2. При отправлении комментария (и использовании многостраничных комментариев) WordPress перенаправляет пользователя на страницу с изменившейся постоянной ссылкой: к постоянной ссылке страницы добавляется comment-page-PAGE/#comment-ID. PAGE — это номер страницы комментариев, ID — ID комментария.
  3. Если в постоянной ссылке присутствует параметр 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. У этой функции (по сравнению с методом Сергея) есть два недостатка:

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

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

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

[-]
View Code PHP
    function show_excerpt_on_paged_comments($s)
    {
        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() следующим кодом:

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

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

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

19
Июнь
2009

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

  1. Mishuta says:

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

  2. Сергей М. says:

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

  3. Сергей М. says:

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

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

    • Vladimir says:

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

      • Сергей М. says:

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

  4. Vanyata says:

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

Подписаться на RSS-ленту комментариев к статье «Показ отрывка вместо статьи на страницах комментариев» Trackback URL: http://blog.sjinks.org.ua/seo/583-showing-execrpt-instead-of-post-on-paged-comments/trackback/

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

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

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

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