NHẬN đoạn trích bằng ID


31

Tại sao người ta không thể lấy đoạn trích bằng ID như với tiêu đề và hầu hết các yếu tố khác.

ví dụ. get_the_excerpt (ID). Tôi biết cách sử dụng nó với hàm $ post-> post_excerpt nhưng điều đó không trả về một phần nội dung nếu không có đoạn trích nào được nhập, đơn giản không trả về gì.

Vì vậy, những gì tôi đang cố gắng làm là lấy đoạn trích bằng ID nếu có đoạn trích và nếu không có đoạn trích với ID đó nhưng có một số nội dung, để lấy một số nội dung thay thế.

Làm thế nào một người sẽ làm điều đó.

Bất kỳ ý tưởng,

Kỳ diệu ...

CHỈNH SỬA --

Mã nguồn vòng lặp theo yêu cầu.

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

chính xác thì "một số" nội dung là gì?
kaiser

Hàm trích đoạn trong wordpress trả về đoạn trích của bài viết. Nếu bài đăng không có đoạn trích, nó sẽ trả về một số ký tự nhất định của nội dung theo sau là '...' hoặc 'đọc thêm' hoặc bất cứ điều gì mẫu cung cấp
Robin I Knight

1
Không phải là một PITA nhưng các quy tắc cộng đồng không cho phép chữ ký và đóng cửa tiêu chuẩn. Vì vậy, để tuân thủ các quy tắc và tránh để Jeff Atwood gửi cho bạn một tin nhắn nghiêm khắc sau khi chỉnh sửa tất cả các câu hỏi của bạn, vui lòng ngừng sử dụng "Marvelous" như một kết thúc. (Và xin đừng bắn sứ giả)
MikeSchinkel

Câu trả lời:


20

Xin chào @Robin I. Hiệp sĩ:

Tôi xem get_the_excerpt()như là một chức năng với thiết kế di sản. Khi việc sử dụng WordPress đã phát triển, có nhiều trường hợp sử dụng mới hơn, nơi nó không phù hợp nhưng nơi các chức năng mới hơn để nhận dữ liệu khác nhau thực hiện. Một ví dụ là việc sử dụng thường xuyên một $argsloạt các tùy chọn chức năng.

Nhưng nó dễ dàng để sửa chữa cho nhu cầu của bạn. Đây là một chức năng thay thế mà bạn có thể sử dụng mà bạn có thể đặt ở bất kỳ đâu trong functions.phptệp của chủ đề :

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

Tôi đã không kiểm tra nó nhưng tôi khá chắc chắn rằng tôi đã hiểu đúng. Nếu điều này không đáp ứng nhu cầu của bạn, xin hãy giải thích và có lẽ tôi có thể đưa ra những gợi ý khác.


Nó hoạt động. Sắp xếp Kết quả rất kỳ quặc. Nó chắc chắn thực hiện chức năng của nó nhưng kết quả là kỳ lạ. Tôi đang sử dụng nó cùng với GET_Posts và vì một số lý do, 2 bài đăng hàng đầu luôn luôn giống nhau. Đây là một liên kết và bạn sẽ thấy những gì tôi muốn nói. Nhìn vào 4 bài viết ở phía bên tay phải. divethegap.com/update/community/feedback/2010/06/steve-riches
Robin I Knight

@Robin I Knight: Vui lòng gửi mã nguồn vòng lặp của bạn dưới dạng cập nhật cho câu hỏi của bạn; rất khó để gỡ lỗi mã mà không thấy mã. Nó cũng có thể là một plugin gây ra vấn đề; hãy thử vô hiệu hóa chúng cùng một lúc.
MikeSchinkel

Lặp lại mã nguồn trong câu hỏi trên ^^
Robin I Knight

BTW Tôi đã thay đổi tên của hàm thành get_the_excerpt_id ($ post_id)
Robin I Knight

@Robin I Knight - Tôi không thấy bất cứ điều gì trong vòng lặp của bạn, nhưng bạn có thể thử gọi setup_postdata($post)ở đầu vòng lặp của mình, như @Rarst gợi ý. Nếu nó không hoạt động, nó có thể là một plugin bạn cần phải tắt; bạn đã thử chưa Và có lẽ bạn không muốn gọi nó get_the_excerpt_id()vì WordPress có thể thêm chức năng đó trong tương lai và phá vỡ trang web của bạn. Và bạn có thể có thể làm mà không có chức năng trong vòng lặp của bạn bằng cách sử dụng foreach($stories as $story): global $post; $post = $story;thay thế.
MikeSchinkel

16

Các cơ chế của đoạn trích là vô cùng khó hiểu. Đây không phải là câu trả lời chính xác cho câu hỏi của bạn, nhưng nói chung nếu bạn cần tạo các thẻ mẫu, cụ thể cho Loop, hoạt động với mảng được trả về, get_posts()bạn có thể mô phỏng Loop như thế này:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

những gì về wp_reset_query (); ?
cwd

1
@cwd nếu chỉ sử dụng setup_postdata()truy vấn toàn cầu thì không bị ảnh hưởng và chỉ cần đăng lại dữ liệu.
Hết

