web-dev-qa-db-ja.com

The_excerptを最大x文字に制限する

私がやろうとしていること:
the_excerptを表示したいのですが、the_excerptが使用できる最大x文字を使用していますが、Wordのいくつかの文字(単語全体のみ)を表示したくはありません。

さらに詳しい情報:
このコードは、アーカイブ、カテゴリ、フロントページ、検索など、単一ではない/固定リンクのWebページにあるため、<!--more-->を使用できません。

コード:
これは私が使うコードです:

add_filter( 'excerpt_length', function( ) {
    return 20;
} );

if ( have_posts() ):
    while( have_posts() ): the_post();
        the_excerpt( );
    endwhile;
endif;
1
Mike Madern
add_filter('wp_trim_excerpt', function($text){    
   $max_length = 140;

   if(mb_strlen($text, 'UTF-8') > $max_length){
     $split_pos = mb_strpos(wordwrap($text, $max_length), "\n", 0, 'UTF-8');
     $text = mb_substr($text, 0, $split_pos, 'UTF-8');
   }

   return $text;
});

これはあなたの最大長を考慮に入れそして最も近いワード境界でテキストを分割するべきです。フィルタを適用し、テンプレート内でthe_excerpt();を呼び出します。


WP 3.3から wp_trim_words 関数を使うこともできますが、ソースからは非常に非効率的に見えます。 3つの正規表現を使用しないでください。テキストを単語の配列に分割します。これは、大量のテキストの場合は非常に遅くなり、メモリが尽きることがあります。

1
onetrickpony

ちょっと戸惑った後、私はこの解決策を見つけました:

$limit_characters = 120;

function new_excerpt_length( ) {
    global $length;
    return $length;
}

function get_the_excerpt_special( ) {
    global $limit_characters, $length;

    if(strlen( get_the_excerpt() ) > $limit_characters ) {
        $length--;
        return get_the_excerpt_special();
    } else {
        the_excerpt();
    }
}

if ( have_posts() ):
    while( have_posts() ): the_post();
        add_filter( 'excerpt_length', 'new_excerpt_length' );

        $length = 20;
        get_the_excerpt_special( );

        remove_filter( 'excerpt_length', 'new_excerpt_length' );

    endwhile;
endif;

できます!わーい!しかしget_the_excerptを繰り返し呼び出す必要があるので、ページは少し遅くなります。

0
Mike Madern