Устанавливаем в 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, из которой значения брал по порядку — в том порядке, в котором я задаю фильтры. Лучше я ничего не мог придумать. Может, вы мне подскажете более красивое решение?
7 ответов к “Устанавливаем в WP excerpt нужное количество слов и текст more”
Все-таки, какое полезное занятие — блоговедение! Каждый день узнаешь что-то новое. Никогда не обращал внимание на настройки экрана в админке, и до сегодняшнего дня не знал про цитату
Павлуха, скажи мне, как ты попадаешь в прямой эфир к Терехову? У тебя где-то есть ссылка на него?
Да, Алексей, ссылка есть — в RSS
Увидел. ХитрО!
Спасибо, но не очень хитрО. Вот такие как я и сгубили тему прямых эфиров
Почему сгубили? Эфиры ж присутствуют у таких топ-блоггеров как Девака, Терехов, Шакин...
Видимо двум сторонам хорошо от этого, иначе б их убрали
У Шакина уже не вижу этого блока, у Деваки блок на жаваскрипте работает — разве что одного случайного посетителя получишь. Терехов единственный, кому пофиг на спам