Giải pháp này sạch hơn so với việc lưu trữ bài đăng trong một var khác và yêu cầu một bài đăng khác chỉ để đưa nó ra toàn cầu. +1
Barry Kooij

Cảm ơn @Rarst đã giúp tôi ra ngoài. Thêm setup_postdata ($ post); đã giải quyết các vấn đề của tôi
Simon

8

Có một chức năng mới kể từ 3.3.0: wp_trim_words

Tôi đang sử dụng nó bên ngoài vòng lặp như sau:

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

Điều này không bị nhầm lẫn với wp_trim_excerpt mà dường như chỉ hoạt động trong vòng lặp, vì nó gọi the_content () bên trong.


6

Chỉ cần thêm vào câu trả lời của MikeSchinkel, vì một số lý do sẽ không hiệu quả với tôi. Tôi đã phải thêm dòng setup_postdata để làm cho nó hoạt động.

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;

}

Tôi giả sử nếu bạn đang sử dụng điều này bên ngoài vòng lặp thì nó không nên can thiệp vào setup_postdata khác đang diễn ra.

Chúc mừng


Tôi đã thử câu trả lời của MikeSchinkel và nó không hiệu quả với tôi. Thiết lập dữ liệu bài viết đã lừa. Trong trường hợp của tôi không có 'setup_postdata', hàm trả về tiêu đề + đoạn trích của bài đăng gốc.
turzifer

2

Dựa trên câu trả lời của @ Maxime, điều này có hiệu quả không?

$post = get_post( $id );

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

Nó dường như đủ thẳng về phía tôi, nhưng tôi tự hỏi liệu tôi có thiếu thứ gì không.


1

Nếu TẤT CẢ các bài đăng của bạn có <!--more-->thẻ, thì bạn có thể sử dụng thông tin sau với mã của mình ở trên:

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

Tất nhiên, nếu bạn có bất kỳ bài đăng nào không có <!--more-->thẻ, chúng sẽ được hiển thị toàn bộ. Hoạt động trong hoàn cảnh của tôi, nhưng không phải cho tất cả ...


1

Tôi xem get_the_excerpt()như là một chức năng với thiết kế di sản. Khi việc sử dụng WordPress đã phát triển, có nhiều trường hợp sử dụng mới hơn, nơi nó không phù hợp nhưng nơi các chức năng mới hơn để nhận dữ liệu khác nhau thực hiện. Một ví dụ là việc sử dụng thường xuyên một $argsloạt các tùy chọn chức năng.

Nhưng nó dễ dàng để sửa chữa cho nhu cầu của bạn. Đây là một chức năng thay thế mà bạn có thể sử dụng mà bạn có thể đặt ở bất kỳ đâu trong functions.phptệp của chủ đề :

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

Chỉ cần thêm vào câu trả lời của MikeSchinkel, vì một số lý do sẽ không hiệu quả với tôi. Tôi đã phải thêm dòng setup_postdata để làm cho nó hoạt động.


Điều này có cần wp_reset_post_data()phải làm việc bên trong vòng lặp?
Chris Pink

Rõ ràng (sau khi đi xung quanh ngôi nhà đặc biệt này) giờ đây nó là một phần cốt lõi.
Chris Pink

0

Đây là một ít hai lớp tôi sử dụng rất nhiều sử dụng wp_trim_words . Tôi liên tục thấy mình cần viết tắt và đọc thêm các chức năng bên ngoài vòng lặp. Một số người khác có thể tìm thấy điều này hữu ích. Vì vậy, đây là những gì tôi sử dụng để:

  1. Lấy đoạn trích bằng POST ID
  2. Nhận nội dung bài đăng Nếu không có trích đoạn nào được đặt,
  3. Đặt độ dài từ của đoạn trích
  4. Chọn nội dung để đọc thêm (Liên kết / văn bản)

Tôi đặt nội tuyến này, trực tiếp trong mẫu tùy chỉnh tôi đang chỉnh sửa.

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

Phá vỡ

1. Nội dung đoạn trích

Lấy đoạn trích bằng ID bài viết, nhưng lấy nội dung bài đăng nếu không có đoạn trích nào được đặt.

Tôi đang sử dụng tốc ký của If / Else PHP .

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

2. Độ dài từ

Đặt lượng từ trong Trích dẫn thành 20

    "20"

3. Chọn Nội dung ReadMore (Liên kết / Văn bản)

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

Tôi đã từng $dapost->guidnhận URL, vì tôi không cần URL thân thiện và muốn tránh một cuộc gọi khác đến DB. Bạn luôn có thể sử dụng get_the_permalink.

Xem wp_trim_words trong Tài liệu Wordpress.


0

Điều này làm việc cho tôi:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));


-2

Cái này nhanh hơn:

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

1
Không phải khi đoạn trích là trống rỗng như đã đề cập trong câu hỏi.
fuxia

Thật vậy, không phải khi một ngoại lệ được tạo tự động
Joshc

Bị đánh giá thấp vì điều này không hữu ích
Pieter Goosen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.