लूप के बाहर get_the_excerpt का उपयोग करके अंश प्राप्त करें


31

मेरे पास एक कोड है जो कॉल get_the_title()करता है और यह काम करता है, लेकिन get_the_excerpt()खाली लौटता है। मैं इसे कैसे कारगर बना सकता हूं?

यह कोड "WP फेसबुक ओपन ग्राफ़ प्रोटोकॉल" नामक एक प्लगइन के अंदर है। यहां वह भाग है जिसे मैं बदलना चाहता हूं:

if (is_singular('post')) {
  if (has_excerpt($post->ID)) {
    echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
  }else{
    echo "\t<meta property='og:description' content='". [?] ."' />\n";
  }
}else{
  echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}

यहाँ, has_excerptहमेशा विफल रहते हैं, और get_the_excerpt($post->ID)अब और काम नहीं करते (पदावनत)।

तो, मैं वहाँ अंश कैसे प्रदर्शित कर सकता हूँ?

ps: मैं "उन्नत अंश" प्लगइन का उपयोग कर रहा हूँ


ठीक है, यह wordpress.stackexchange.com/questions/6961/… से फ़ंक्शन my_excerpt($post->post_content, get_the_excerpt())का उपयोग और उपयोग कर रहा हैmy_excerpt()
एरियल

3
कृपया समाधान जोड़ें जो आप एक उत्तर के रूप में लेकर आए हैं, इसलिए यह अनुत्तरित प्रश्न के रूप में साइट को परेशान नहीं करता है। :)
ररस्ट

बस उपयोग करें the_post()(यह एकल पोस्ट टेम्प्लेट पर भी काम करता है) फ़ंक्शन को कॉल get_the_excerpt()करने से पहले यह आपके लिए आवश्यक डेटा सेटअप करेगा।
सिसिर

जवाबों:


29

मुझे यह सवाल तब मिला जब बिना पोस्ट ऑब्जेक्ट के यह कैसे करना है ।

मेरे अतिरिक्त शोध ने इस चालाक तकनीक को बदल दिया:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));


1
यह उत्तर के रूप में स्वीकार किया जाना चाहिए क्योंकि यह लूप के बाहर डेटा खींचने का अनुशंसित तरीका है। इसके अलावा किसी भी कस्टम फ़ंक्शन या $postवैश्विक चर के ओवरराइडिंग की आवश्यकता नहीं है ।
मैक

4
यह खाली स्ट्रिंग लौटा।
क्यॉ तुन

1
@ कायटून - यह काम करता है, इसलिए जब तक $post_idसेट किया जाता है (इसका मूल्य क्या है $post_id? और $post_idएक वैध, वैध पोस्ट आईडी है।
cale_b

2
@cale_b धन्यवाद। मैं get_posts क्वेरी का उपयोग करता हूं और परिणामी सरणी से आईडी प्राप्त करता हूं। पोस्ट ऑब्जेक्ट में post_title, post_content, ID, आदि होते हैं, लेकिन काम नहीं करते।
क्यो तुन

यदि आपको केवल TEXT की आवश्यकता है और <p> टैग नहीं है जो the_excerpt फ़िल्टर के साथ शामिल है, तो "get_the_excerpt" फ़िल्टर का उपयोग करें, ताकि उपरोक्त फ़िल्टर बन जाए: $ text = apply_filters ('get__excerpt'), get_post_field ('post_excerpt', $ post_id) ); यह आपको सिर्फ रॉ टेक्स्ट देगा जिसे आप अपने मार्कअप में कहीं भी सम्मिलित कर सकते हैं।
मोहसिन

22

चूंकि ऐसा लगता है कि आपके पास पहले से ही पोस्ट ऑब्जेक्ट है जिसके लिए आपको अंश की आवश्यकता है, आप बस चीजों को काम करने के लिए मजबूर कर सकते हैं:

setup_postdata( $post );
$excerpt = get_the_excerpt();

setup_postdata()समारोह वैश्वीकृत जाएगा $postवस्तु और इसे नियमित रूप से पुराने पाश समारोह के लिए उपलब्ध हैं। जब आप लूप के अंदर होते हैं, तो आप कॉल करते हैं the_post()और यह आपके लिए चीजें सेट करता है ... लूप के बाहर आपको इसे मैन्युअल रूप से बाध्य करने की आवश्यकता होती है।


1
यह काम करता है लेकिन: "आपको वैश्विक $postवैरिएबल के लिए एक संदर्भ पास करना होगा , अन्यथा the_title()ठीक से काम नहीं करने जैसे कार्य करता है।" global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
डीच

