Alıntıyı bir kelime yerine bir cümle ile nasıl bitirebilirim?


15

İşte ana sayfamdaki yazının alıntısı. Alıntıyı bir cümleyle bitirmek istiyorum. Bu durumda bu 'fırsatlar. '. Uzunluğunu nasıl değiştireceğimi biliyorum ama istediğimi yapmayacak.

resim açıklamasını buraya girin

İşte diğer web sitesinden alıntı. Burada alıntıyı, bir sonraki cümlenin 'Proaktif' ilk kelimesi ile biten, yukarıdakinin aksine, uygun bir cümle ile biten görüyorsunuz.

resim açıklamasını buraya girin

GM ile çözüm uygulandıktan sonra : -

resim açıklamasını buraya girin


Lütfen sorununuzu bundan daha iyi açıklayın. Onlara verilen cevaplardan ve yorumlardan, ne elde etmek istediğinizi anlamak zor.
kaiser

@kaiser Ayrıntıları güncelledim.
Mohit

@Mohit kodumu denedin mi?
gmazzap

Evet, alıntı cümle ile sona eriyor ancak 'Daha fazla oku' gitti.
Mohit

@ GM Tamam ben dönüşte daha fazla okumak zorunda.
Mohit

Yanıtlar:


13

Bu PHP 5.3+ gerektirir (WP PHP 5.2.4+ gerektirir)

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

Düzenle

@Kaiser yorumundan sonra, çok sayıda gönderi gösterilmesini yavaşlatmak için bunu kaydet / güncellemede çalıştırmayı deniyorum. Bu test edilmelidir

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
emin misin: $end{0}? Btw, geri dönebilirsin ya breakda bir şey bulunduğunda. Ek not: Gönderiyi kaydederken bundan daha iyi olabilir, bu nedenle çalışma sırasında yeniden oluşturulmaz, bu da çok sayıda gönderi görüntülediğinizde oldukça yavaş olabilir.
kaiser

@kaiser cite: Dizelere aynı amaçla $ str {42} 'de olduğu gibi parantez kullanılarak da erişilebilir. php.net docs Bir şey bulmak için son dizgenin son karakterini bulmak zorunda kaldım. $foundBen döngü kırmak ve son dizeyi kontrol kullanarak , bu yüzden gerek yok break.
gmazzap

Tamamen whileiçin bir kontrol özledim false. +1
kaiser

@kaiser +1 yorumunuzun ikinci kısmı için, şimdi kod üzerinde kaydetmek için düzenlemek düzenlemek
gmazzap

1
Tabii @jessica kötü bir düzenleme oldu (orijinal sürümünde ok). Teşekkürler, düzeltildi.
gmazzap

2

İşte benim html etiketlerini tutmak ve aynı zamanda bir cümlenin son kelimesinden sonra içeriği kırpmak benim sürüm

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

Birisinin cevabı kullanması durumunda, tavsiye sözcüğü: Bu, Gelişmiş Özel Alanları mahvedecektir. ACF wp_insert_post_data, bir alan oluştururken veya güncellerken de çağırır , ancak $datadeğişken aynı değildir ve ACF alan adının, okunamayan anlamsız hale gelmesine neden olur ve bu da alanı kullanamamaya neden olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.