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

Основы работы с WordPress: цитата поста | n-wp.ru

В 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 ' ID) . '">'
	. 'читать полностью ...' . ''; }
add_filter('excerpt_more', 'excerpt_more_text');

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

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

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

Автор tiaurus 2182 Articles
Являюсь создателем n-wp.ru — блога о WordPress для новичков. Мне интересно многое, поэтому еще я сделал 123-box.ru — блог о программах для Windows, и tiaurus.info — блог о красоте.

17 Комментарии

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

    < ?php the_title();?> < ?php the_time('jS M Y'); ?>

    < ?php the_excerpt(); ?>

    Я думаю все дело в 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'); 

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

    • Не совсем понял, что вы хотите в результате получить? Вы хотите, чтобы на странице архива постов из определенной категории в постах выводилась цитата поста, а во всех остальных местах – часть контента до тега 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; ?> 
      • Это я понял как сделать..Я бы хотел что бы посты на главной выводились функцией < ?php the_excerpt(); ?>, допустим 55 первых слов. А категории и архивы из формы цитата..Красиво когда посты одинаково и аккуратно выводятся, тем более не нужно париться с тегом “more”. Такая вот задумка..Надеюсь поможете разобраться..Гугл с вопросом не справился))), два дня усиленно искал, все одно и тоже..

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

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

          • У меня везде сейчас стоит < ?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 первых слов текста поста.. Я бы хотел, что бы на главной все так и осталось, а в архивах и категориях все таки выводилось содержимое из формы с цитатой. Можно как нибудь такое дело организовать?

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

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

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

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

    /*
    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');

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

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

    < ?php the_excerpt(); ?>

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

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

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

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

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

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

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

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

          < ?php the_advanced_excerpt('length=50&use_words=1&no_custom=1&ellipsis=%26hellip;&exclude_tags=img,p,strong'); ?>
  5. Здравствуйте. Бьюсь над проблеммой уже 7-ой час, но цитата в шаблоне нкак не выводится. В php полный ноль.
    Необходимо чтобы цитаты выводились в блоках на главной с определенным количеством символов и заканчивались целым словом, а в категориях с другим количеством.
    Но уже согласен и на одинаковое количество, главное чтобы цитаты выводились, а не кусок текста из статьи.

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

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

    echo " 

    ". $helper->getShortenContent(60,strip_shortcodes( get_the_title() )) ."

    ".get_the_time("F j, Y")." - "; comments_number( 'No Comments', '1 Comment', '% Comments' ); echo "

    ". $helper->getShortenContent(200,strip_shortcodes( strip_tags( get_the_content() ) )) ."

    "; echo " ".__("Read more")." →";

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

    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  ) ); ?>
                           
                           
                            < ?php _e('Read More →', 'h-framework'); ?>
                       

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

    $retour.='
    '.the_title("","",false).'
    '; if($excerpt==true) $retour.= "

    ".$helper->getShortenContent($excerpt_length,strip_tags(get_the_content()))."

    "; $retour.= "";

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

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

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

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

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

    на

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

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

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*