apply_filters () और the_excerpt अप्रत्याशित परिणाम दे रहे हैं


10

मुझे ऐसा लग रहा है कि मुझे यहाँ कुछ स्पष्ट याद आ रहा है, लेकिन मैं वर्डप्रेस को सहयोग करने के लिए प्रतीत नहीं कर सकता।

मैं एक फ़ंक्शन के साथ फेसबुक ओजी टैग उत्पन्न कर रहा हूं। अंश के अलावा सब कुछ ठीक काम करता है।

के पदावनति के बाद से get_the_excerpt($post->ID), एक नया लूप बनाने के बिना एक अंश बनाने का एक और तरीका है? यह मुझे अत्यधिक लगता है।

मेरी पहली वृत्ति का उपयोग करना था apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

यह मुझे HTML-स्वरूपित सामग्री के साथ पूर्ण पोस्ट देता है। ठीक है, गलत होना चाहिए। इसलिए मैंने अगला तार्किक विचार आजमाया:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

कोई पाँसा नहीं। अब कोई HTML नहीं है, लेकिन यह अभी भी पूर्ण पोस्ट है (जो वास्तव में भ्रमित है)।

ठीक है, कोई समस्या नहीं है। चलो सभी फैंसी सामान को छोड़ दें और बस छंटनी की प्रविष्टि के लिए जाएं:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

कोई परिवर्तन नहीं होता है।

तो, मेरा सवाल यह है: बिल्ली क्या चल रही है? क्या मुझे कुछ याद आ रहा है, यहाँ?

मैं WP कोर में मिला कि कैसे the_excerpt()काम करता है, और यह मेरी कॉल के समान प्रतीत होता है:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

मेरे निष्कर्षों के आधार पर मेरे कुछ प्रश्न हैं:

  1. अपेक्षा के अनुसार फ़िल्टर क्यों नहीं लगाया जा रहा है?
  2. क्या एक नया लूप बनाने के बिना लूप से बाहर निकलने का एक तरीका है?
  3. मैं पागल हो रहा हूँ?

एक नज़र रखने के लिए अग्रिम धन्यवाद। मैं यहां काफी प्रभावित हूं।


get_the_excerpt()पदावनत नहीं किया जाता है, बस जो अतिरिक्त पैराम का उपयोग किया जाता है वह अब उपयोग नहीं किया जाता है।
हेलो

क्षमा करें, यही मेरा मतलब है। स्पष्टीकरण देने के लिए धन्यवाद।
jlengstorf

तुम पागल हो! । । । जैसे मैं हूँ lol
pythonian29033

जवाबों:


16

जवाब में निकला था wp_trim_excerpt()

यह इसमें परिभाषित है wp-includes/functions.php:1879:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

तो कोई भी पाठ संसाधित नहीं होता है; यह केवल तभी काम करता है जब इसे एक खाली पैरामीटर के साथ कहा जाता है।

इसे हल करने के लिए, मैंने अपने विषय में एक त्वरित फ़िल्टर जोड़ा जो समस्या को हल करता है:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

यह कुछ हद तक बेमानी है, लेकिन हर बार जब मैं एक अंश उत्पन्न करना चाहता हूं तो नए लूप खोलना बेहतर होता है।


1
आह, यह मेरे लिए स्पष्ट नहीं था कि आप केवल टेक्स्ट ऑपरेशन की तलाश कर रहे हैं (डीबी से नहीं)।
हकरे

कोई चिंता नहीं। मुझे हमेशा डर लगता है कि सवाल पूछने पर मुझे कोई मतलब नहीं है। मैं डेटाबेस से खींच रहा था , लेकिन मैं पूरी तरह से 'नोथर लूप नहीं खोलना चाहता था क्योंकि मेरे पास get_the_title($post->ID)उपलब्ध चीजें हैं । कोड की अंतिम पंक्ति थी$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

मैं वास्तव में यह पूछकर बेवकूफ महसूस करता हूं, लेकिन आप इस नए फ़िल्टर को कैसे कहते हैं? मैंने इसे कोशिश की $content = apply_filters( 'rw_trim_excerpt', $content );और $content = rw_trim_excerpt($content);, लेकिन इनमें से किसी ने भी काम नहीं किया (पहले आउटपुट ट्रिम नहीं किया था और बाद में एक त्रुटि उत्पन्न हुई)।
एरिक के

2
@QuantumDynamix यह get_the_excerptनकल को संभालने के लिए संशोधित करने के लिए डिज़ाइन किया गया है the_excerpt, ताकि आप कॉल कर सकें apply_filters('get_the_excerpt', $content);:।
jlengstorf

ओफ़्फ़! एक अच्छा दोपहर के बिंदु से एक अच्छा है, धन्यवाद
pythonian29033

1

प्रयत्न:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

देखें: सभी उपलब्ध रिटर्न सदस्यों के लिए get_postकोडेक्स


4
यदि पोस्ट के लिए कोई अंश दर्ज नहीं किया गया था, तो वह खाली हो जाता है। मुझे get_the_excerpt () की क्रियाओं की नकल करने की ज़रूरत है (यदि कोई मौजूद नहीं है तो एक अंश बनाएं)।
jlengstorf 19

फ़िल्टर लागू करने से ऐसा नहीं होगा, इसलिए आप गलत प्रश्न पूछ रहे हैं। पता नहीं क्यों तुम एक अंश की तलाश कर रहे हैं अगर कोई नहीं है। get_the_excerpt()स्रोत की जाँच करें, यह नकल नहीं करता है, यह केवल सदस्य चर का एक्सेस कर रहा $postहै post_excerpt। उत्तर में कोडेक्स लिंक भी देखें।
हकरे

3
कोडेक्स प्रविष्टि पर the_excerpt: "यह एक स्वचालित अंश प्रदर्शित करेगा जो पोस्ट की सामग्री के पहले 55 शब्दों को संदर्भित करता है।" मैं पाश के बाहर उस व्यवहार की नकल करना चाहता हूं।
jlengstorf

अच्छी तरह से अस्थायी रूप से एक दूसरा लूप बनाएं और उस फ़ाइल को क्वेरी करें जो कि आईडी है तो संभवतः एक त्वरित समाधान के लिए। माध्यमिक लूप्स देखें - codex.wordpress.org/Function_Reference/…
22

1
लिंक के लिए धन्यवाद। मुझे पता था कि मैं एक अतिरिक्त लूप सेट कर सकता हूं, लेकिन यह ओवरकिल जैसा लगता है। मेरा समाधान एक फिल्टर जोड़ रहा था। मैं इसे बाद में बहुत कम कोड के लिए थोड़ा कोहनी तेल के रूप में देखता हूं।
jlengstorf

0

आप सामग्री को छानने के लिए मेरे कस्टम फ़ंक्शन का उपयोग कर सकते हैं (यह NARGA फ्रेमवर्क से है )

  • यदि पोस्ट में कस्टम अंश है, तो सामग्री के बजाय इसे प्रदर्शित करें
  • यदि पोस्ट कस्टम सेरप्ट नहीं है, तो ऑटो ने कॉन्टेन से एक्सर्पट उत्पन्न किया
  • ऑटो ट्रिम शोर्ट, HTML कोड, निकालें [...], "और पढ़ें" पाठ (अनुवाद योग्य)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.