Устанавливаем в WP excerpt нужное количество слов и текст more

В WP есть такая интересная функция — the_excerpt (или get_the_excerpt, которая не выводит значение, а передаёт). Суть её в том, что она возвращает не весь пост с форматированием (или его начало, ограниченное тегом more), как функция the_content, а выводит цитату к посту. А если поле «цитата» у поста не заполнено, то выводится 55 первых слов поста без форматирования, оканчивающихся набором символов […] и заключённых в тег абзаца. Вот как раз такое поведение функции мы сейчас и победим. Т.е. заставим функцию выводить заданное количество слов с заданным текстом «more», и сами заключим в любой тег, хоть в тег элемента списка li.

Но сначала короткая заметка для тех, кто не нашёл, где заполняются цитаты к постам. В админке WP в редакторе постов есть для этого специальное поле «цитата»:

цитата

А если у вас его нет, то включить его можно в настройках экрана (в самом верху экрана нажать «Настройки экрана»):

включение цитаты

В «цитате» можно написать в кратце, о чём ваш пост или вставить в это поле интригующую цитату из поста, чтобы заинтересовать посетителя вашего сайта прочитать весь текст поста. А теперь приступим к реализации поставленной задачи.

В качестве реализации я написал функцию (точнее, пару), которую вы можете вставить в файл function.php или подключить в качестве плагина:

echo pavluha_excerpt( '10', '... Продолжение следует' );

Такой вызов функции выведет в заданном месте (в случае отсутствия цитаты у поста) 10 первых слов поста (без форматирования), оканчивающихся фразой «... Продолжение следует». Созданные мной функции и глобальные переменные начинаются с «pavluha_» по двум причинам:

  • чтобы сразу видеть, что объявил я, а что использовал из набора функций WP;
  • чтобы случайно не использовать то имя функции или глобальной переменной, которое используется в движке WP или в одном из подключенных плагинов.

Если вам не нравится, можете переименовать. А вот и код, который нужен для работоспособности указанной выше инструкции:

###
## Вывод excerpt с определённым к-вом слов и строкой more
## Например: echo pavluha_excerpt( '10', '... Продолжение следует' );
#
function pavluha_excerpt_filter( $s ) {
	global $pavluha_excerpt_array;
	$si = @ array_shift ($pavluha_excerpt_array);
	return $si ? $si : $s;
}
function pavluha_excerpt( $length = '', $more = '' ) {
	global $post;
	global $pavluha_excerpt_array;
	$pavluha_excerpt_array = array( $length, $more );
	add_filter( 'excerpt_length', 'pavluha_excerpt_filter' );
	add_filter( 'excerpt_more', 'pavluha_excerpt_filter' );
	return get_the_excerpt();
}

Если на одних страницах вы хотите выводить первые 10 слов из постов, оканчивающихся фразой «... Продолжение следует», а в другом месте хотите выводить 20 слов и ссылку на пост с анкором «Далее», то во втором случае инструкцию следует вызвать так:

echo pavluha_excerpt( '20', '... <a href="'.get_permalink().'">Далее</a>' );

Что нужно понимать для применения моей модификации WP excerpt

  • Опубликованные выше куски кода — это PHP-код.
  • Нельзя редактировать файлы шаблонов WP в стандартном блокноте Windows и любом другом, не умеющем работать в кодировке UTF-8 без метки BOM.
  • Функция pavluha_excerpt() должна быть вызвана после функции the_post() (которая меняет содержимое глобальной переменной $post), чтобы вывести цитату текущего поста (т.е. вам нужно понимать, что имеется ввиду в этом пункте).

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

Для продвинутых

Я люблю писать элегантные коды, но этот получился не особо элегантным. Дело в том, что для задания фильтра посредством add_filter() можно использовать только имя своей функции, но нельзя передать свои параметры. И в данном случае (для корректировки excerpt_length и excerpt_more) наша функция получает только один аргумент — текущее значение excerpt_length или excerpt_more. Как нашей функции передать новое значение, интересующее нас? Я имею ввиду, что функция должна быть универсальной, а не тупо в любом случае возвращать одно и то же значение, прописанное в самой функции.

Я использовал для этой задачи глобальную переменную $pavluha_excerpt_array, из которой значения брал по порядку — в том порядке, в котором я задаю фильтры. Лучше я ничего не мог придумать. Может, вы мне подскажете более красивое решение?

Запись опубликована в рубрике Web-мастеринг с метками , . Короткая ссылка для добавления в закладки: Устанавливаем в WP excerpt нужное количество слов и текст more.

7 Responses

  1. Алексей Ершов говорит:

    Все-таки, какое полезное занятие — блоговедение! Каждый день узнаешь что-то новое. Никогда не обращал внимание на настройки экрана в админке, и до сегодняшнего дня не знал про цитату =)

  2. Алексей Ершов говорит:

    Павлуха, скажи мне, как ты попадаешь в прямой эфир к Терехову? У тебя где-то есть ссылка на него?

    • Павлуха говорит:

      Да, Алексей, ссылка есть — в RSS

      • Алексей Ершов говорит:

        Увидел. ХитрО!

        • Павлуха говорит:

          Спасибо, но не очень хитрО. Вот такие как я и сгубили тему прямых эфиров :)

          • Алексей Ершов говорит:

            Почему сгубили? Эфиры ж присутствуют у таких топ-блоггеров как Девака, Терехов, Шакин...

            Видимо двум сторонам хорошо от этого, иначе б их убрали =)

          • Павлуха говорит:

            У Шакина уже не вижу этого блока, у Деваки блок на жаваскрипте работает — разве что одного случайного посетителя получишь. Терехов единственный, кому пофиг на спам

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

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

Иногда ваш комментарий может не отобразиться сразу после публикации - будто пропал. Не волнуйтесь, он не пропадёт и появится потом, после моего одобрения.