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から厳しいメッセージを送信されないようにするには、「Marvellous」をクロージングとして使用しないでください。(そしてメッセンジャーを撃ってはいけない)
MikeSchinkel

回答:


20

こんにちは、@ Robin I. Knight:

get_the_excerpt()はレガシーデザインの機能として見ています。WordPressの使用が拡大するにつれて、多くの新しいユースケースがありますが、それは適合しませんが、異なるデータを取得するための新しい関数が適合します。1つの例は、$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つのget投稿は常に同じです。ここにリンクがあり、あなたは私が意味するものを見るでしょう。右側の4つの投稿を見てください。divethegap.com/update/community/feedback/2010/06/steve-riches
ロビンIナイト

@Robin I Knight:質問の更新としてループソースコードを投稿してください。コードを見ずにコードをデバッグするのは非常に困難です。また、問題を引き起こしているのはおそらくプラグインです。一度に1つずつ無効にしてみてください。
MikeSchinkel

上記のループソースコードをループ^^
ロビンIナイト

ところで関数の名前をget_the_excerpt_id($ post_id)に変更しました
ロビンIナイト

@Robin I Knight-ループには何も表示されませんがsetup_postdata($post)、@ Rarstが示唆しているように、ループの最初に呼び出してみてください。それでもうまくいかない場合は、無効にする必要があるプラグインである可能性があります。試しましたか?またget_the_excerpt_id()、WordPressは将来その機能を追加してサイトを破壊する可能性があるため、おそらく呼び出したくないでしょう。そして、foreach($stories as $story): global $post; $post = $story;代わりに使用することで、ループ内の関数なしでおそらく実行できます。
MikeSchinkel

16

抜粋の仕組みは非常に紛らわしいです。あなたの質問に対する正確な答えではありませんが、一般的に、ループ固有のテンプレートタグを作成する必要がある場合、返された配列をget_posts()次のようにエミュレートできます:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

wp_reset_query()はどうですか??
cwd

1
setup_postdata()グローバルクエリの使用のみが影響を受けず、投稿データのみをリセットする必要がある場合は、@ cwd 。
ラルスト

このソリューションは、別の変数に投稿を保存し、グローバルに取得するためだけに別の投稿を取得するよりもきれいです。+1
バリークージ

助けてくれた@Rarstに感謝します。setup_postdata($ post)の追加; 私の問題を解決した
サイモン

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

これは、内部でthe_content()を呼び出すため、明らかにループ内でのみ機能するwp_trim_excerptと混同しないでください。


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

場合はALLあなたの投稿は持っている<!--more-->タグを、あなたはあなたのコードの上で、次を使用することができます。

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

もちろん、<!--more-->タグが付いていない投稿がある場合は、その投稿全体が表示されます。私の状況では機能しますが、すべてではありません...


1

get_the_excerpt()はレガシーデザインの機能として見ています。WordPressの使用が拡大するにつれて、多くの新しいユースケースがありますが、それは適合しませんが、異なるデータを取得するための新しい関数が適合します。1つの例は、$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()はループ内で動作する必要がありますか?
クリスピンク

どうやら(この特定の家を回った後)、今ではコアの一部です。
クリスピンク

0

これはwp_trim_wordsを利用してよく使う2行の小さなライナーです。私は絶えず略語を必要とすることに気付き、ループの外でより多くの機能を読みました。他の誰かがこれを役に立つと思うかもしれません。だからこれは私が使用するものです:

  1. POST IDで抜粋を取得
  2. 投稿コンテンツの取得抜粋が設定されていない場合、
  3. 抜粋の語長を設定する
  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で抜粋を取得しますが、抜粋が設定されていない場合は投稿コンテンツを取得します。

If / Else 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. ReadMore Content(Link / Text)を選択します

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

以前$dapost->guidはわかりやすいURLが必要なかったため、URLを取得していましたが、DBへの別の呼び出しを避けたいと考えていました。常にget_the_permalinkを使用できます。

Wordpressドキュメントのwp_trim_wordsを参照してください。


0

これは私のために働いた:

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


-2

これは高速です:

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

1
質問に記載されているように、抜粋が空の場合ではありません。
FUXIA

実際、例外が自動的に生成されるときではありません
ジョシュ

これは役に立たないのでダウン票
Pieter Goosen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.