web-dev-qa-db-ja.com

The_excerptに改行を含めるにはどうすればいいですか?

抜粋をthe_excerpt内に含めるにはどうすればよいですか。 functions.phpを使って長さとボタンを変更しました。私はすべてのブログエントリにティーザーを使用していますが、改行が含まれていないことが少し醜いように見えることもあります。

4
Nitzki

the_excerpt() によって削除されないように許可タグを設定できるようにするフィルタはありません。おそらくコアの欠点です。

とにかく、実際の抜粋の生成はそのテンプレートタグでは起こりませんが、完全に別の場所で起こります。

抜粋は関数 wp_trim_excerpt() によって生成され、その中にはすでに使用している抜粋フィルタ(excerpt_lengthexcerpt_more)が適用され、 wp_trim_words() が呼び出され、次に wp_strip_all_tags() が呼び出されます。 3つの関数はすべて wp-includes/format.php にあります。

したがって、ケースのフィルタがなく、wp_strip_all_tags()を抜粋して抜粋することが避けられない場合、いくつかのタグを保存する唯一の可能性はwp_trim_excerpt()のカスタム置換関数を追加することです。

function wpse67498_wp_trim_excerpt( $text = '' ) {
    $raw_excerpt = $text;

    if ( '' == $text ) {
        $text = get_the_content( '' );
        $text = strip_shortcodes( $text );
        $text = apply_filters( 'the_content', $text );
        $text = str_replace( ']]>', ']]>', $text );
        $excerpt_length = apply_filters( 'excerpt_length', 55 );
        $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[...]' );

        $allowable = '<br>';
        $text = preg_replace( '@<(script|style)[^>]*?>.*?</\\1>@si', '', $text );
        $text = trim( strip_tags( $text, $allowable ) );

        if ( 'characters' == _x( 'words', 'Word count: words or characters?' )
            && preg_match( '/^utf\-?8$/i', get_option( 'blog_charset' ) ) )
        {
            $text = trim( preg_replace( "/[\n\r\t ]+/", ' ', $text ), ' ' );
            preg_match_all( '/./u', $text, $words_array );
            $words_array = array_slice( $words_array[0], 0, $num_words + 1 );
            $sep = '';
        } else {
            $words_array = preg_split( "/[\n\r\t ]+/", $text, $num_words + 1, PREG_SPLIT_NO_EMPTY );
            $sep = ' ';
        }

        if ( count( $words_array ) > $excerpt_length ) {
            array_pop( $words_array );
            $text = implode( $sep, $words_array );
            $text = $text . $excerpt_more;
        } else {
            $text = implode( $sep, $words_array );
        }
    }

    return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt );
}

remove_filter( 'get_the_excerpt', 'wp_trim_excerpt');
add_filter( 'get_the_excerpt', 'wpse67498_wp_trim_excerpt' );
4
Johannes Pille

Johannes Pilleの解決策と同様に、以下の解決策はより適応的であるべきです。

詳細に:

  • オーバーライド関数 wp_trim_excerpt
  • 古いフィルタを削除して新しいカスタムの新しいフィルタを追加する

これが完全なコードです。

// append to themes/{your_theme}/functions.php

define('EXCERPT_RARELY', '{[}]');
define('EXCERPT_BR', nl2br(PHP_EOL));

function wp_trim_excerpt_custom($text = '')
{
    add_filter('the_content', 'wp_trim_excerpt_custom_mark', 6);

    // get through Origin filter
    $text = wp_trim_excerpt($text);

    remove_filter('the_content', 'wp_trim_excerpt_custom_mark');

    return wp_trim_excerpt_custom_restore($text);
}

function wp_trim_excerpt_custom_mark($text)
{
    $text = nl2br($text);
    return str_replace(EXCERPT_BR, EXCERPT_RARELY, $text);
}

function wp_trim_excerpt_custom_restore($text)
{
    return str_replace(EXCERPT_RARELY, EXCERPT_BR, $text);
}

// remove default filter
remove_filter('get_the_excerpt', 'wp_trim_excerpt');

// add custom filter
add_filter('get_the_excerpt', 'wp_trim_excerpt_custom');
2
Nguyen Van Vinh

現時点では、抜粋を改行付きで表示するためにthe_excerpt()機能を使うことが可能です。しかし、結果を返したい場合は、その目的のために次のような関数を使用できます。

function get_the_excerpt_theme() {
    $excerpt = get_the_excerpt();
    $excerpt = apply_filters( 'the_excerpt', $excerpt );
    return $excerpt;
}

Wp関数apply_filters('the_excerpt', $excerpt )のようにthe_excerpt()を使用して抜粋にフィルタを適用しますが、表示せずに文字列を返します。

また、抜粋で改行のみを許可したい場合は、apply_filters行の下に$excerpt = strip_tags($excerpt,'<br>')を追加できます。

それが役に立てば幸い!

0
user38561

pHPのnl2br()関数を使うこともできます。

echo nl2br(get_the_excerpt());

- または -

nl2br(the_excerpt());
0
mroncetwice