एक शब्द के बजाय एक वाक्य के साथ अंश को कैसे समाप्त करें?


15

यहाँ मेरे होम पेज पर पोस्ट का अंश है। मैं एक वाक्य के साथ अंश को समाप्त करना चाहता हूं। इस मामले में यह 'अवसर है। '। मुझे पता है कि लंबाई को कैसे बदलना है, लेकिन यह वह नहीं करेगा जो मैं चाहता हूं।

यहाँ छवि विवरण दर्ज करें

यहाँ अन्य वेबसाइट से अंश है। यहाँ आपको उपरोक्त के विपरीत एक उचित वाक्य के साथ अंश समाप्त होता दिखाई दे रहा है, जो अगले वाक्य 'Proactively' के पहले शब्द के साथ समाप्त होता है।

यहाँ छवि विवरण दर्ज करें

जीएम द्वारा समाधान को लागू करने के बाद : -

यहाँ छवि विवरण दर्ज करें


कृपया अपने मुद्दे को इससे बेहतर समझाएँ। उन पर दिए गए जवाब और टिप्पणियों से, यह समझना मुश्किल है कि आप क्या हासिल करना चाहते हैं।
kaiser

@kaiser मैंने विवरण अपडेट किया है।
मोहित

@Mohit क्या आपने मेरा कोड आज़माया है?
gmazzap

हाँ, वाक्य के साथ अंश समाप्त होता है लेकिन 'और पढ़ें' चला गया है।
मोहित

@GM ठीक है मुझे रिटर्न में अधिक जोड़ना होगा।
मोहित

जवाबों:


13

इसके लिए PHP 5.3+ (WP के लिए 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);
}

संपादित करें

@Kaiser टिप्पणी के बाद, मैं कई पोस्ट दिखाने पर पृष्ठ को धीमा करने से बचाने के लिए इसे बचाने / अपडेट करने का प्रयास करता हूं। इसका परीक्षण किया जाना चाहिए

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
इसके बारे में निश्चित $end{0}:? Btw, आप बस वापस आ सकते हैं या breakजब कुछ पाया जाता है। अतिरिक्त नोट: पोस्ट को सहेजते समय यह बेहतर हो सकता है, इसलिए यह रनटाइम के दौरान पुनर्जीवित नहीं होता है, जो कि बहुत धीमी गति से प्राप्त कर सकता है यदि आप बहुत सारे पोस्ट प्रदर्शित कर रहे हैं।
कैसर

@kaiser उद्धृत: स्ट्रिंग्स का उपयोग ब्रेसिज़ का उपयोग करके भी किया जा सकता है, जैसा कि $ str {42} में, उसी उद्देश्य के लिए। php.net डॉक्स कुछ खोजने के लिए मुझे पिछले स्ट्रिंग के अंतिम चार को ढूंढना था। का उपयोग करके $foundमैं चक्र को तोड़ता हूं और अंतिम स्ट्रिंग की जांच करता हूं , इसलिए कोई आवश्यकता नहीं है break
gmazzap

पूरी तरह से चूक गया कि यह एक whileजाँच है false। +1
kaiser

अपनी टिप्पणी के दूसरे भाग, अब मैं संपादित बचाने पर चलाने के लिए कोड के लिए @kaiser +1
gmazzap

1
ज़रूर @jessica एक बुरा संपादन था (मूल संस्करण में यह ठीक था)। धन्यवाद, निश्चित।
gmazzap

2

यहाँ मेरा संस्करण है, सभी html टैग्स को रखना और एक वाक्य में अंतिम शब्द के बाद सामग्री को ट्रिम करना भी है

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

बस अगर कोई व्यक्ति सलाह के शब्द का उपयोग कर रहा है, तो यह उन्नत कस्टम फील्ड्स को बर्बाद कर देगा। wp_insert_post_dataकिसी क्षेत्र को बनाते या अद्यतन करते समय ACF भी आक्रमण करता है , लेकिन $dataचर समान नहीं होता है, और परिणामस्वरूप ACF फ़ील्ड का नाम कुछ अपठनीय अस्पष्ट हो जाएगा, जिसके परिणामस्वरूप फ़ील्ड का उपयोग नहीं किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.