web-dev-qa-db-ja.com

ループの外側でget_the_excerptを使用して抜粋を取得する

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"プラグインも使っています

30
ariel
5
ariel

この質問をwithout postオブジェクトでどのように実行するかを見たときに私は見つけました。

私の追加の研究はこの滑らかなテクニックを生み出しました:

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

27
cale_b

抜粋が必要なpostオブジェクトが既にあるように思われるので、単に物事を機能させることができます。

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

setup_postdata()関数は$postオブジェクトをグローバル化し、それを通常の古いループ関数で利用できるようにします。あなたがループの内側にいるとき、あなたはthe_post()を呼び出します、そしてそれはあなたのために物事をセットアップします...あなたはそれを手動で強制する必要があるループの外側に。

21
EAMann

これを試して:

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

これがコードを説明する投稿です。

18
Withers Davis

今、あなたは単に get_the_excerpt( $postID ) 関数を使うことができます。 WordPress 4.5.0から$postパラメータが導入されました。

8
docker

これはループの外で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
Gixty

あなたがpostオブジェクトを持っていない場合、これはWithersからのもののような短い関数です。

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

1行の内容から抜粋を自動的に生成したい場合は、 wp_trim_words 関数を次のように使用します。

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
1
Picard