รับข้อความที่ตัดตอนมาโดยใช้ get_the_excerpt นอกวง


31

ฉันมีรหัสที่โทรget_the_title()และใช้งานได้ แต่get_the_excerpt()กลับว่างเปล่า ฉันจะทำให้มันทำงานได้อย่างไร

รหัสนี้อยู่ในส่วนเสริมที่เรียกว่า "WP Facebook Open Graph protocol" นี่คือส่วนที่ฉันต้องการเปลี่ยน:

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: ฉันใช้ปลั๊กอิน "Advanced Excerpt" เช่นกัน


ตกลงรับมันโดยใช้my_excerpt($post->post_content, get_the_excerpt())และใช้งานmy_excerpt()ฟังก์ชั่นจากwordpress.stackexchange.com/questions/6961/…
ariel

3
โปรดเพิ่มโซลูชันที่คุณคิดขึ้นมาเพื่อเป็นคำตอบดังนั้นสิ่งนี้จึงไม่หลอกหลอนไซต์ว่าเป็นคำถามที่ยังไม่ได้ตอบ :)
Rarst

เพียงใช้the_post()(ทำงานบนเทมเพลตโพสต์เดียว) ก่อนที่คุณจะเรียกget_the_excerpt()มันจะเป็นการตั้งค่าข้อมูลที่จำเป็นสำหรับคุณ
Sisir

คำตอบ:


29

ฉันพบคำถามนี้เมื่อดูวิธีการทำสิ่งนี้โดยไม่มีวัตถุโพสต์

การวิจัยเพิ่มเติมของฉันเปิดขึ้นเทคนิคเนียนนี้:

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


1
ควรได้รับการยอมรับว่าเป็นคำตอบเนื่องจากเป็นวิธีที่แนะนำในการดึงข้อมูลออกจากลูป นอกจากนี้ยังไม่จำเป็นต้องมีฟังก์ชั่นที่กำหนดเองหรือแทนที่$postตัวแปรทั่วโลก
MacK

4
มันกลับสตริงที่ว่างเปล่า
Kyaw Tun

1
@ KyawTun - ใช้งานได้ตราบเท่าที่$post_idมีการตั้งค่า (ค่าของ$post_idคืออะไรและ$post_idเป็น ID การโพสต์ที่ถูกต้องและถูกต้องตามกฎหมาย
cale_b

2
@cale_b ขอบคุณ ฉันใช้แบบสอบถาม get_posts และรับ ID จากอาร์เรย์ผลลัพธ์ วัตถุโพสต์มี post_title, post_content, ID ฯลฯ แต่ไม่สามารถใช้งานได้
Kyaw Tun

หากคุณต้องการเพียงข้อความและไม่ใช่แท็ก <p> ซึ่งรวมอยู่ในตัวกรอง the_excerpt ให้ใช้ตัวกรอง "get_the_excerpt" เพื่อให้ตัวกรองด้านบนกลายเป็น: $ text = Apply_filters ('get_the_excerpt', get_post_field ('post_excerpt', $ post_id) ); นี่จะให้ข้อความ RAW ที่คุณสามารถแทรกได้ทุกที่ในมาร์กอัปของคุณเอง
Mohsin

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();
deach

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

18

ลองสิ่งนี้:

สร้างฟังก์ชั่นใหม่ในฟังก์ชั่น. 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
หาเพื่อนของฉันดีเลิศ ฉันไม่เคยเข้าใจเลยว่าทำไม WordPress ถึงเลิกใช้งานฟังก์ชั่นที่สำคัญเช่นนี้ นี่เป็นการสร้างขึ้นใหม่อย่างมีประสิทธิภาพตั้งแต่เริ่มต้น แต่ใช้งานได้ เมื่อพิจารณาว่าเราใช้ข้อความที่ตัดตอนมานอกวงด้วยคุณสมบัติเช่นปลั๊กอินการแบ่งปันทางสังคมมันน่าจะยังคงเป็นส่วนหนึ่งของหลัก
ความคิดที่จำเป็น

1
คำตอบของ EAMann เป็นวิธีที่ดีกว่าในการแก้ไขปัญหานี้และควรได้รับการพิจารณาว่าเป็นแนวทางปฏิบัติที่ดีที่สุด วิธีการนี้เป็นการทำซ้ำภายในของ Core แทนการใช้ API
Ian Dunn

9

ตอนนี้คุณสามารถใช้get_the_excerpt( $postID )ฟังก์ชั่น ตั้งแต่: WordPress 4.5.0 แนะนำ$postพารามิเตอร์


1
นี่ควรเป็นคำตอบที่ยอมรับใหม่เนื่องจากเราอยู่ในยุค WP 4.5 +
Matija Mrkaic

18
สิ่งนี้จะไม่ทำงานหากข้อความที่ตัดตอนมาว่างเปล่าเพราะwp_trim_excerptตัวกรองจะคืนข้อความที่ตัดตอนมาสำหรับโพสต์ปัจจุบัน
Dylan

9
ดูcore.trac.wordpress.org/ticket/36934สำหรับรายละเอียดเกี่ยวกับสิ่งที่ @Dylan พูด
Kraftner

5

รับมันmy_excerpt($post->post_content, get_the_excerpt())และใช้my_excerpt()ฟังก์ชั่นจากการใช้ wp_trim_excerpt เพื่อรับ the_excerpt () นอกวง


2
คำตอบสำหรับลิงก์เท่านั้นไม่ดี คัดลอกรหัสที่เกี่ยวข้องที่นี่ เมื่อลิงก์นั้นเสียหายไซต์นั้นไม่ทำงาน / หายไปดังนั้นคำตอบนี้จึงไม่มีค่า
cale_b

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน!
Saikat

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 ของฉัน
Bill

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.