Продолжаю тему о изменении вывода постов, начатую в прежней записи о расположении постов колонками.
Тут будут несколько процедур и функций, позволяющих изменить вывод текста на главной странице, в рубриках и архивах.
Для начала:
— Находим файл отвечающий за вывод постов. Это обычно index.php для главной, arhive.php для архивов, category.php для рубрик. Если какого-то из файлов нет, то обычно его заменяет все тот же index.php
— Там ищем строчку the_content или the_excerpt. Это похожи функции отвечающие за вывод поста. В вашем шаблоне уже может быть настроен какой-то совсем заковыристый вывод и использована другая процедура. Но мы будем ориентироваться на более стандартные варианты.
1) Итак the_content(); Выводит текст поста до тега more. Выводит вместе с тегами, поэтому могут возникать некрасивости если где-то тег не закрыт или картинка «рвет дизайн». Наиболее распространенный вывод.
В скобках можно задать анкор для ссылки, приглашающей прочитать весь пост.
Например
the_content('Читать полностью »'); |
2) Вариант с the_excerpt(); уже интересней и дает простор для настройки.
Суть функции в том, что она выводит первые 55 слов. Теги режутся. Удобно, когда тег more находится далеко от начала или вообще отсутствует.
Иногда нужно не 55 слов, а больше или меньше.
Для этого в файле functions.php нашего шаблона нужно вставить код:
<?php function new_excerpt_length($length) { return 77; } add_filter('excerpt_length', 'new_excerpt_length'); ?> |
Где 77, это новое количество слов.
Правда эта функция не создает ссылку «читать далее», но и тут нет сложностей.
Все в том же файле функция втыкаем код:
<?php function new_excerpt_more($more) { return '<a href="'. get_permalink($post-->ID) . '" >' . ' читать далее' . ''; } add_filter('excerpt_more', 'new_excerpt_more'); ?> |
3) Еще мне в одном шаблоне попалась функция, выводящая ограниченное число символов, а не слов.
Ее тоже скину.
Во все тот же файл функций кидаем код
function print_excerpt($length) { // Max excerpt length. Length is set in characters global $post; $text = $post->post_excerpt; if ( '' == $text ) { $text = get_the_content(''); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); } $text = strip_shortcodes($text); // optional, recommended $text = strip_tags($text); // use ' $text = strip_tags($text,'<p><a>'); ' if you want to keep some tags $text = mb_substr($text,0,$length,'utf-8'); $excerpt = reverse_strrchr($text, '.', 1); if( $excerpt ) { echo apply_filters('the_excerpt',$excerpt); } else { echo apply_filters('the_excerpt',$text); } } |
И потом вместо the_content(); вызываем print_excerpt(500);
Где 500 — это количество символов.
Хочу заметить, что пока я разбирался с этим постом и искал примеры решений, я наткнулся на нескольких сайтах на ту же функцию, что написал выше. Но те люди просто скопировали с англоязычных ресурсов и в их коде ОШИБКА.
Я объясню. Я поменял строку
$text = substr($text,0,$length); |
на
$text = mbstring($text,0,$length); |
Дело в том, что функция substr неверно работает если дело касается связки utf-8 + кириллица. Она может выдавать на конце строки всякие артефакты.
Чтобы этого не было нужно использовать mbstring вместо substr, что я и сделал.
ОДНАКО mbstring может быть не включена в пыхе, поэтому я нашел в инете еще один маленький хак.
Ставим все в том же файле функций функцию
function myutf8_substr2($str,$from,$len){ # utf8 substr return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1',$str); } |
и в коде меняем
$text = substr($text,0,$length); |
на
$text = myutf8_substr2($text,0,$length); |
В итоге, для тех, кто не разобрался приведу готовый код:
function myutf8_substr2($str,$from,$len){ # utf8 substr return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', '$1',$str); } function print_excerpt($length) { // Max excerpt length. Length is set in characters global $post; $text = $post->post_excerpt; if ( '' == $text ) { $text = get_the_content(''); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); } $text = strip_shortcodes($text); // optional, recommended $text = strip_tags($text); // use ' $text = strip_tags($text,'<p><a>'); ' if you want to keep some tags $text = myutf8_substr2($text,0,$length,'utf-8'); $excerpt = reverse_strrchr($text, '.', 1); if( $excerpt ) { echo apply_filters('the_excerpt',$excerpt); } else { echo apply_filters('the_excerpt',$text); } } |
И еще немного о этом выводе. Код выводит аккуратные предложения, не разрезая их на полу слове. Однако если нужно четкое деление по символам, то просто поменяйте строку
$excerpt = reverse_strrchr($text, '.', 1); |
на
//$excerpt = reverse_strrchr($text, '.', 1); |
И уже последнее уточнение к этой функции. Она берет текст через функцию get_the_content, а значит понимает тег more и если ограничение по символам выходит за рамки тега, то текст все равно ограничивается тегом.
__
В заключительной статье будет работа с картинками. Хочу в придачу к тому, что уже знаю, разобраться еще с одним кодом.
Автор: Elsper.ru
Очень практичная статья, но к сожалению ни в одном файле темы не смог найти $text = substr
А тег more выводится частично хорошо, а частично знаки вопроса. Только если вручную в записи вбиваю другой текст(например»читать далее») то только так получается избавиться от ошибки кодировки.
$text = substr, это кусок из функции, а не вордпресса.
Но вы правы я перемудрил с кодом.
Поправлю.
Поправил и проверил.
Вывел отдельно куском готовый текст. Если не сработает, пишите.
Спасибо, помогло!!!