apply_filters()とthe_excerptが予期しない結果を出している


10

ここにはかなり明白なものが欠けているように感じますが、WordPressに協力してもらうことができません。

関数を使用してFacebook OGタグを生成しています。抜粋を除いて、すべて正常に動作します。

の廃止によりget_the_excerpt($post->ID)、まったく新しいループを作成せずに抜粋を作成する別の方法はありますか?それは私には過剰に思えます。

私の最初の本能は使用することでしたapply_filters()

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

これで、HTML形式のコンテンツを含む完全な投稿が得られます。間違いです。だから私は次の論理的なアイデアを試しました:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

サイコロはありません。現在HTMLはありませんが、それでも完全な投稿です(これは本当に混乱します)。

大丈夫、問題無い。気の利いたものをすべてスキップして、トリミングされたエントリに移動します。

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

変化なし。

だから、私の質問はこれです:一体何が起こっているのですか?ここに何か欠けているものはありますか?

私はWPコアに入り、どのようにthe_excerpt()機能するかを見つけました、そしてそれは私の呼び出しと同じように見えます:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

私の調査結果に基づいて、いくつか質問があります。

  1. フィルターが期待どおりに適用されないのはなぜですか?
  2. 新しいループを作成せずにループの外で抜粋を取得する方法はありますか?
  3. 私は狂っていますか?

ご覧いただきありがとうございます。私はここでかなり困惑しています。


get_the_excerpt()は非推奨ではなく、渡されていた余分なパラメータが使用されなくなっただけです。
Milo

申し訳ありません、それは私が意味したことです。明確にしていただきありがとうございます。
jlengstorf 2011

あなたは狂っている!。。。私は
笑っ

回答:


16

答えはにあることがわかりましたwp_trim_excerpt()

それはで定義されていwp-includes/functions.php:1879ます:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

そのため、渡されたテキストは処理されません。空のパラメーターで呼び出された場合にのみ機能します。

これを解決するために、問題を解決するクイックフィルターをテーマに追加しました。

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

多少冗長ですが、抜粋を生成するたびに新しいループを開くよりも好きです。


1
ああ、テキスト操作だけを探しているのか(DBからフェッチしていないのか)ははっきりしませんでした。
hakre

心配ない。質問するとき、自分が意味をなさないことを常に恐れています。私データベースからプルしていましたが、get_the_title($post->ID)利用可能なものがあるので、「別のループ」全体を開きたくありませんでした。コードの最終行は$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf 2012年

私はこれを尋ねるのは本当に愚かですが、この新しいフィルターをどのように呼びますか?$content = apply_filters( 'rw_trim_excerpt', $content );and として試してみました$content = rw_trim_excerpt($content);が、どちらも機能しませんでした(以前は出力をトリミングせず、後でエラーが発生しました)。
エリックK

2
@QuantumDynamixこれは、get_the_excerptを模倣するように処理を変更するように設計されているため、以下をthe_excerpt呼び出すことができますapply_filters('get_the_excerpt', $content);
jlengstorf

ふw!wpress noobの観点から見た素晴らしいもの、ありがとう
pythonian29033

1

試してください:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

参照:利用可能なすべての帰国メンバーについては、get_postコーデックス


4
投稿の抜粋が入力されていない場合は、空白が返されます。get_the_excerpt()の動作を模倣する必要があります(存在しない場合は抜粋を作成します)。
jlengstorf

フィルターを適用してもそれはできないので、間違った質問をしています。何もないのに、なぜあなたが抜粋を探しているのかわからない。get_the_excerpt()ソースを確認し、ことを模倣する、それが唯一のメンバ変数へのアクセスだしない$postですpost_excerpt。回答のコーデックスリンクも参照してください。
11

3
コーデックスのエントリからthe_excerpt:「投稿のコンテンツの最初の55語を参照する自動抜粋が表示されます。」ループの外でその動作を模倣したいと思っています。
jlengstorf 2011

一時的に2番目のループを作成し、そのIDでそのファイルをクエリしてから、おそらく簡単な解決策を探します。参照してください。セカンダリループ - codex.wordpress.org/Function_Reference/...を
hakre

1
リンクをありがとう。追加のループを設定できることは知っていましたが、やり過ぎのようです。私の解決策はフィルターを追加することでした。後でコードを大幅に減らすために、これを小さなエルボーグリースと見なします。
jlengstorf 2012年

0

私のカスタム関数を使用してコンテンツをフィルタリングできます(これはNARGAフレームワークからのものです

  • 投稿にカスタム抜粋がある場合は、コンテンツの代わりに表示します
  • 投稿にカスタムの引用がない場合、コンテンツからの抜粋を自動生成
  • ショートコードの自動トリミング、HTMLコード、削除[...]、「続きを読む」テキストの追加(翻訳可能)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.