web-dev-qa-db-ja.com

カスタムget_the_excerpt()は最初の投稿でのみ動作します

私は私のテーマでカスタムget_the_excerpt関数を使います。これはループの最初の投稿に対しては完璧に機能しますが、他の投稿は標準の抜粋関数を使用しています。私はなぜなのか理解していない?

カスタムget_the_excerpt関数

function wpse_allowedtags() {
    // Add custom tags to this string
    return '<br>,<b>,<strong>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<h2>,<h3>,<h4>,<h5>'; 
}

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', function($wpse_excerpt) {
    $raw_excerpt = $wpse_excerpt;

    if ( '' == $wpse_excerpt ) {
        $wpse_excerpt = get_the_content('');
        $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
        $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
        $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
        $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); 

        $excerpt_Word_count = 150;
        $excerpt_length = apply_filters('excerpt_length', $excerpt_Word_count); 
        $tokens = array();
        $excerptOutput = '';
        $count = 0;

        // Divide the string into tokens; HTML tags, or words, followed by any whitespace
        preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

        foreach ($tokens[0] as $token) { 
            if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                // Limit reached, continue until , ; ? . or ! occur at the end
                $excerptOutput .= trim($token);
                break;
            }

            // Add words to complete sentence
            $count++;

            // Append what's left of the token
            $excerptOutput .= $token;
        }

        $wpse_excerpt = trim(force_balance_tags($excerptOutput));

        $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">' 
                . __('[ weiterlesen ]', 'jankosyk') . '</a>'; 
        $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

        $pos = strrpos($wpse_excerpt, '</');
        if ($pos !== false) {
            // Inside last HTML tag
            $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last Word 
        } else {
            // After the content
            $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph 
        }

        return $wpse_excerpt;   

    }
    return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
});

ループ

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <div class="entry"><?php
        if(is_single() || is_page()) {
            ?><h2><?php the_title(); ?></h2><?php
            the_content();
        } else { ?>
            <h2><a href="<?php the_permalink() ?>"><?php
                the_title(); 
            ?></a></h2><?php
            print get_the_excerpt();
        }  
    ?></div><?php
endwhile; ?>

ウェブサイトはここで見つけることができます: https://jankosyk.de/

助言がありますか?

ありがとうございます。


更新:

私は投稿編集画面からの抜粋を使用せず、単に投稿テキストを短くしたいので、自動的に生成されたすべての抜粋を完全に無視して、次の関数を使いました。

function wpse_allowedtags() {
    // Add custom tags to this string
    return '<br>,<b>,<strong>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<h2>,<h3>,<h4>,<h5>'; 
}
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', function() {
    $wpse_excerpt = get_the_content('');
    $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
    $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
    $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
    $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); 

    $excerpt_Word_count = 150;
    $excerpt_length = apply_filters('excerpt_length', $excerpt_Word_count); 
    $tokens = array();
    $excerptOutput = '';
    $count = 0;

    // Divide the string into tokens; HTML tags, or words, followed by any whitespace
    preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

    foreach ($tokens[0] as $token) { 
        if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
            // Limit reached, continue until , ; ? . or ! occur at the end
            $excerptOutput .= trim($token);
            break;
        }

        // Add words to complete sentence
        $count++;

        // Append what's left of the token
        $excerptOutput .= $token;
    }

    $wpse_excerpt = trim(force_balance_tags($excerptOutput));

    $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">' 
            . __('[ weiterlesen ]', 'jankosyk') . '</a>'; 
    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

    $pos = strrpos($wpse_excerpt, '</');
    if ($pos !== false) {
        // Inside last HTML tag
        $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last Word 
    } else {
        // After the content
        $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph 
    }

    return $wpse_excerpt;   
});
1
op_garfield

1つの可能性は、デフォルトの優先度 "10"( "wp_trim_excerpt"関数が実行されているもの)より遅く実行するようにカスタムフィルタを作成することです。

Get_the_excerptフィルタは、抜粋と投稿オブジェクトを渡します。それで、あなたはより高い優先順位であなたのフィルタを走らせることができるべきであり、それはすでに別のフィルタを通過しているので、渡された抜粋の代わりにpostオブジェクトからの抜粋値を使うべきです。

優先度と引数の値を明確にするために、元の関数を無名関数から変更しました。

// Running this filter at priority 20 so it comes later than wp_trim_excerpt()
add_filter( 'get_the_excerpt', 'my_later_excerpt', 20, 2 );
function my_later_excerpt( $possibly_filtered_excerpt , $post_obj ) {

    /*
     * Rather than change every instance of $wpse_excerpt in your
     * function, I changed the argument to $possibly_filtered_excerpt
     * and ignored it. Then set the $wpse_excerpt value to the 
     * excerpt contained in the post object ($post_obj->post_excerpt)
     */
    $wpse_excerpt = $post_obj->post_excerpt;

    $raw_excerpt = $wpse_excerpt;

    if ( '' == $wpse_excerpt ) {
        $wpse_excerpt = get_the_content('');
        $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
        $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
        $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
        $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); 

        $excerpt_Word_count = 150;
        $excerpt_length = apply_filters('excerpt_length', $excerpt_Word_count); 
        $tokens = array();
        $excerptOutput = '';
        $count = 0;

        // Divide the string into tokens; HTML tags, or words, followed by any whitespace
        preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

        foreach ($tokens[0] as $token) { 
            if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                // Limit reached, continue until , ; ? . or ! occur at the end
                $excerptOutput .= trim($token);
                break;
            }

            // Add words to complete sentence
            $count++;

            // Append what's left of the token
            $excerptOutput .= $token;
        }

        $wpse_excerpt = trim(force_balance_tags($excerptOutput));

        $excerpt_end = '&nbsp;…&nbsp;<a href="'. esc_url( get_permalink() ) . '">' 
                . __('[ weiterlesen ]', 'jankosyk') . '</a>'; 
        $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

        $pos = strrpos($wpse_excerpt, '</');
        if ($pos !== false) {
            // Inside last HTML tag
            $wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); // Add read more next to last Word 
        } else {
            // After the content
            $wpse_excerpt .= $excerpt_more; // Add read more in new paragraph 
        }

        return $wpse_excerpt;   

    }
    return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
}
0
butlerblog