camera_filters () ve the_excerpt beklenmedik sonuçlar veriyor


10

Burada oldukça bariz bir şeyi kaçırmam gerektiğini hissediyorum, ancak WordPress'in işbirliği yapmasını sağlayamıyorum.

Bir işlevle Facebook OG etiketleri üretiyorum. Alıntı dışında her şey yolunda gidiyor.

Kullanımdan kaldırıldığından beri, get_the_excerpt($post->ID)tamamen yeni bir döngü oluşturmadan bir alıntı oluşturmanın başka bir yolu var mı? Bana aşırı geliyor.

İlk içgüdüm kullanmaktı apply_filters():

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

Bu bana HTML biçiminde içerikle dolu tam gönderi veriyor. Tamam, yanlış olmalı. Bu yüzden bir sonraki mantıklı fikri denedim:

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

Nafile. Şimdi HTML yok, ama yine de tam gönderi (gerçekten kafa karıştırıcı).

Tamam sorun yok. Tüm fantezi şeyleri atlayalım ve sadece kesilmiş girişi seçelim:

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

Değişiklik yok.

Benim sorum şu: ne oluyor? Burada eksik olduğum bir şey var mı?

Nasıl the_excerpt()çalıştığını bulmak için WP çekirdeğine girdim ve aramamla aynı görünüyor:

/**
 * 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());
}

Bulgularıma dayanarak birkaç sorum var:

  1. Filtre neden beklendiği gibi uygulanmıyor?
  2. Yeni bir döngü oluşturmadan alıntıyı döngü dışında almanın bir yolu var mı?
  3. Ben deli miyim?

Bir göz attığınız için şimdiden teşekkür ederiz. Burada oldukça güldüm.


get_the_excerpt()kullanımdan kaldırılmamışsa, yalnızca kendisine geçirilen ekstra param artık kullanılmamaktadır.
Milo

Üzgünüm, demek istediğim buydu. Açıkladığınız için teşekkürler.
jlengstorf

Sen delisin! . . . as am I lol
pythonian29033

Yanıtlar:


16

Cevabın olduğu ortaya çıktı wp_trim_excerpt().

Şunun içinde tanımlanmıştır 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);
}

Böylece iletilen metinler işlenmez; yalnızca boş bir parametre ile çağrıldığında çalışır.

Bunu çözmek için, temama sorunu çözen hızlı bir filtre ekledim:

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

Biraz gereksiz, ama her alıntı yapmak istediğimde yeni döngüler açmaktan daha çok hoşuma gidiyor.


1
Ah, benim için sadece metin işlemini aradığınız açık değildi (DB'den getirilmiyor).
hakre

Telaşa gerek yok. Soru sorduğumda her zaman anlamlı olmadığımdan korkuyorum. Ben edildi veritabanından çekerek, ama ben gibi şeyler beri döngü nother' bir bütün açmak istemedim get_the_title($post->ID)mevcut. Kodun son satırı$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

Bunu gerçekten aptal gibi hissediyorum, ama bu yeni filtreye nasıl denir? Ben $content = apply_filters( 'rw_trim_excerpt', $content );ve olarak denedim $content = rw_trim_excerpt($content);, ama bunların hiçbiri çalıştı (eski çıktı kırpmadı ve daha sonra bir hata üretti).
Eric K

2
@QuantumDynamix Bu değiştirmek için tasarlanmıştır get_the_excerptmimik için taşıma the_excerptaramak, böylece: apply_filters('get_the_excerpt', $content);.
jlengstorf

vay be! bir wpress noob bakış açısından güzel bir, teşekkürler
pythonian29033

1

Deneyin:

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

Bakınız: Tüm mevcut iade üyeleri için get_postkodeks .


4
Gönderi için herhangi bir alıntı girilmezse bu boş olur. Ben get_the_excerpt () (hiçbiri varsa bir alıntı oluşturma) eylemleri taklit etmek gerekir.
jlengstorf

Filtreyi uygulamak bunu yapmaz, bu yüzden yanlış soruyu soruyorsunuz. Varsa neden bir alıntı aradığınız hakkında bir fikriniz yok. get_the_excerpt(), kaynağını kontrol mimik etmediğini, sadece üye değişkeni giriş yapıyor $postolduğu post_excerpt. Cevaptaki kodeks bağlantısına da bakınız.
hakre

3
Codex girişinden the_excerpt: "yazı içeriğinin ilk 55 kelimesini ifade eden otomatik bir alıntı görüntüler." Bu davranışı döngü dışında taklit etmek istiyorum.
jlengstorf

Peki geçici olarak ikinci bir döngü oluşturun ve bu dosyayı kimliği ile sonra muhtemelen hızlı bir çözüm için sorgulayın. Bkz. İkincil Döngüler - codex.wordpress.org/Function_Reference/…
hakre

1
Bağlantı için teşekkürler. Ek bir döngü kurabileceğimi biliyordum, ama aşırıya kaçmış gibi görünüyor. Benim çözümüm bir filtre eklemekti. Daha sonra çok daha az kod için şimdi küçük bir dirsek yağı olarak görüyorum.
jlengstorf

0

İçeriği filtrelemek için özel işlevimi kullanabilirsiniz ( NARGA Framework'ten )

  • Gönderinin özel alıntısı varsa içerik yerine görüntüleyin
  • Gönderi özel bir cerpt yoksa otomatik olarak alıntıdan oluştur
  • Otomatik kırpma kısa kodu, HTML kodu, kaldır [...], "Devamını Oku" metni ekle (çevrilebilir)

        /**
        * 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');
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.