Как контролировать длину выдержки вручную?


У меня есть веб-сайт, на котором мне нужно контролировать отображаемую длину отрывка. В некоторых сообщениях может быть выдержка вручную, поэтому я не могу использовать фильтр excerpt_length.

Я, конечно, могу использовать какой-нибудь substr(), но искал более элегантное решение (если таковое существует).

 6
Author: Pat J, 2011-01-04

6 answers

Взгляните на мой ответ здесь: Лучшая коллекция кода для вашего functions.php файл

Если я правильно понял ваш вопрос, он делает то, что вы ищете.

Поместите это в functions.php:

function excerpt($num) {
    $limit = $num+1;
    $excerpt = explode(' ', get_the_excerpt(), $limit);
    array_pop($excerpt);
    $excerpt = implode(" ",$excerpt)."... (<a href='" .get_permalink($post->ID) ." '>Read more</a>)";
    echo $excerpt;
}

Затем в своей теме используйте код <?php excerpt('22'); ?>, чтобы ограничить отрывок 22 символами.

:)

 6
Author: Martin-Al, 2017-04-13 12:37:50

С последней версией Wordpress (v.3.3.0+) вы действительно можете использовать wp_trim_words.

function excerpt($limit) {
    return wp_trim_words(get_the_excerpt(), $limit);
}

См. также: https://stackoverflow.com/a/17177847/851045

 6
Author: Giraldi, 2017-05-23 11:33:33

Я бы сказал, просто посмотрите, как это делает core: http://phpxref.ftwr.co.uk/wordpress/wp-includes/formatting.php.source.html#l1840

Я взял на себя смелость поместить код здесь для удобства копирования и вставки.

global $post;
if( empty($post->post_excerpt) ){
  $text = apply_filters( 'the_excerpt', get_the_excerpt() );
} else {
  $text = $post->post_excerpt;
  $text = strip_shortcodes( $text );
  $text = apply_filters('the_content', $text);
  $text = str_replace(']]>', ']]&gt;', $text);
  $text = strip_tags($text);
  $excerpt_length = apply_filters('excerpt_length', 55);
  $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
  $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
  if ( count($words) > $excerpt_length ) {
    array_pop($words);
    $text = implode(' ', $words);
    $text = $text . $excerpt_more;
  } else {
    $text = implode(' ', $words);
  }
}
 1
Author: John P Bloch, 2011-01-04 14:27:22

Просто это можно сделать, как показано ниже.

function custom_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Ссылка: Кодекс

 1
Author: Ibnul Hasan, 2015-03-13 05:38:07

Попробуйте это: Вы можете контролировать количество слов, выводимых отрывком, с помощью фильтра "длина отрывка" ниже приведены несколько примеров того, как вы можете контролировать размер в зависимости от различных условий

add_filter( 'excerpt_length', 'new_excerpt_length' );
function new_excerpt_length( $more ) {
    if(is_front_page()){
        if(has_post_thumbnail()){
            return 15;
        } else {
            return 45;
        }
    } else {
        return 100;
    }
}

РЕДАКТИРОВАТЬ: Дерьмо, я только что заметил, что вы сказали, что подход с фильтром не подходит. ну что ж, это для других людей, которые попадают сюда через Google и хотят этого тогда.

 0
Author: Infinity Media, 2013-06-23 22:22:55

Введите этот код в свой functions.php

/* easy excerpt limitation
*/
function
easy_excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt);
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('`[[^]]*]`','',$excerpt);
return $excerpt;
} 

И используйте echo easy excerpt(mylimit) вместо the_excerpt()
Это прекрасно работает.

 -1
Author: rudro, 2015-10-08 19:38:08