รับข้อความที่ตัดตอนมาโดย ID


31

เหตุใดจึงไม่สามารถตัดตอนมาจาก ID เช่นชื่อและองค์ประกอบอื่น ๆ ส่วนใหญ่

เช่น. get_the_excerpt (ID) ฉันรู้ว่าจะใช้งานอย่างไรกับฟังก์ชั่น $ post-> post_excerpt แต่ไม่ได้ส่งคืนส่วนของเนื้อหาหากไม่มีการคัดลอกข้อความที่ตัดตอนมามันไม่ส่งผลอะไรเลย

ดังนั้นสิ่งที่ฉันพยายามทำคือรับข้อความที่ตัดตอนมาจาก ID หากมีข้อความที่ตัดตอนมาและหากไม่มีข้อความที่ตัดตอนมาจาก ID นั้น แต่มีเนื้อหาบางส่วนเพื่อรับเนื้อหาบางส่วนแทน

หนึ่งจะทำเช่นนั้นได้อย่างไร

ความคิดใด ๆ

มหัศจรรย์ ...

แก้ไข -

วนรหัสต้นทางตามที่ร้องขอ

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
                  </div>
                  </div>

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>



<?php echo $excerpt;?></div>
              <?php endforeach;?>

เนื้อหา "บางส่วน" คืออะไร?
ไกเซอร์

ฟังก์ชั่นข้อความที่ตัดตอนมาใน wordpress ส่งกลับข้อความที่ตัดตอนมาจากการโพสต์ หากโพสต์ไม่มีข้อความที่ตัดตอนมามันจะส่งกลับจำนวนอักขระของเนื้อหาตามด้วย '... ' หรือ 'read more' หรือสิ่งที่แม่แบบให้
Robin I Knight

1
ไม่ใช่เป็น PITA แต่กฎชุมชนไม่อนุญาตให้ใช้ลายเซ็นและการปิดมาตรฐาน เพื่อที่จะปฏิบัติตามกฎและหลีกเลี่ยงการให้Jeff Atwoodส่งข้อความท้ายถึงคุณหลังจากแก้ไขคำถามทั้งหมดของคุณโปรดหยุดใช้"Marvelous"เป็นข้อความปิด (และโปรดอย่ายิงผู้ส่งสาร)
MikeSchinkel

คำตอบ:


20

สวัสดี@ Robin I. Knight:

ฉันมองget_the_excerpt()ว่าเป็นฟังก์ชั่นที่มีการออกแบบดั้งเดิม เนื่องจากการใช้งาน WordPress เติบโตขึ้นมีกรณีการใช้งานใหม่ ๆ มากมายซึ่งมันไม่เหมาะสม ตัวอย่างหนึ่งคือการใช้$argsอาร์เรย์ของตัวเลือกฟังก์ชันบ่อยครั้ง

แต่มันง่ายที่จะแก้ไขตามความต้องการของคุณ นี่คือฟังก์ชั่นทางเลือกที่คุณสามารถใช้ซึ่งคุณสามารถวางไว้ที่ใดก็ได้ในfunctions.phpไฟล์ของธีมของคุณ:

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;
}

ฉันไม่ได้ทำการทดสอบ แต่ค่อนข้างแน่ใจว่าฉันเข้าใจถูกแล้ว หากสิ่งนี้ไม่ตรงกับความต้องการของคุณโปรดอธิบายอย่างละเอียดและบางทีฉันสามารถให้คำแนะนำอื่น ๆ ได้


มันได้ผล. เรียงจาก ผลลัพธ์ที่แปลกมาก มันทำหน้าที่ของมันอย่างแน่นอน แต่ผลลัพธ์ก็แปลก ฉันใช้มันร่วมกับ GET_Posts และด้วยเหตุผลบางประการการติดประกาศ 2 อันดับแรกก็เหมือนกันเสมอ นี่คือลิงค์และคุณจะเห็นสิ่งที่ฉันหมายถึง ดูโพสต์ 4 ทางด้านขวามือ divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight

