ループ外で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」プラグインも使用しています


わかりました、wordpress.stackexchange.commy_excerpt($post->post_content, get_the_excerpt())my_excerpt()
questions / 6961 /の

3
答えとして思いついた解決策を追加してください。そうすれば、これは未回答の質問としてサイトに出没しません。:)
ラースト

the_post()呼び出す前に関数を使用して(単一の投稿テンプレートでも機能します)、get_the_excerpt()必要なデータをセットアップします。
シシル14

回答:


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

the_excerptフィルターに含まれる<p>タグではなくTEXTだけが必要な場合は、「get_the_excerpt」フィルターを使用して、上記のフィルターが次のようになるようにします。 ); これにより、独自のマークアップの任意の場所に挿入できるRAWテキストのみが提供されます。
モーシン

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

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

18

これを試して:

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

コードを説明する投稿があります。


1
素晴らしい私の友人を見つけます。WordPressがこのような重要な機能を非推奨にする理由を理解したことはありません。これは効果的にゼロから再構築しますが、機能します。ソーシャル共有プラグインなどの機能でループの外側の抜粋を使用する頻度を考えると、おそらくコアの一部であるはずです。
命令的なアイデア

1
EAMannの答えは、この問題に対するはるかに優れたアプローチであり、ベストプラクティスと見なされるべきです。このアプローチは、基本的にAPIを使用する代わりにCoreの内部を複製します。
イアン・ダン

9

これで、単純にget_the_excerpt( $postID )関数を使用できます。以来:WordPress 4.5.0で$postパラメーターが導入されました。


1
私たちはWP 4.5 +時代にいるので、これは新しく受け入れられた答えになるはずです。
マティヤムルカイク

18
wp_trim_excerptフィルターが現在の投稿の抜粋を返すため、抜粋が空の場合、これは機能しません。
ディラン

9
参照してくださいcore.trac.wordpress.org/ticket/36934 @Dylanが言ったことの詳細について
kraftner

5

それは使用して得たmy_excerpt($post->post_content, get_the_excerpt())し、使用してmy_excerpt()から機能をループの外()the_excerpt取得するwp_trim_excerptを使用しました


2
リンクのみの回答は良くありません。関連するコードをここにコピーします。そのリンクが壊れている場合、そのサイトはダウン/消失しているため、この回答には価値がありません。
cale_b

それは私にとって完璧に機能しました!
サイカット

1

postオブジェクトがない場合は、Withersのような短い関数があります。

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

しかし、質問者は質問で述べられているように投稿オブジェクトを持っています。
FUXIA

3
間違っている場合は修正してください。このメソッドは手動の抜粋を返しますが、必要に応じて抜粋を生成しません
Bill

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を取得します
ビル14年

1

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.