サポート » 使い方全般 » content(本文)表示とexcerpt(抜粋)表示を切り替えて表示したいです。

  • 解決済 luvjapan

    (@luvjapan)


    連投してしましたした(;´д`)ゞすみません。。。

    blog一覧表示にて下記の様に本文を取得して表示させています。

    <?php if(is_home() )
    if(mb_strlen($post->post_content, ‘UTF-8’)>200){
    $content= mb_substr(strip_tags($post->post_content, ‘<p><span>’), 0, 200, ‘UTF-8’);
    $content = strip_shortcodes( $content );
    echo $content.”;
    }else{
    echo strip_tags(the_content(), ‘<p><span>’);
    } ?>

    上記は$content= mb_substr(strip_tags($post->post_content, ‘<p><span>’), 0, 200, ‘UTF-8’);にて<p><span>のタグを残してblog一覧表示の本文で改行表示出来る様にしております。
    次に$content = strip_shortcodes( $content );にてショートコードがblog一覧で表示
    されない様にしております。
    ここまでは狙った通りの表示が出来たのですが投稿画面にて本文のみの表示の場合は良いのですが抜粋入力欄に入力した際はこのコードだけではblog一覧に表示されません。
    そこで<?php the_excerpt(); ?>のタグを利用して本文のみの場合はcontentを取得し抜粋入力欄がある場合は優先的にexcerptを取得する様にしたいのですが

    <?php
    if(is_home()) {
    the_excerpt(); //抜粋を表示する
    } else {
    the_content(); //全文を表示する
    }
    ?>

    上記を参考に
    <?php if(is_home()) {
    the_excerpt();
    } else {
    if(mb_strlen($post->post_content, ‘UTF-8’)>200){
    $content= mb_substr(strip_tags($post->post_content, ‘<p><span>’), 0, 200, ‘UTF-8’);
    $content = strip_shortcodes( $content );
    echo $content.”;
    }else{
    echo strip_tags(the_content(), ‘<p><span>’);
    }
    } ?>
    という風に書き込んでもecho strip_tags(the_content(), ‘<p><span>’);や$content = strip_shortcodes( $content );のタグが有効にならず
    <?php the_excerpt(); ?>のみを書き込んだのと同じ表示になってしまいます。

    『抜粋がある場合は抜粋を出力し、ない場合は改行が有効でショートコードが非表示の本文を取得する』という様にしたいのですがどの様にコードを書けば宜しいでしょうか?

    わかる方がいましたら是非ご教授下さい。

    宜しくお願い致します。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • the_contentその関数自体で出力を行い、返り値は持ちません。

    代わりに本文を取得するにはget_the_contentを使用してください。しかし、この関数はthe_contentフィルターを適用していない本文を返します。(必要に応じて自分で通してください。)

    Hinaloe様

    ご回答ありがとうございます。
    get_the_contentにて書き換えてみたり色々試してみました。

    抜粋表示はうまくいったのですが

    やはり抜粋が入力がない場合でのcontent取得文章で改行がうまくできません。

    フィルターの適用はどの様にしたらよろしいでしょうか?

    excerptとcontentをあるかないかで切り替えて表示する様なことはできないのでしょうか?

    恐れ入りますが教えていただければ幸いです。

    宜しくお願い致します。

    モデレーター Okamoto Hidetaka

    (@hideokamoto)

    get_the_excerpt()の戻り値が空ならexcerptが存在しないと判断するとかでどうですかね?
    https://codex.wordpress.org/Function_Reference/get_the_excerpt

    Okamoto様、回答ありがとうございます。
    難しいですが現在翻訳しながら勉強中です。

    何度もすみません。。。

    <?php if ( has_excerpt() ) : $excerpt = get_the_excerpt(); ?>
    <div class=”excerpt”><?php echo nl2br($excerpt); ?></div>
    <?php endif; ?>
    上記の抜粋のみの表示と

    下記の改行形成されされ、ショートコードを削除したコンテンツ文章を抜粋を優先に切り替え表示出来ないでしょうか?
    <p><?php } ?>
    <?php
    //i,p,br,spanを残す
    if(mb_strlen($post->post_content, ‘UTF-8’)>200){
    $content= mb_substr(strip_tags($post->post_content, ‘<i><p>
    <span>’), 0, 200, ‘UTF-8’);
    $content = strip_shortcodes( $content );
    echo $content.”;
    }else{
    echo strip_tags(the_content(), ‘<i><p></p>

    <span></span>’);
    }
    ?></p>

    抜粋がある場合は抜粋表示し、ない場合はコンテンツから指定文字数表示するというかんじです。

    また、もう少し他に方法があればアドバイスをいただければと思います。

    http://wordpress.hitsuji.me/show-excerpt/#A0.B0.C3.D4.E4.F0
    あたりが、まさにやりたいことじゃないでしょうか。

    kimipooh様、回答ありがとうございます。

    こちらの方は以前試していまして、再度挑戦してみたのですがcontentだけだと改行がうまく

    表示されるのですがexcerptのタグを使用すると改行がきかなくなるという状況です。

    つまり、get_the_content で改行されないってことですかね。

    http://www.y-com.info/contents/?p=1249

    を参考に改行ありで content データを取得したらどうでしょうか。

    kimipooh様、返事が遅くなり申し訳ありません。そして、回答ありがとうございます。

    色々試行錯誤したのですがなかなかうまくいかず
    かなり強引でスマートではない方法でとりあえずは思う様に表示させております。

    <div class=”post-content”>
    <?php if(has_excerpt()) {
    the_excerpt();
    echo ”;
    } else {
    if(mb_strlen($post->post_content, ‘UTF-8’)>200){
    $content= mb_substr(strip_tags($post->post_content, ‘<i><p>
    <span>’), 0, 200, ‘UTF-8’);
    $content = strip_shortcodes( $content );
    echo $content.”;
    } else {
    echo strip_tags(get_the_content(), ‘<i><p>
    <span>’);
    }
    }
    ?>
    </div>

    loopにてこの様に記述し、画像が2つ表示されるところをcssで
    .post-content a {
    display:none ;
    }

    と言う様にしました。

    もっとスマートな方法がありそうです。

    .post-content a {
    display:none ;
    }
    はなくても平気でした。

    度々すみません。
    上記ですとショートコードが表示されましたので追加しました。

    <div class=”post-content”>
    <?php if(has_excerpt()) {
    the_excerpt();
    echo ”;
    } else {
    if(mb_strlen($post->post_content, ‘UTF-8’)>200){
    $content= mb_substr(strip_tags($post->post_content, ‘<i><p>
    <span>’), 0, 200, ‘UTF-8’);
    $content = strip_shortcodes( $content );
    echo $content.”;
    } else {
    echo strip_shortcodes(strip_tags(get_the_content(), ‘<i><p>
    <span>’));
    }
    }
    ?>
    </div>

    この様にいたしました。
    間違いなどがございましたらアドバイスいただければ助かります。

    宜しくお願い致します。

    スマートというなら、次のような感じでかけるかなーと思います。

    抜粋がある = 抜粋を表示(the_excerpt()を利用)
    抜粋がない = the_excerpt() の中身をフックにて動作を改変する。

    コードとしては、下記のように抜粋がなけれは the_excerpt関数は、 new_the_excerpt関数を通過させる。いずれにしても the_excerpt関数で表示させるってことです。なのでとても短くなります。

    if( ! has_excerpt()){
      add_filter( 'the_excerpt', 'new_the_excerpt' );
    }
    the_excerpt();
    echo '';

    のみを書いておいて、 functions.php の方に抜粋がなかった時ようの関数、new_the_excerptを用意します。

    function new_the_excerpt( $excerpt ) {
         $excerpt_length = 200;
         $content = apply_filters('the_content', get_the_content());
    
         $content = strip_tags($content, '<i><p><span>');
         $content = strip_shortcodes( $content );
    
         $content = mb_substr ( $content, 0, $excerpt_length, 'UTF-8');
    
         return $content;
    }

    kimipooh様、本当にありがとうございます。

    まさに自分が追い求めていた形です。

    自分の環境では functions.php の方に

    function new_the_excerpt( $excerpt ) {
         $excerpt_length = 200;
         $content = apply_filters('the_content', get_the_content());
         $content = strip_shortcodes(strip_tags(get_the_content(), '<i><p><br><span>'));
         $content = mb_substr ( $content, 0, $excerpt_length, 'UTF-8');
         return $content;
    }

    でショートコードも消えました!

    $content = apply_filters('the_content', get_the_content());
    の一行は試しに削除してみたところ表示は変わらないのですがこのタグはなくてはまずいでしょうか?

    それで改行問題が出なければ、いらないですね。 get_the_content 関数を2度読んでいるので、最初のやつがいずれにせよ無効状態なので。

    kimipooh様、返事が遅くなり大変申し訳ありません。

    無事に理想通りの表示が出来ました。

    本当に助かりました。ありがとうございます。

14件の返信を表示中 - 1 - 14件目 (全14件中)
  • トピック「content(本文)表示とexcerpt(抜粋)表示を切り替えて表示したいです。」には新たに返信することはできません。