@Robin I Knight: กรุณาโพสต์ซอร์สโค้ดวนรอบของคุณเป็นการอัพเดทคำถามของคุณ; เป็นการยากที่จะดีบักรหัสโดยไม่เห็นรหัส มันอาจเป็นปลั๊กอินที่ทำให้เกิดปัญหา ลองปิดใช้งานทีละรายการ
MikeSchinkel

วนรอบซอร์สโค้ดในคำถามด้านบน ^^
Robin I Knight

BTW ฉันเปลี่ยนชื่อของฟังก์ชั่นเป็น get_the_excerpt_id ($ post_id)
Robin I Knight

@Robin I Knight - ฉันไม่เห็นอะไรเลยในวงของคุณ แต่คุณอาจลองโทรไปsetup_postdata($post)ที่จุดเริ่มต้นของวงของคุณตามที่ @Rarst แนะนำ หากไม่ได้ผลอาจเป็นปลั๊กอินที่คุณต้องปิดการใช้งาน คุณเคยลองไหม และคุณอาจไม่ต้องการเรียกมันget_the_excerpt_id()เพราะ WordPress สามารถเพิ่มฟังก์ชั่นนั้นในอนาคตและทำลายไซต์ของคุณ และคุณสามารถทำได้โดยไม่ใช้ฟังก์ชั่นในลูปของคุณโดยใช้foreach($stories as $story): global $post; $post = $story;แทน
MikeSchinkel

16

กลไกของข้อความที่ตัดตอนมามีความสับสนอย่างมาก มันไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามของคุณ แต่โดยทั่วไปถ้าคุณต้องการสร้างเทมเพลตแท็กเฉพาะกับ Loop ทำงานกับอาร์เรย์ที่ส่งคืนโดยget_posts()คุณสามารถเลียนแบบ Loop ดังนี้:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

แล้ว wp_reset_query (); ?
cwd

1
@cwd หากใช้เพียงการsetup_postdata()สืบค้นทั่วโลกจะไม่ได้รับผลกระทบและจะต้องรีเซ็ตเฉพาะการโพสต์ข้อมูล
Rarst

วิธีนี้แก้ปัญหาได้ดีกว่าการจัดเก็บโพสต์ในอีกวาร์หนึ่งและขอโพสต์อื่นเพื่อให้เป็นแบบทั่วโลก +1
Barry Kooij

ขอบคุณ @Rarst ที่ช่วยฉันออก การเพิ่ม setup_postdata ($ โพสต์); แก้ไขปัญหาของฉัน
Simon

8

มีฟังก์ชั่นใหม่ตั้งแต่ 3.3.0: wp_trim_words

ฉันใช้มันนอกวงดังนี้:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

สิ่งนี้ไม่ต้องสับสนกับwp_trim_excerptซึ่งเห็นได้ชัดว่าใช้ได้เฉพาะในลูปเนื่องจากมันเรียก the_content () ภายใน


6

เพียงเพิ่มคำตอบของ MikeSchinkel ซึ่งด้วยเหตุผลบางอย่างจะไม่ทำงานสำหรับฉัน ฉันต้องเพิ่มบรรทัด setup_postdata เพื่อให้มันใช้งานได้

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

ฉันสมมติว่าคุณกำลังใช้สิ่งนี้อยู่นอกลูปดังนั้นมันจะไม่รบกวนการทำงานของ setup_postdata อื่น ๆ ที่เกิดขึ้น

ไชโย


ฉันลองคำตอบของ MikeSchinkel และมันไม่ได้ผลสำหรับฉัน การตั้งค่าข้อมูลโพสต์เป็นการหลอกลวง ในกรณีของฉันโดยไม่มี 'setup_postdata' ฟังก์ชั่นคืนชื่อ + ข้อความที่ตัดตอนมาจากโพสต์ผู้ปกครอง
turzifer

2

คำตอบของ @ Maxime จะช่วยได้ไหม

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

ดูเหมือนจะตรงไปตรงมาพอสำหรับฉัน แต่ฉันสงสัยว่าฉันขาดอะไร


1

หากโพสต์ทั้งหมดของคุณมี<!--more-->แท็กคุณสามารถใช้สิ่งต่อไปนี้พร้อมรหัสของคุณด้านบน:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

