Bagaimana cara mengakhiri kutipan dengan kalimat daripada kata?

15

Berikut adalah kutipan posting di halaman rumah saya. Saya ingin mengakhiri kutipan dengan kalimat. Dalam hal ini adalah peluang. ' Saya tahu cara memodifikasi panjang tetapi tidak akan melakukan apa yang saya inginkan.

masukkan deskripsi gambar di sini

Berikut ini kutipan dari situs web lain. Di sini Anda melihat kutipan berakhir dengan kalimat yang tepat tidak seperti di atas yang berakhir dengan kata pertama dari kalimat berikutnya 'Secara proaktif'.

masukkan deskripsi gambar di sini

Setelah Menerapkan solusi oleh GM : -

masukkan deskripsi gambar di sini

Mohit
sumber
Tolong jelaskan masalah Anda lebih baik dari itu. Dari jawaban dan komentar mereka, sulit untuk memahami apa yang ingin Anda capai.
kaiser
@kaiser Saya telah memperbarui detailnya.
Mohit
@Mohit sudahkah Anda mencoba kode saya?
gmazzap
Ya, kutipan diakhiri dengan kalimat tetapi 'Read More' hilang.
Mohit
@ GM Baiklah saya harus menambahkan lebih banyak baca sebagai gantinya.
Mohit

Jawaban:

13

Ini membutuhkan PHP 5.3+ (WP membutuhkan PHP 5.2.4+)

add_filter('get_the_excerpt', 'end_with_sentence');

function end_with_sentence($excerpt) {
  $allowed_end = array('.', '!', '?', '...');
  $exc = explode( ' ', $excerpt );
  $found = false;
  $last = '';
  while ( ! $found && ! empty($exc) ) { 
    $last = array_pop($exc);
    $end = strrev( $last );
    $found = in_array( $end{0}, $allowed_end );
  }
  return (! empty($exc)) ? $excerpt : rtrim(implode(' ', $exc) . ' ' .$last);
}

Edit

Setelah komentar @iser saya mencoba menjalankan ini pada save / update untuk mencegah halaman melambat pada menampilkan banyak posting. Ini harus diuji

add_filter('wp_insert_post_data', 'end_with_sentence_on_save', 20, 2);

function end_with_sentence_on_save($data, $postarr) {
  if ( ! empty( $data['post_content'] ) && $data['post_status'] != 'inherit' && $data['post_status'] != 'trash' ) {
    $text = strip_shortcodes( $data['post_content'] );
    $text = apply_filters('the_content', $text );
    $text = str_replace(']]>', ']]>', $text );
    $excerpt_length = apply_filters('excerpt_length', 55);
    $data['post_excerpt'] = wp_trim_words($text, $excerpt_length, '');
  } else {
    return $data;
  }
  $allowed_end = array('.', '!', '?', '...');
  $exc = explode(' ', $data['post_excerpt']);
  $found = false;
  $last = '';
  while ( ! $found && ! empty($exc) ) { 
    $last = array_pop($exc);
    $end = strrev( $last );
    $found = in_array( $end{0}, $allowed_end );
  }
  if (! empty($exc)) $data['post_excerpt'] = rtrim(implode(' ', $exc) . ' ' .$last);
  return $data; 
}
gmazzap
sumber
1
yakin tentang itu $end{0}:? Btw, Anda bisa saja kembali atau breakketika sesuatu ditemukan. Catatan tambahan: Mungkin lebih baik ketika menyimpan posting, jadi itu tidak dibuat ulang selama runtime, yang bisa sangat lambat jika Anda menampilkan banyak posting.
kaiser
@kaiser cite: Strings juga dapat diakses menggunakan kawat gigi, seperti pada $ str {42}, untuk tujuan yang sama. php.net docs Untuk menemukan sesuatu, saya harus mencari karakter terakhir dari string terakhir. Menggunakan $foundsaya memutus siklus dan memeriksa string terakhir, jadi tidak perlu break.
gmazzap
Benar-benar merindukan bahwa itu adalah whilepemeriksaan false. +1
kaiser
@kaiser +1 untuk bagian kedua dari komentar Anda, sekarang saya mengedit kode untuk dijalankan pada save
gmazzap
1
Tentu @ jessica adalah hasil edit yang buruk (dalam versi aslinya tidak masalah). Terima kasih sudah diperbaiki.
gmazzap
2

Ini versi saya, menyimpan semua tag html dan juga memotong konten setelah kata terakhir dalam sebuah kalimat

if ( ! function_exists( 'pietergoosen_custom_wp_trim_excerpt' ) ) : 

    function pietergoosen_custom_wp_trim_excerpt($pietergoosen_excerpt) {
    global $post;
    $raw_excerpt = $pietergoosen_excerpt;
        if ( '' == $pietergoosen_excerpt ) {

            $pietergoosen_excerpt = get_the_content('');
            $pietergoosen_excerpt = strip_shortcodes( $pietergoosen_excerpt );
            $pietergoosen_excerpt = apply_filters('the_content', $pietergoosen_excerpt);
            $pietergoosen_excerpt = str_replace(']]>', ']]>', $pietergoosen_excerpt);

            //Set the excerpt word count and only break after sentence is complete.
                $excerpt_word_count = 75;
                $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', $pietergoosen_excerpt, $tokens);

                foreach ($tokens[0] as $token) { 

                    if ($count >= $excerpt_word_count && 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;
                }

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

                $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
                $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

                //$pos = strrpos($pietergoosen_excerpt, '</');
                //if ($pos !== false)
                // Inside last HTML tag
                //$pietergoosen_excerpt = substr_replace($pietergoosen_excerpt, $excerpt_end, $pos, 0);
                //else
                // After the content
                $pietergoosen_excerpt .= $excerpt_end;

            return $pietergoosen_excerpt;   

        }
        return apply_filters('pietergoosen_custom_wp_trim_excerpt', $pietergoosen_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'pietergoosen_custom_wp_trim_excerpt'); 
Pieter Goosen
sumber
0

Untuk berjaga-jaga seandainya seseorang menggunakan jawaban, kata nasihat: Ini akan merusak Bidang Kustom Lanjutan. ACF juga memanggil wp_insert_post_datasaat membuat atau memperbarui bidang, tetapi $datavariabelnya tidak sama, dan akan menghasilkan nama bidang ACF menjadi omong kosong yang tidak dapat dibaca, yang mengakibatkan tidak dapat menggunakan bidang tersebut.

Eetu Purtonen
sumber