Làm thế nào để kết thúc đoạn trích bằng một câu chứ không phải một từ?


15

Đây là đoạn trích của bài viết trên trang chủ của tôi. Tôi muốn kết thúc đoạn trích bằng một câu. Trong trường hợp này, đó là 'cơ hội. '. Tôi biết cách sửa đổi độ dài nhưng nó sẽ không làm những gì tôi muốn.

nhập mô tả hình ảnh ở đây

Đây là đoạn trích từ trang web khác. Ở đây bạn thấy đoạn trích kết thúc bằng một câu thích hợp không giống như ở trên kết thúc bằng từ đầu tiên của câu tiếp theo 'Chủ động'.

nhập mô tả hình ảnh ở đây

Sau khi triển khai giải pháp của GM : -

nhập mô tả hình ảnh ở đây


Hãy giải thích vấn đề của bạn tốt hơn thế. Từ câu trả lời và nhận xét về chúng, thật khó để hiểu bạn muốn đạt được điều gì.
kaiser

@kaiser Mình đã cập nhật chi tiết.
Mohit

@Mohit bạn đã thử mã của tôi chưa?
gmazzap

Có, đoạn trích kết thúc bằng câu nhưng 'Đọc thêm' đã biến mất.
Mohit

@GM Được rồi tôi phải thêm phần đọc thêm trong phần trả lại.
Mohit

Câu trả lời:


13

Điều này yêu cầu PHP 5.3+ (WP yêu cầu 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);
}

Biên tập

Sau khi bình luận @kaiser tôi cố gắng chạy nó trên lưu / cập nhật để ngăn trang chậm lại khi hiển thị rất nhiều bài viết. Điều này cần được kiểm tra

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; 
}

1
chắc chắn về điều đó : $end{0}? Btw, bạn có thể quay lại hoặc breakkhi tìm thấy thứ gì đó. Lưu ý thêm: Có thể tốt hơn khi lưu bài đăng, vì vậy nó không được tạo lại trong thời gian chạy, điều này có thể trở nên khá chậm nếu bạn hiển thị nhiều bài đăng.
kaiser

@kaiser trích dẫn: Chuỗi cũng có thể được truy cập bằng cách sử dụng dấu ngoặc nhọn, như trong $ str {42}, cho cùng một mục đích. Tài liệu php.net Để tìm thứ gì đó tôi phải tìm char cuối cùng của chuỗi cuối cùng. Sử dụng $foundtôi phá vỡ chu kỳ kiểm tra chuỗi cuối cùng, vì vậy không cần break.
gmazzap

Hoàn toàn bỏ lỡ rằng đó là một whilekiểm tra cho false. +1
kaiser

@kaiser +1 cho phần thứ hai trong nhận xét của bạn, bây giờ tôi chỉnh sửa mã để chạy khi lưu
gmazzap

1
Chắc chắn @jessica là một chỉnh sửa xấu (trong phiên bản gốc thì không sao). Cảm ơn, đã sửa.
gmazzap

2

Đây là phiên bản của tôi, giữ tất cả các thẻ html và cũng cắt xén nội dung sau từ cuối cùng trong câu

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'); 

0

Chỉ trong trường hợp ai đó đang sử dụng câu trả lời, lời khuyên: Điều này sẽ phá hỏng Trường tùy chỉnh nâng cao. ACF cũng gọi wp_insert_post_datakhi tạo hoặc cập nhật một trường, nhưng $databiến không giống nhau và sẽ dẫn đến tên trường ACF trở thành một số từ không thể đọc được, dẫn đến không thể sử dụng trường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.