wp cod

Обрезать текст в поиске и статьях но оставить (читать далее) wordpress

Бывает так что нужно обрезать текст в привьюшках но нужно чтобы осталась и кнопка «читать далее». Как это сделать описано далее.

Я сам сталкивался с подобным. Бывает что либо не сделал тег читать далее, или был перенос сайта, и страниц слишком много чтобы их переделывать, а в блоге либо в поиске сайта wordpress не смотрятся полные записи. 

Так во чтобы сократить текст или отобразить описание статьи или страницы нужно всего лиш вставить в functions.php вашей темы следующий хук.

 

/**
 начало хука
 */
function kama_excerpt( $args = '' ){
	global $post;

	if( is_string($args) )
		parse_str( $args, $args );

	$rg = (object) array_merge( array(
		'maxchar'     => 350,   // Макс. количество символов которые будут выводится.
		'text'        => '',    // Какой текст обрезать (по умолчанию post_excerpt, если нет post_content.
)
								// Если в тексте есть `<!--more-->`, то `maxchar` игнорируется и берется
								// все до <!--more--> вместе с HTML.
		'autop'       => true,  // Заменить переносы строк на <p> и <br> или нет?
		'save_tags'   => '',    // Теги, которые нужно оставить в тексте, например '<strong><b><a>'.
		'more_text'   => 'Читать дальше...', // Текст кнопки `Читать дальше`.
		'ignore_more' => false, // нужно ли игнорировать <!--more--> в контенте
	), $args );

	$rg = apply_filters( 'kama_excerpt_args', $rg );

	if( ! $rg->text )
		$rg->text = $post->post_excerpt ?: $post->post_content;

	$text = $rg->text;
	// убираем блочные шорткоды: [foo]some data[/foo]. Учитывает markdown
	$text = preg_replace( '~[([a-z0-9_-]+)[^]]*](?!().*?[/1]~is', '', $text );
	// убираем шоткоды: [singlepic id=3]. Учитывает markdown
	$text = preg_replace( '~[/?[^]]*](?!()~', '', $text );
	$text = trim( $text );

	// <!--more-->
	if( ! $rg->ignore_more  &&  strpos( $text, '<!--more-->') ){
		preg_match('/(.*)<!--more-->/s', $text, $mm );

		$text = trim( $mm[1] );

		$text_append = ' <a href="'. get_permalink( $post ) .'#more-'. $post->ID .'">'. $rg->more_text .'</a>';
	}
	// text, excerpt, content
	else {
		$text = trim( strip_tags($text, $rg->save_tags) );

		// Обрезаем
		if( mb_strlen($text) > $rg->maxchar ){
			$text = mb_substr( $text, 0, $rg->maxchar );
			$text = preg_replace( '~(.*)s[^s]*$~s', '1...', $text ); // кил последнее слово, оно 99% неполное
		}
	}

	// сохраняем переносы строк. Упрощенный аналог wpautop()
	if( $rg->autop ){
		$text = preg_replace(
			array("/r/", "/n{2,}/", "/n/",   '~</p><br ?/?>~'),
			array('',     '</p><p>',  '<br />', '</p>'),
			$text
		);
	}

	$text = apply_filters( 'kama_excerpt', $text, $rg );

	if( isset($text_append) )
		$text .= $text_append;

	return ( $rg->autop && $text ) ? "<p>$text</p>" : $text;
}
/* Конец хука*/

Как работает Хук

  1. Обрезка до количества необходимых символов. Указывается в параметре maxchar.

  2. Понимает тег <!—more—> в записи. Если <!—more—> присутствует тогда выводится привью статьи как обычно, с сохранением HTML разметки.

  3. Можно указать сохранять переносы строк или писать весь текст в одну строку. По умолчанию переносы сохраняются, если нужен сплошной текс ставим параметр autop=0.

  4. Можно указан какие HTML теги не нужно удалять, например мы хотим оставить тег stront или em, тогда указываем их в параметре save_tagssave_tags=<strong><em>

  5. Также, можно использовать функцию, чтобы обрезать любой текст, который ей будет передан через параметр text.

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

2+
Поделитесь информацией с другими:

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

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