私がやろうとしていること: 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;
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つの正規表現を使用しないでください。テキストを単語の配列に分割します。これは、大量のテキストの場合は非常に遅くなり、メモリが尽きることがあります。
ちょっと戸惑った後、私はこの解決策を見つけました:
$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
を繰り返し呼び出す必要があるので、ページは少し遅くなります。