Вордпресс. Автоматическое обрезание поста.

Продолжаю тему о изменении вывода постов, начатую в прежней записи о расположении постов колонками.

Тут будут несколько процедур и функций, позволяющих изменить вывод текста на главной странице, в рубриках и архивах.

Для начала:

— Находим файл отвечающий за вывод постов. Это обычно 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


VN:F [1.9.14_1148]
Rating: 7.0/10 (3 votes cast)
Вордпресс. Автоматическое обрезание поста., 7.0 out of 10 based on 3 ratings

4 thoughts on “Вордпресс. Автоматическое обрезание поста.

  1. Очень практичная статья, но к сожалению ни в одном файле темы не смог найти $text = substr
    А тег more выводится частично хорошо, а частично знаки вопроса. Только если вручную в записи вбиваю другой текст(например»читать далее») то только так получается избавиться от ошибки кодировки.

  2. $text = substr, это кусок из функции, а не вордпресса.
    Но вы правы я перемудрил с кодом.

    Поправлю.

  3. Поправил и проверил.
    Вывел отдельно куском готовый текст. Если не сработает, пишите.

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

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

Спoнcopcкиe ссылки

Детальное описание HoReCa тут.