Основы работы с WordPress: цитата поста

Основы работы с WordPress: цитата поста | n-wp.ru
Описание некоторых приемов работы с цитатой поста - заполнение поля цитаты, вывод, интеграция в тему, ограничение длины.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

В WordPress есть встроенная функция, с помощью которой можно выводить краткий текстовый анонс поста. Эта функция называется цитата. Современные темы все чаще используют цитату поста, давайте и мы рассмотрим основные приемы работы с этой функцией.

Основы работы с WordPress: цитата поста

Поле для ввода текста цитаты поста

Текст цитаты поста можно вставить при создании записи. Для этого нужно активировать текстовое поле для вставки: в настройках экрана нужно отметить чекбокс «Цитата» — появится поле для ввода текста.

[info txt=»Если вы хотите снабдить поле для ввода текста цитаты такими же кнопками, как и в визуальном редакторе, то можете воспользоваться способом Как добавить кнопки визуального редактора в поле редактирования цитат.»]

Интеграция цитаты поста в тему

Большинство современных тем поддерживает работу с цитатами постов. Если же этого нет, но вы хотите выводит цитату поста, то можно внедрить ее вывод в тему. За вывод цитаты поста отвечает функция [code inline=»yes»]. Вы можете заменить стандартный вывод содержимого поста, который производится функцией [code inline=»yes»] на вывод цитаты поста. А можете использовать и гибридный вывод. Например, чтобы в архиве постов определенной категории выводить цитату, а в остальных случая показывать стандартное содержимое, можно использовать такой код:


[info txt=»Обратите внимание на то, что если содержимое цитаты не заполнено, но в теме указано все равно выводить цитату поста, то в качестве текста будет выведен основной текст поста в сокращенном виде. Если же цитата выводится в шаблонах изображений или вложений (за это отвечают файлы image.php и attachment.php), то в качестве цитаты будет отображаться текст описания вложения.»]

Настройка длины текста цитаты и вида ссылки на продолжение поста

По умолчанию цитата поста имеет длину 55 слов. Если вы хотите изменить это значение (например, установить длину цитаты поста в 120 слов), то можно использовать специальный фильтр. Вставьте этот код в файл functions.php используемой вами темы:

function custom_excerpt_length() {
	$length = 120;
	return $length;
}
add_filter('excerpt_length', 'custom_excerpt_length');

Обычно в конце текста цитаты, чтобы показать, что это только краткий анонс, имеющий продолжение, вставляется […]. Если вы хотите убрать эти символы, или заменить их на другие (например, просто на троеточие в обычных скобках (…)), вставьте следующий код в файл functions.php используемой вами темы:

function excerpt_more_text($excerpt) {
	return str_replace('[...]', '(...)', $excerpt); }
add_filter('wp_trim_excerpt', 'excerpt_more_text');

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

function excerpt_more_text($post) {
	return ' <a>ID) . '">'
	. 'читать полностью ...' . '</a>'; }
add_filter('excerpt_more', 'excerpt_more_text');

Нестандартное использование цитаты поста

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

