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

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

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

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

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

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

  1. Mishuta

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

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

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

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

  4. Vanyata

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

  5. Алексей

    Спасибо! Было бы здорово, если бы еще title не дублировался на этих страницах.

    • Алексей, если я Вас правильно понимаю, то всё делается аналогично:

      [-]
      View Code PHP
      if ((int)$wp_query->get('cpage') == 0) {
      ?>
      <h1 class="posttitle"><a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a></h1>
      <?php
      }
      else {
          // title не показываем
      }
      • Алексей

        Владимир, имел ввиду мета-тег . У Вас на блоге как раз все хорошо, добавляется «страница №». Я для перезаписи заголовков использую приведенную здесь функцию. Она этот случай не учитывает, насколько я понимаю. Вот как туда вставить Ваш код и не соображу. :)

        • Совершенно аналогично :-)

          Перед (или после)

          [-]
          View Code PHP
          if ($paged = get_query_var('paged')) $out = "$out (страница $paged)";

          добавить

          [-]
          View Code PHP
          $cpage = (int)$wp_query->get('cpage');
          if ($cpage) {
              $out .= ' Страница комментариев ' . $cpage;
          }
        • Алексей

          Большое спасибо! Не хотите повесить donation? :)

        • Я бы повесил, но так сложилось, что я в чёрном списке у WebMoney за то, что обвинил их в клевете и прочих вещах (что, впрочем, соответствует действительности).

  6. А ты повесь донейшн через a1pay или робокассу какую-нибудь :)

  7. Разве нет на Я.Деньги?

  8. Алексей

    Действительно работает ;-) Приятно было узнать, что мы с Вами еще и земляки. Спасибо еще раз за помощь.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

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

गते गते पारगते पारसंगते बोधि स्वाहा