แน่นอนถ้าคุณมีโพสต์ที่ไม่มี<!--more-->แท็กโพสต์เหล่านั้นจะปรากฏอย่างครบถ้วน ทำงานได้ในสถานการณ์ของฉัน แต่ไม่ใช่สำหรับทั้งหมด ...


1

ฉันมองget_the_excerpt()ว่าเป็นฟังก์ชั่นที่มีการออกแบบดั้งเดิม เนื่องจากการใช้งาน WordPress เติบโตขึ้นมีกรณีการใช้งานใหม่ ๆ มากมายซึ่งมันไม่เหมาะสม ตัวอย่างหนึ่งคือการใช้$argsอาร์เรย์ของตัวเลือกฟังก์ชันบ่อยครั้ง

แต่มันง่ายที่จะแก้ไขตามความต้องการของคุณ นี่คือฟังก์ชั่นทางเลือกที่คุณสามารถใช้ซึ่งคุณสามารถวางไว้ที่ใดก็ได้ในfunctions.phpไฟล์ของธีมของคุณ:

function robins_get_the_excerpt($post_id) {
   global $post;  
   $save_post = $post;
   $post = get_post($post_id);
   $output = get_the_excerpt();
   $post = $save_post;
   return $output;
}

เพียงเพิ่มคำตอบของ MikeSchinkel ซึ่งด้วยเหตุผลบางอย่างจะไม่ทำงานสำหรับฉัน ฉันต้องเพิ่มบรรทัด setup_postdata เพื่อให้มันใช้งานได้


ต้องwp_reset_post_data()ทำงานภายในลูปหรือไม่
Chris Pink

เห็นได้ชัดว่า (หลังจากเดินไปรอบ ๆ บ้านหลังนี้) ตอนนี้มันเป็นส่วนหนึ่งของหลัก
Chris Pink

0

นี้เป็นเพียงเล็กน้อยสองซับผมใช้มากใช้wp_trim_words ฉันค้นหาตัวเองอย่างต่อเนื่องที่ต้องการตัวย่อและอ่านฟังก์ชั่นเพิ่มเติมนอกเหนือจากลูป บางคนอาจพบว่ามีประโยชน์ ดังนั้นนี่คือสิ่งที่ฉันใช้ในการ:

  1. รับข้อความที่ตัดตอนมาโดย POST ID
  2. รับโพสต์เนื้อหาถ้าไม่มีการตั้งค่าข้อความที่ตัดตอนมา
  3. ตั้งค่าความยาวของ Word ของข้อความที่ตัดตอนมา
  4. เลือกเนื้อหาสำหรับอ่านเพิ่มเติม (ลิงค์ / ข้อความ)

ฉันวางอินไลน์นี้ลงในเทมเพลตแบบกำหนดเองที่ฉันกำลังแก้ไข

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content  ), "20", "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>" );

ทำให้พังถล่ม

1. เนื้อหาที่ตัดตอนมา

รับข้อความที่ตัดตอนมาจากโพสต์ ID แต่รับเนื้อหาโพสต์หากไม่มีการตั้งค่าข้อความที่ตัดตอนมา

ฉันใช้หาก / อื่น PHP ชวเลข

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2. ความยาวของคำ

ตั้งค่าจำนวนคำในข้อความที่ตัดตอนมาถึง20

    "20"

3. เลือกอ่านเนื้อหาเพิ่มเติม (ลิงค์ / ข้อความ)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

ฉันเคย$dapost->guidได้รับ URL เพราะฉันไม่ต้องการ URL ที่จดจำง่ายและต้องการหลีกเลี่ยงการเรียกไปยังฐานข้อมูลอื่น คุณสามารถใช้ get_the_permalink ได้ตลอดเวลา

ดูwp_trim_wordsในเอกสาร Wordpress




-2

เร็วกว่า:

global $post;
return get_post($post_id)->post_excerpt;

1
ไม่ใช่เมื่อข้อความที่ตัดตอนว่างเปล่า…ตามที่กล่าวไว้ในคำถาม
fuxia

ไม่แน่นอนเมื่อมีการสร้างการยกเว้นโดยอัตโนมัติ
Joshc

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