setup_postdata($post);FTW !!!!
चौकोर कैंडी

18

इसे इस्तेमाल करे:

Functions.php में एक नया फंक्शन बनाएं और फिर इसे जहाँ से भी कॉल करें।

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id); //Gets post ID
    $the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
    $excerpt_length = 35; //Sets excerpt length by word count
    $the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
    $words = explode(' ', $the_excerpt, $excerpt_length + 1);

    if(count($words) > $excerpt_length) :
        array_pop($words);
        array_push($words, '…');
        $the_excerpt = implode(' ', $words);
    endif;

    $the_excerpt = '<p>' . $the_excerpt . '</p>';

    return $the_excerpt;
}

यहाँ एक कोड का वर्णन पोस्ट है।


1
बहुत बढ़िया मेरे दोस्त। मैंने कभी नहीं समझा कि वर्डप्रेस ने इस तरह के महत्वपूर्ण कार्य को क्यों चित्रित किया है। यह खरोंच से इसे प्रभावी ढंग से पुनर्निर्माण कर रहा है, लेकिन यह काम करता है। यह देखते हुए कि हम कितनी बार सामाजिक साझाकरण प्लगइन्स जैसी सुविधाओं के साथ लूप के बाहर अंश का उपयोग करते हैं, यह संभवतः कोर का एक हिस्सा बना रहना चाहिए।
इंपीरियल विचार

1
एमान का जवाब इस समस्या के लिए एक बेहतर दृष्टिकोण है, और इसे सबसे अच्छा अभ्यास माना जाना चाहिए। यह दृष्टिकोण मूल रूप से एपीआई का उपयोग करने के बजाय कोर के आंतरिक को दोहरा रहा है।
इयान डन

9

अब आप केवल get_the_excerpt( $postID )फ़ंक्शन का उपयोग कर सकते हैं । चूंकि: वर्डप्रेस 4.5.0 ने $postपैरामीटर पेश किया ।


1
डब्ल्यूपी 4.5 + युग में होने के बाद से यह नया स्वीकार किया जाना चाहिए।
मतिजा मृणीक

18
यह काम नहीं करेगा यदि अंश खाली है क्योंकि wp_trim_excerptफ़िल्टर वर्तमान पोस्ट के लिए अंश को वापस कर देगा।
डायलन

9
@Dylan ने क्या कहा
kraftner 7:14

5

लूप के बाहर the_excerpt () पाने के लिए wp_trim_excerpt काmy_excerpt($post->post_content, get_the_excerpt()) उपयोग करके my_excerpt()फ़ंक्शन का उपयोग करना और इसे प्राप्त करना


2
लिंक-केवल उत्तर अच्छे नहीं हैं। संबंधित कोड यहां कॉपी करें। जब वह लिंक टूट जाता है, तो वह साइट डाउन हो जाती है, तब इस जवाब का कोई मूल्य नहीं है।
cale_b

यह पूरी तरह से मेरे लिए काम किया!
सैकत

1

यदि आपके पास पोस्ट ऑब्जेक्ट नहीं है, तो यहां विर्सर्स की तरह एक छोटा फ़ंक्शन है।

function get_excerpt_by_id($post_id){
    $the_post = get_post($post_id);
    $the_excerpt = $the_post->post_excerpt; 
    return $the_excerpt;
}

लेकिन प्रश्नकर्ता को प्रश्न में कहा गया एक पोस्ट ऑब्जेक्ट है।
FUXIA

3
मुझे सही करें अगर मैं गलत हूं, तो यह विधि मैन्युअल अंश वापस कर देगी लेकिन ज़रूरत पड़ने पर एक उत्पन्न नहीं करेगी
बिल

1

यह तब होता है जब आप get_the_excerpt()लूप के बाहर उपयोग करना चाहते हैं :

function custom_get_excerpt($post_id) {
    $temp = $post;
    $post = get_post($post_id);
    setup_postdata($post);

    $excerpt = get_the_excerpt();

    wp_reset_postdata();
    $post = $temp;

    return $excerpt;
}

यह इसे करने का सबसे सीधा तरीका है .. यकीनन यह बढ़िया प्रदर्शन नहीं है। आप अभी भी मेरे +1
बिल

1

यदि आप एक पंक्ति में सामग्री से स्वचालित रूप से अंश उत्पन्न करना चाहते हैं - तो आप wp_trim_wordsइस तरह से फ़ंक्शन का उपयोग कर सकते हैं :

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

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