wp_trim_excerptを使用してthe_excerpt()をループ外に取得する


20

私は、潜在的に数十の投稿の抜粋をホームページに表示するテーマを構築しています。私はすべての投稿に手動の抜粋がないので$post->post_excerpt、多くの投稿では空です。手動の抜粋がない場合は、組み込みのget_the_excerpt()関数を使用したいのですが、ループの外側では使用できません。

関数を追跡すると、wp-includes / formatting.phpのwp_trim_excerptを使用してその場で抜粋を作成しているように見えます。のようwp_trim_excerpt( $item->post_content )にコードで呼び出していますが 、単に完全なコンテンツを返すだけです。私は何か間違っていますか?

抜粋を作成する独自の関数を作成できることは知っていますが、可能な場合は組み込み関数を使用して、コードを他の潜在的なプラグイン/フィルターと互換性を保ちます。

http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php


抜粋フィルターを呼び出してみてください$myvar = apply_filters( 'the_excerpt', $myvar );
...-t31os

回答:



8

wp_trim_excerpt() 少し奇妙なメカニズムがあります-何かが渡されても何もしません。

基本的なロジックは次のとおりです。

  • get_the_excerpt() 手動の抜粋をチェックします。
  • wp_trim_excerpt() マニュアルの抜粋がない場合はチャイムし、コンテンツまたはティーザーから作成します。

どちらもグローバル変数と密接に結びついているため、ループします。

ループの外側では、コードwp_trim_excerpt()を削除して独自のトリム関数を記述する方が適切です。


6

更新:

これは私が使用したwp_trim_excerpt()の派生物です。完全に動作します。Wordpressバージョン3.0.4から派生

function my_excerpt($text, $excerpt)
{
    if ($excerpt) return $excerpt;

    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $text = strip_tags($text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
    if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
    } else {
            $text = implode(' ', $words);
    }

    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

新しい回答を投稿する必要はありません。いつでも古い回答を編集して新しい情報を含めることができます。たとえば、最初の回答からWPコードへのリンクをこの回答にコピーしてから、最初の回答を削除できます。
1月ファブリー

そこにあるコピー/貼り付けの場合:add $ raw_excerpt = $ text;
スヴェトスラフマリノフ

1

以下は、投稿オブジェクトまたは投稿IDをパラメーターとして受け取る「trim_excerpt」の例です。

明らかにコアにあるものに基づいています。なぜこれ(およびget_the_author())に同等の非ループがないのかわかりません。

/**
     * Generates an excerpt from the content, if needed.
     *
     * @param int|object $post_or_id can be the post ID, or the actual $post object itself
     * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
     * @return string the snipped excerpt or the manual excerpt if it exists         
     */
    function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
        if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
        else $postObj = get_post($post_or_id);

        $raw_excerpt = $text = $postObj->post_excerpt;
        if ( '' == $text ) {
            $text = $postObj->post_content;

            $text = strip_shortcodes( $text );

            $text = apply_filters('the_content', $text);
            $text = str_replace(']]>', ']]>', $text);
            $text = strip_tags($text);
            $excerpt_length = apply_filters('excerpt_length', 55);

            // don't automatically assume we will be using the global "read more" link provided by the theme
            // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
            $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
            if ( count($words) > $excerpt_length ) {
                array_pop($words);
                $text = implode(' ', $words);
                $text = $text . $excerpt_more;
            } else {
                $text = implode(' ', $words);
            }
        }
        return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
    }

0

ラストに+1。get_the_excerpt($ post-> ID)のようなものがないことは非常に奇妙です。とにかく、これはwordpressバージョン3.0.4のwp_trim_excerpt()です:

http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php

function wp_trim_excerpt($text) {
1824            $raw_excerpt = $text;
1825            if ( '' == $text ) {
1826                    $text = get_the_content('');
1827    
1828                    $text = strip_shortcodes( $text );
1829    
1830                    $text = apply_filters('the_content', $text);
1831                    $text = str_replace(']]>', ']]>', $text);
1832                    $text = strip_tags($text);
1833                    $excerpt_length = apply_filters('excerpt_length', 55);
1834                    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835                    $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836                    if ( count($words) > $excerpt_length ) {
1837                            array_pop($words);
1838                            $text = implode(' ', $words);
1839                            $text = $text . $excerpt_more;
1840                    } else {
1841                            $text = implode(' ', $words);
1842                    }
1843            }
1844            return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845    }

1826行目で、get_the_contentsを介して$ postグローバル変数にリンクされていることがわかります。そして、はい、私は彼らが何を考えていたのか分かりません。しかし、ここから、独自のmy_excerptでget_the_contentを$ textに置き換えると、同様の動作をするはずです。


azure_ardee:wp_trim_words()の使用を検討してください

0

$ more!= 0の場合、get_the_content()関数は完全なコンテンツを返します。get_the_content()関数が抜粋を返すようにするには、グローバル変数$ moreを0に設定する必要があります。

変更されたwp_trim_excerpt()関数:

function wp_trim_excerpt($text) {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        global $more;
        $tmp = $more;
        $more = 0;
        $text = get_the_content('');
        $more = $tmp;

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $text = strip_tags($text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
        if ( count($words) > $excerpt_length ) {
            array_pop($words);
            $text = implode(' ', $words);
            $text = $text . $excerpt_more;
        } else {
            $text = implode(' ', $words);
        }
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

0

上記の他の回答を使用すると、うまくいくように見える簡単な回答があります:

global $post;

$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));

if ( $excerpt == '' ) {
    $excerpt = wp_trim_words( $post->post_content, 55 );
}

<meta>OpenGraphの記述を定義するために、関数のタグで使用しています。だから私はちょうど追加します:

<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />

HTMLコンテンツはどうですか?これはタグをどのように扱いますか?抜粋は、htmlタグとショートコードも削除します。抜粋の最初の単語に画像が含まれている場合はどうなりますか?それはおそらくあなたのレイアウトを壊すでしょう。
ブレット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.