Чтобы шорткоды не попадали в текст цитат поста, можно использовать специальный фильтр. Если вы хотите вывести цитату поста внутри него самого, то можно использовать специальный шорткод.

Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. gilmaster

    Здравствуйте у меня такая проблема..Даже если поле цитата заполнено к посту, в категориях оно все равно выводит часть оригинального поста..

    <div class="post-title"><h2>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title();?><span class="time"> <?php the_time('jS M Y'); ?></span></h2></div>
    			
    
    								<div class="block-content">
    									<?php the_excerpt(); ?>
    								</div>

    Я думаю все дело в functions.php…

    Вот что у меня там:

    /*
    Plugin Name: Excerpt Link Modifier
    Plugin URI: http://aweconsulting.co.uk
    */
    
    function excerpt_link_modifier_install() {
        global $wpdb;
    }
    
    function excerpt_link_modify() {
        if ( '' == $text ) {
            $text = get_the_content('');
    
            $text = strip_shortcodes( $text );
    
            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);
            $words = explode(' ', $text, $excerpt_length + 1);
            if (count($words) > $excerpt_length) {
                array_pop($words);
                array_push($words, '...');
                $text = implode(' ', $words);
            }
        }
        return $text;
    }
    
    register_activation_hook(__FILE__, 'excerpt_link_modifier_install');
    
    add_filter('get_the_excerpt','excerpt_link_modify'); 

    По видимому сделано из плагина..Помогите плиз вывести в категориях текст именно из поля цитата…

    Ответить
  2. gilmaster

    А точнее как применить цитаты только к категориям, а этот код на все остальное…

    Ответить
    1. tiaurus автор

      Не совсем понял, что вы хотите в результате получить? Вы хотите, чтобы на странице архива постов из определенной категории в постах выводилась цитата поста, а во всех остальных местах — часть контента до тега more? Тогда удалите из functions.php Excerpt Link Modifier, вместо него используйте чистый вывод the_excerpt, только вместо

      <?php the_excerpt(); ?>

      используйте код с проверкой условия

      <?php if ( is_category() ) : ?> //если это страница постов категории, то выводить цитату
          <?php the_excerpt(); ?>
      <?php else : ?>
          <?php the_content(); ?>     //иначе выводить контент
      <?php endif; ?> 
      Ответить
      1. gilmaster

        Это я понял как сделать..Я бы хотел что бы посты на главной выводились функцией , допустим 55 первых слов. А категории и архивы из формы цитата..Красиво когда посты одинаково и аккуратно выводятся, тем более не нужно париться с тегом «more». Такая вот задумка..Надеюсь поможете разобраться..Гугл с вопросом не справился))), два дня усиленно искал, все одно и тоже..

        Ответить
        1. tiaurus автор

          Это я понял как сделать..Я бы хотел что бы посты на главной выводились функцией < ?php the_excerpt(); ?>, допустим 55 первых слов. А категории и архивы из формы цитата.

          Вы хотите одно и то же. Функция the_excerpt выводит цитату поста. Если цитаты поста нет (вы не заполнили), то она берет первые насколько слов из основного содержимого поста.
          Я не до конца понял, что же вы хотите увидеть? Вы хотите на главной странице видеть цитаты поста длиной 55 символов, а на других страницах цитаты другой длины?

          Ответить
          1. gilmaster

            У меня везде сейчас стоит < ?php the_excerpt(); ?> и за счет вот этого:

            /*
            Plugin Name: Excerpt Link Modifier
            Plugin URI: http://aweconsulting.co.uk
            */
            
            function excerpt_link_modifier_install() {
                global $wpdb;
            }
            
            function excerpt_link_modify() {
                if ( '' == $text ) {
                    $text = get_the_content('');
            
                    $text = strip_shortcodes( $text );
            
                    $text = apply_filters('the_content', $text);
                    $text = str_replace(']]>', ']]>', $text);
                    $text = strip_tags($text);
                    $excerpt_length = apply_filters('excerpt_length', 55);
                    $words = explode(' ', $text, $excerpt_length + 1);
                    if (count($words) > $excerpt_length) {
                        array_pop($words);
                        array_push($words, '...');
                        $text = implode(' ', $words);
                    }
                }
                return $text;
            }
            
            register_activation_hook(__FILE__, 'excerpt_link_modifier_install');
            
            add_filter('get_the_excerpt','excerpt_link_modify');

            и на главной и в архивах с рубриками выводится 55 первых слов основного текста поста, независимо заполнено поле цитата или нет. То есть если заполняешь цитату, ничего не происходит. Выводится те же 55 первых слов текста поста.. Я бы хотел, что бы на главной все так и осталось, а в архивах и категориях все таки выводилось содержимое из формы с цитатой. Можно как нибудь такое дело организовать?

            Ответить
            1. tiaurus автор

              Закомментируйте 30 и 32 строчку, вот так:

              /* add_filter('get_the_excerpt','excerpt_link_modify'); */

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

              Ответить
  3. gilmaster

    Нельзя ли вот это дело подправить..

    /*
    Plugin Name: Excerpt Link Modifier
    Plugin URI: http://aweconsulting.co.uk
    */
    
    function excerpt_link_modifier_install() {
        global $wpdb;
    }
    
    function excerpt_link_modify() {
        if ( '' == $text ) {
            $text = get_the_content('');
    
            $text = strip_shortcodes( $text );
    
            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);
            $words = explode(' ', $text, $excerpt_length + 1);
            if (count($words) > $excerpt_length) {
                array_pop($words);
                array_push($words, '...');
                $text = implode(' ', $words);
            }
        }
        return $text;
    }
    
    register_activation_hook(__FILE__, 'excerpt_link_modifier_install');
    
    add_filter('get_the_excerpt','excerpt_link_modify');

    Обычный хтмл и ксс я еще могу читать и разбираться, но от такого кода я еще далек..

    Ответить
  4. expojoe

    А как сделать, чтобы в записях, если они содержат вывод «похожих постов» с использованием функции

    <?php the_excerpt(); ?>

    анонсы выводились бы другой длинны, нежели на главной и категориях?

    Ответить
    1. tiaurus автор

      Посмотрите пост Изменение длины цитаты поста в зависимости от категории. Не трудно догадаться, что вместо in_category(10) можно использовать is_home или is_search.

      Ответить
  5. expojoe

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

    Ответить
    1. tiaurus автор

      Можно сократить длину цитаты поста до нужного количества символов, ведь есть PHP-функция mb_substr.

      <?php 
          $excerpt = get_the_excerpt();
          $subex = mb_substr( $excerpt, 0, 150 );
          echo $subex;
      ?>

      150 — количество символов

      Ответить
      1. expojoe

        А как сделать тоже самое, но чтобы обрезалось не по количеству символов, а слов, с многоточием на конце?

        Ответить
        1. tiaurus автор

          Посмотрите плагин Advanced Excerpt. Он умеет:
          — задавать длину цитаты поста в символах или словах (на выбор)
          — добавлять любые символы после цитаты, в том числе и многоточие
          — если нет цитаты поста, то формировать ее из текста поста, при этом вырезая HTML разметку и шорткоды

          Использовать элементарно. Например, вам нужно вывести цитату поста не длиннее 50 слов с многоточием на конце — вставляете в то место, где должна быть цитата поста код

          <?php the_advanced_excerpt('length=50&use_words=1&no_custom=1&ellipsis=%26hellip;&exclude_tags=img,p,strong'); ?>
          Ответить
          1. expojoe

            Большое спасибо за ответы!

            Ответить
  6. atenon

    Здравствуйте. Бьюсь над проблеммой уже 7-ой час, но цитата в шаблоне нкак не выводится. В php полный ноль.
    Необходимо чтобы цитаты выводились в блоках на главной с определенным количеством символов и заканчивались целым словом, а в категориях с другим количеством.
    Но уже согласен и на одинаковое количество, главное чтобы цитаты выводились, а не кусок текста из статьи.

    Для справки: Шаблон Felici
    То, что удалось обнаружить:

    Блок похожий на новостной слайдер в index.php

    echo " <h2 class="custom-font"><a  rel="nofollow">". $helper->getShortenContent(60,strip_shortcodes( get_the_title() )) ."</a></h2>
                      <span>".get_the_time("F j, Y")." - ";
    				  comments_number( 'No Comments', '1 Comment', '% Comments' );
    					echo "</span>  <p>". $helper->getShortenContent(200,strip_shortcodes( strip_tags( get_the_content() ) )) ."</p>";                     
                        echo " <span class="continue "><a  rel="nofollow">".__("Read more")." →</a></span>";

    Пробовал подставлять

    the_advanced_excerpt

    для плагина Advanced Excerpt.Вместо

     ( strip_tags( get_the_content()

    подставил

    strip_tags( the_advanced_excerpt()

    Количество символов в плагине стало регулироваться плагином, но вот цитата все-равно так и не появилась

    На главной есть еще 3 блока разного вида с выводом различных категорий. Но исходник к ним я даже не нашел где можно было по эксперементировать.

    Также нашел такие строчки в category.php

                           <?php  
                            global $more;    // Declare global $more (before the loop).
                            $more = 1;
                            $content = get_the_content('');
                            $content = apply_filters('the_content', $content);
                            $content = str_replace(']]>', ']]>', $content);
                            $helper->shortenContent( 200 ,  strip_tags( $content  ) ); ?>
                           
                           </p>
                            "><?php _e('Read More →', 'h-framework'); ?>
                       </div>

    и также упоминающийся исходник shortcodes.php в functions.php

    $retour.='<h5>'.the_title("","",false).'</h5>';
    			 if($excerpt==true)
    			$retour.= "<p>".$helper->getShortenContent($excerpt_length,strip_tags(get_the_content()))."</p>";
    			 $retour.= "</li>";

    У меня уже опускаются руки Помогите, пожалуйста! Уж очень не хочется менять этот шаблон. Он как нельзя лучше подходит для моего сайта.

    Ответить
  7. atenon

    Проблему частично решил плагином Auto Excerpt everywhere Он стал выводить цитаты, но только в категориях и подсчет идет в символах которые не настраиваются не Auto Excerpt everywhere не Advanced Excerpt, а только здесь

    $helper->shortenContent( 200 ,  strip_tags( $content  ) ); ?>

    Где 200-количество символов. Пробовал в файле shortcodes.php поменять

    getShortenContent($excerpt_length,...())).

    на

    getShortenContent($words,...())).

    но ничего не вышло

    Ответить