web-dev-qa-db-ja.com

抜粋/ティーザーをループに入れる方法

「ループ」(アーカイブページなど)に入っているとき、<!--more-->タグが含まれているかどうかにかかわらず、どの記事を強制的にすべての記事に強制的に表示しますか。

詳細:

私は _sテンプレート _を使用してブログ投稿コンテンツを表示するcontent.phpテンプレートから始めます。ここではthe_content()関数を呼び出します。この関数は投稿を調べて<!--more-->タグを見つけようとします。見つかった場合はティーザーと 続きを読む リンクを返します。見つからない場合は単純に投稿全体を出力します。

最初の部分、つまりコンテンツ作成者がそれを使用した場合は<!--more-->タグを尊重しますが、忘れた場合はとにかく自動的にティーザー/抜粋を表示します(最初の段落または2段落など)。

これを行うための最良の方法は何ですか? the_contentフィルタ がありますが、もっとカスタマイズテキストを読むことはできません。あなたは何をお勧めします?

7
Borek Bernard

_編集_

そうですね、私はこれまで知りませんでしたし、@ kaiserによって大いに説明された非常に隠されたネイティブ関数get_extended()があります 彼の答え 。私の答えは@kaiserによる答えへの拡張であるべきです

元の答え

これを行うためのネイティブ関数はありません。ここでの最善の方法は、 strpos のようなPHP関数を使用してmoreタグを検索し、その結果に従って何かを実行することです。

あなたはこのようなことを試すことができます

if( strpos( $post->post_content, '<!--more-->' ) ) {
    the_content( __( '&hellip; Read more about this article <span class="meta-nav">&rarr;</span>' ) );
}
else {
    the_excerpt();
}
3
Pieter Goosen

もちろん、コンテンツの<!--more-->タグの前後にある部分を取得するためのAPI関数があります。 zero という命名規則のため、WPの中の便利な部分はよく見過ごされています: get_extended()

// In the loop, after `the_post()` filled the global `$post`:
$info = get_extended( $post );

// The resulting data is an Array:
[Array] $info 
    'main'      => the text before the `<!--more-->`
    'extended'  => the content after the `<!--more-->` comment
    'more_text' => the custom "Read More" text

結果は次のようになります。

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post();

        $info = get_extended( $GLOBALS['post'] );

        if ( ! empty( $info['extended'] ) )
        {
            the_content( ! empty( $info['more_text'] ) ? $info['more_text'] : 'Read more' );
        }
        else
        {
            the_excerpt();
        }
    }
}

<!--more-->の存在に基づいて抜粋と内容を切り替えます。デフォルトでは、WPはスペースなしの<!--more--> のみを受け入れます 。あなたの作者がそれを手でタイプしてスペースを追加するならば、<!-- more -->は(いずれにせよ)機能しません。

8
kaiser