web-dev-qa-db-ja.com

単語を切り捨てない抜粋

フィルタ を使用して抜粋の長さを制御できることはわかっていますが、それはグローバルに長さを設定します。私の場合、私は3つの異なるページに異なる長さの抜粋を書いています。

これは私が今持っているものです。単語が切り捨てられないように改善したいと思います。

$content_to_excerpt = strip_tags( strip_shortcodes( get_the_content() ) );
$pos = strpos($content_to_excerpt, ' ', 160);
if ($pos !== false) {
 echo  "<p>" . substr($content_to_excerpt, 0, $pos) . "...</p>";
}
1
Eeyore

ロードしているページに基づいてフィルタを動的に設定します。カテゴリアーカイブページに100ワードの抜粋があり、投稿に10ワードの抜粋があり、それ以外の場合はすべてデフォルトが使用されます。

function my_custom_excerpt_length( $orig ) {
    if( is_category() ) {
        return 100;
    } elseif( is_single() ) {
        return 10;
    }

    return $orig;
}
add_filter( 'excerpt_length', 'my_custom_excerpt_length' );

さらに具体的にして、特定のカテゴリに長さを変えることができます。


Rarstに応答して、抜粋を特定の単語数で出力するための新しいテンプレート関数the_excerpt_length()があります。

// Excerpt with a specific number of words, i.e. the_excerpt( 100 );
function the_excerpt_length( $words = null ) { 
    global $_the_excerpt_length_filter;

    if( isset($words) ) { 
        $_the_excerpt_length_filter = $words;
    }   

    add_filter( 'excerpt_length', '_the_excerpt_length_filter' );
    the_excerpt();
    remove_filter( 'excerpt_length', '_the_excerpt_length_filter' );

    // reset the global
    $_the_excerpt_length_filter = null;
}

function _the_excerpt_length_filter( $default ) { 
    global $_the_excerpt_length_filter;

    if( isset($_the_excerpt_length_filter) ) { 
        return $_the_excerpt_length_filter;
    }   

    return $default;
}

これはあなたのテンプレートファイルで使われるでしょう。

<div class="entry">
    <?php the_excerpt_length( 25 ); ?>
</div>
8

私は以前StackOverflowでこの質問を見たことがあることを知っています。 WordPressの抜粋ではありませんが、PHPの文字列を切り捨てることなく切り捨てることについて説明しています。 StackOverflow自体を振り返ってみると、私は このリンク がこの問題に関して非常に役に立ちました。

そこで使用されているコードは次のとおりです。

// Original PHP code by Chirp Internet: www.chirp.com.au
// Please acknowledge use of this code by including this header. 
function myTruncate($string, $limit, $break=".", $pad="...") { 
  // return with no change if string is shorter than $limit
  if(strlen($string) <= $limit) return $string;

  // is $break present between $limit and the end of the string?
  if(false !== ($breakpoint = strpos($string, $break, $limit))) {
    if($breakpoint < strlen($string) - 1) {
      $string = substr($string, 0, $breakpoint) . $pad; 
    } 
  } 
  return $string; 
}

お役に立てれば!

1
Fernando Briano