Nhận đoạn trích bằng cách sử dụng get_the_excerpt bên ngoài một vòng lặp


31

Tôi có một mã gọi get_the_title()và nó hoạt động, nhưng get_the_excerpt()trả về sản phẩm nào. Làm thế nào tôi có thể làm cho nó hoạt động?

Mã này nằm trong một plugin có tên là "Giao thức Open Facebook của WP". Đây là phần tôi muốn thay đổi:

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

Ở đây, has_excerptluôn luôn thất bại và get_the_excerpt($post->ID)không làm việc nữa (không dùng nữa).

Vì vậy, làm thế nào tôi có thể hiển thị đoạn trích ở đó?

ps: Tôi cũng đang sử dụng plugin "Advanced Excerpt"


ok, có nó bằng cách sử dụng my_excerpt($post->post_content, get_the_excerpt())và sử dụng my_excerpt()chức năng từ wordpress.stackexchange.com/questions/6961/iêu
ariel

3
Vui lòng thêm giải pháp mà bạn đã đưa ra như một câu trả lời, vì vậy đây không phải là trang web ám ảnh như câu hỏi chưa được trả lời. :)
Rarst

Chỉ cần sử dụng chức năng the_post()(nó cũng hoạt động trên mẫu bài đăng đơn) trước khi bạn gọi get_the_excerpt()nó sẽ thiết lập dữ liệu cần thiết cho bạn.
Sisir

Câu trả lời:


29

Tôi tìm thấy câu hỏi này khi tìm cách làm điều này mà không có đối tượng bài.

Nghiên cứu bổ sung của tôi đã đưa ra kỹ thuật khéo léo này:

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


1
Điều này nên được chấp nhận như là câu trả lời vì đó là cách được khuyến nghị để kéo dữ liệu ra ngoài vòng lặp. Cũng không yêu cầu bất kỳ chức năng tùy chỉnh hoặc ghi đè của $postbiến toàn cục.
MacK

4
nó trả về chuỗi rỗng.
Kyaw Tun

1
@KyawTun - nó hoạt động, miễn là $post_idđược đặt (giá trị của $post_id? VÀ $post_idlà một ID bài đăng hợp lệ, hợp lệ.
cale_b

2
@cale_b Cảm ơn. Tôi sử dụng truy vấn get_posts và nhận ID từ mảng kết quả. Đối tượng bài đăng có post_title, post_content, ID, v.v. Nhưng không hoạt động.
Kyaw Tun

Nếu bạn cần CHỈ thẻ TEXT và không phải thẻ <p> được bao gồm trong bộ lọc_excerpt, thì hãy sử dụng bộ lọc "get_the_excerpt", để bộ lọc ở trên trở thành: $ text = application_filters ('get_the_excerpt', get_post_field ('post_excerpt' ); điều này sẽ cung cấp cho bạn văn bản RAW mà bạn có thể chèn vào bất cứ đâu trong phần đánh dấu của riêng bạn.
Mohsin

22

Vì có vẻ như bạn đã có đối tượng bài đăng mà bạn cần trích đoạn, bạn chỉ có thể buộc mọi thứ hoạt động:

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

Các setup_postdata()chức năng sẽ toàn cầu hóa $postđối tượng và làm cho nó có sẵn cho chức năng loop cũ thường xuyên. Khi bạn ở trong vòng lặp, bạn gọi the_post()và nó sẽ thiết lập mọi thứ cho bạn ... bên ngoài vòng lặp bạn cần buộc nó bằng tay.


1
Điều này hoạt động nhưng: "Bạn phải chuyển tham chiếu đến $postbiến toàn cục, nếu không các chức năng như the_title()không hoạt động đúng." global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
deach

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

18

Thử đi:

Tạo một hàm mới trong hàm.php và sau đó gọi nó từ bất cứ đâu.

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

Đây là một bài viết mô tả mã.


1
Tuyệt vời tìm bạn của tôi. Tôi chưa bao giờ hiểu tại sao WordPress lại từ chối một chức năng quan trọng như vậy. Điều này có hiệu quả xây dựng lại từ đầu, nhưng nó hoạt động. Dựa vào tần suất chúng tôi sử dụng đoạn trích bên ngoài vòng lặp với các tính năng như plugin chia sẻ xã hội, có lẽ nó vẫn là một phần của cốt lõi.
Ý tưởng bắt buộc

1
Câu trả lời của EAMann là một cách tiếp cận tốt hơn cho vấn đề này, và nên được coi là cách thực hành tốt nhất. Cách tiếp cận này về cơ bản là sao chép nội bộ của Core thay vì sử dụng API.
Ian Dunn

9

Bây giờ bạn chỉ có thể sử dụng get_the_excerpt( $postID )chức năng. Vì: WordPress 4.5.0 đã giới thiệu $posttham số.


1
Đây phải là câu trả lời mới được chấp nhận vì chúng ta đang ở thời đại WP 4.5 +.
Matija Mrkaic

18
Điều này sẽ không hoạt động nếu đoạn trích trống vì wp_trim_excerptbộ lọc sẽ trả về đoạn trích cho bài viết hiện tại.
Dylan

9
Xem core.trac.wordpress.org/ticket/36934 để biết chi tiết về những gì @Dylan nói
kraftner

5

có nó bằng cách sử dụng my_excerpt($post->post_content, get_the_excerpt())và sử dụng my_excerpt()hàm từ Sử dụng wp_trim_excerpt để lấy the_excerpt () bên ngoài vòng lặp


2
Câu trả lời chỉ liên kết là không tốt. Sao chép mã có liên quan ở đây. Khi liên kết đó bị hỏng, trang web đó bị hỏng / biến mất, thì câu trả lời này không có giá trị.
cale_b

Nó làm việc hoàn hảo cho tôi!
Saikat

1

Trong trường hợp bạn không có đối tượng bài đăng, đây là một chức năng ngắn như chức năng từ Withers.

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

Nhưng người hỏi có một đối tượng bài như đã nêu trong câu hỏi.
fuxia

3
Sửa lỗi cho tôi nếu tôi sai, phương pháp này sẽ trả về đoạn trích thủ công nhưng sẽ không tạo ra nếu cần
Bill

1

Đây là khi bạn muốn sử dụng get_the_excerpt()bên ngoài vòng lặp:

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

Đây là cách trực tiếp nhất để làm điều đó .. Không chắc chắn đó là hiệu suất tuyệt vời mặc dù. Bạn vẫn nhận được +1 của tôi
Bill

1

Nếu bạn muốn tự động tạo đoạn trích từ nội dung trong một dòng - bạn có thể sử dụng wp_trim_wordschức năng như thế này:

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

Vui lòng chỉnh sửa câu trả lời của bạn và thêm một lời giải thích: tại sao điều đó có thể giải quyết vấn đề?
fuxia
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.