Bir döngü dışında get_the_excerpt kullanarak alıntı yapın


31

Arayan get_the_title()ve çalışan bir kodum var ama get_the_excerpt()boş dönüyorum. Nasıl çalıştırabilirim?

Bu kod "WP Facebook Open Graph protokolü" adlı bir eklentinin içindedir. İşte değiştirmek istediğim kısım:

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

Burada, has_excerpther zaman başarısız olur ve get_the_excerpt($post->ID)artık çalışmaz (kullanımdan kaldırıldı).

Öyleyse, burada alıntıyı nasıl gösterebilirim?

ps: "Advanced Excerpt" eklentisini de kullanıyorum


Tamam, bu kullanarak var my_excerpt($post->post_content, get_the_excerpt())ve kullanma my_excerpt()işlevini wordpress.stackexchange.com/questions/6961/...
Ariel

3
Lütfen cevap olarak bulduğunuz çözümü ekleyin, bu nedenle bu siteyi cevapsız bir soru olarak ele almaz. :)
Rarst

Sadece the_post()(tek mesaj şablonunda da çalışır) işlevini kullanmadan önce sizin get_the_excerpt()için gerekli verileri ayarlayacaktır.
Sisir

Yanıtlar:


29

Bu soruyu post nesnesi olmadan nasıl yapacağımı ararken buldum .

Ek araştırmam bu kayganlaştırma tekniğini ortaya çıkardı:

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


1
Bu, veriyi döngünün dışına çekmenin önerilen yolu olduğu gibi cevap olarak kabul edilmelidir. Ayrıca herhangi bir özel işlev veya $postgenel değişkenin geçersiz kılınmasını gerektirmez .
MacK

4
boş dize döndürür.
Kyaw Tun

1
@KyawTun - bu kadar uzun gibi çalışır $post_iddeğerinin ne olduğunu (ayarlanır $post_id? VE $post_idgeçerli, meşru sonrası kimliğidir.
cale_b

2
@cale_b Teşekkürler. Get_posts sorgusunu kullanıyorum ve elde edilen diziden kimliği alıyorum. Post nesnesinin post_title, post_content, ID, vb. Var. Ama çalışmıyor.
Kyaw Tun

SADECE TEXT'e ve &excerpt filtresiyle birlikte verilen <p> etiketine ihtiyacınız yoksa, "get_the_excerpt" filtresini kullanın, yukarıdaki süzgeç olur: $ text = application_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); bu, yalnızca kendi işaretlemenizin herhangi bir yerine ekleyebileceğiniz RAW metnini verecektir.
Mohsin

22

Halihazırda alıntıya ihtiyaç duyduğunuz post nesnesine sahip olduğunuza göre, işleri zorla başlatabilirsiniz:

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

setup_postdata()Fonksiyon küreselleştirmek olacak $postnesne ve düzenli eski döngü fonksiyonu için kullanılabilir hale. Döngünün içindeyken, çağrı yaparsınız the_post()ve sizin için şeyleri ayarlar ... döngünün dışında elle zorlamanız gerekir.


1
Bu işe yarıyor ama: "Genel $postdeğişkene bir başvuru iletmelisiniz, aksi halde işlevler the_title()düzgün çalışmıyor gibi." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
23

setup_postdata($post);FTW !!!!
squarecandy

18

Bunu dene:

Functions.php dosyasında yeni bir işlev oluşturun ve sonra her yerden arayın.

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

İşte kodu açıklayan bir yazı.


1
Mükemmel arkadaşımı bul. WordPress'in neden bu kadar kritik bir işlevi kullanımdan kaldırdığını hiç anlamadım. Bu etkili bir şekilde sıfırdan yeniden inşa ediyor, ama işe yarıyor. Alt kısmı pasaj dışında sosyal paylaşım eklentileri gibi özelliklerle ne sıklıkta kullandığımız göz önüne alındığında, muhtemelen çekirdeğin bir parçası olarak kalmalıydı.
Zorunlu Fikirler

1
EAMann'ın cevabı bu soruna daha iyi bir yaklaşımdır ve en iyi uygulama olarak düşünülmelidir. Bu yaklaşım, temel olarak API kullanmak yerine Core'un dahili işlemlerini çoğaltıyor.
Ian Dunn



1

Post nesnesine sahip değilseniz, işte Withers'taki gibi kısa bir işlev.

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

Ancak, askerin soruda belirtildiği gibi bir yazı nesnesi vardır.
fuxia

3
Yanılıyorsam, bu yöntem manuel alıntı döner ama beni düzelt olmaz gerekirse birini oluşturmak
Bill

1

Bu get_the_excerpt()döngü dışında kullanmak istediğinizde içindir :

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

Bunu yapmanın en doğrudan yolu budur. Ancak performans açısından mükemmel olduğundan emin değilim. Hala +1
Bill

1

Bir satırdaki içerikten otomatik olarak alıntıyı oluşturmak istiyorsanız, wp_trim_wordsbu işlevi kullanabilirsiniz :

// 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;

Lütfen cevabınızı düzenleyin ve bir açıklama ekleyin: bu neden sorunu çözdü?
fuxia
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.