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 코드에 대한 링크를이 답변으로 복사 한 다음 첫 번째 답변을 삭제할 수 있습니다.
Jan Fabry

복사 / 붙여 넣기의 경우 : $ raw_excerpt = $ text를 추가하십시오.
Svetoslav Marinov

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

get_the_content () 함수는 $ more! = 0 인 경우 전체 컨텐츠를 리턴합니다. 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 태그와 단축 코드를 제거합니다. 발췌의 첫 단어에 이미지가 포함되어 있다면 어떨까요? 아마도 레이아웃이 깨질 것입니다.
brett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.