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);

변경 없음.

그래서 제 질문은 이것입니다 : 도대체 무슨 일이 일어나고 있습니까? 내가 놓친 것이 있습니까?

the_excerpt()작동 방식 을 찾기 위해 WP 코어에 들어 갔으며 통화와 동일한 것으로 보입니다.

/**
 * 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

너는 미쳤어! . . . 내가 롤 그대로
pythonian29033

답변:


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

나는 정말로 이것을 묻는 바보 같은 느낌이 들지 만,이 새로운 필터를 어떻게 부릅니까? 나는 그것을 $content = apply_filters( 'rw_trim_excerpt', $content );and 로 시도했지만 $content = rw_trim_excerpt($content);이것들 중 어느 것도 효과가 없었습니다 (이전은 출력을 자르지 않았고 나중에 오류가 발생했습니다).
Eric K

2
@QuantumDynamix 이것은 get_the_excerpt처리를 모방 하도록 수정하도록 설계 the_excerpt되었으므로 다음을 호출 할 수 있습니다 apply_filters('get_the_excerpt', $content);.
jlengstorf

휴! wpress 멍청한 놈의 관점에서 좋은 하나, 감사합니다
pythonian29033

1

시험:

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

사용 가능한 모든 리턴 멤버에 대한 get_post코덱 을 참조하십시오 .


4
게시물에 대한 발췌가 입력되지 않은 경우 공백으로 반환됩니다. get_the_excerpt ()의 동작을 모방해야합니다 (없는 경우 발췌 생성).
jlengstorf

필터를 적용해도 그렇게되지 않으므로 잘못된 질문을합니다. 발췌문이없는 경우 왜 당신이 발췌를 찾고 있는지 모릅니다. get_the_excerpt()소스를 확인 모방하지 않도록, 단지의 멤버 변수에 액세스하는 것 $post인이 post_excerpt. 답변의 코덱스 링크도 참조하십시오.
hakre

3
코덱스 항목에서 the_excerpt: "게시물 내용의 처음 55 단어를 나타내는 자동 발췌를 표시합니다." 루프 외부에서 해당 동작을 모방하려고합니다.
jlengstorf

두 번째 루프를 임시로 만들고 해당 파일을 ID별로 쿼리 한 다음 빠른 해결책을 찾으십시오. 참조 차 루프 - codex.wordpress.org/Function_Reference/...을
hakre

1
링크 주셔서 감사합니다. 추가 루프를 설정할 수 있다는 것을 알았지 만 과도하게 보입니다. 내 솔루션은 필터를 추가하고있었습니다. 나는 나중에 훨씬 적은 코드를 위해 작은 팔꿈치 그리스로 본다.
jlengstorf

0

내 사용자 정의 기능을 사용하여 컨텐츠를 필터링 할 수 있습니다 ( NARGA Framework에서 제공 )

  • 게시물에 사용자 지정 발췌가있는 경우 내용 대신 표시하십시오
  • 게시물이 사용자 정의 cerpt가 아닌 경우 콘텐트에서 자동으로 발췌
  • 단축 코드, 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.