발췌에서 HTML 허용


56

여기 내 발췌 코드가 있습니다.

// Generate custom excerpt length
function wpbx_excerpt_length($length) {
    return 300;
}
add_filter('excerpt_length', 'wpbx_excerpt_length');

HTML을 어떻게 허용합니까? <a> <b> <i> <br>

답변:


124

예외에 대한 완전한 안내서

최근에 발췌 부분에 대한 몇 가지 질문에 답변 했으므로 가능한 한 자세히 설명하겠습니다.

머리말

코드가 어디로 가야하는지에 대한이 답변에서 발생하는 몇 가지 질문이있는 것 같습니다. 답은 실제로 당신에게 달려 있으며 어떻게 보이는지에 달려 있습니다. 명시 적으로 언급되지 않은 경우 코드를 배치 할 수있는 몇 가지 옵션이 있습니다.

  • 테마의 functions.php 또는 모든 파일에서 함수 파일로 사용하십시오. 테마를 직접 작성하지 않으면 테마를 업그레이드 할 때 모든 변경 사항이 손실됩니다.

  • 더 좋은 방법은 자식 테마에서 코드를 사용하는 것입니다. 위와 같이 functions.php 또는 함수 관련 파일에서

  • 플러그인에서 코드를 사용하십시오. 이것이 모든 테마에서 코드를 사용할 수있게하므로 선호되는 방법입니다. 테마를 전환하면 동일한 코드를 다시 작성하는 것에 대해 걱정할 필요가 없습니다.

나는 이것이 조금 정리되어 있기를 바랍니다 :-)

HTML 태그 / 포맷

the_excerpt()우선 어떤 매개 변수도 허용하지 않으므로 전달할 수있는 것이 없습니다. 그것은 사실이다 the_excerpt()(55 개) 단어의 내용을 트림, 모든 HTML 태그는 텍스트를 반환하기 전에 제거됩니다. the_excerpt()에 위치 / 후 template.php을 WP-포함되어 있습니다 . 발췌에서 특정 또는 모든 HTML 태그를 허용하려면 새로운 발췌를 만들어야합니다.

우선 원래 기능을 먼저 제거한 다음 새 기능을에 연결해야 get_the_excerpt합니다. 이 새로운 발췌문은 the_excerpt()템플릿 파일에서 와 마찬가지로 계속 호출 가능하므로 변경할 필요가 없습니다. get_the_excerpt()에 위치 / 후 template.php을 WP-포함되어 있습니다 .

발췌는 wp_trim_excerpt잘린 텍스트를 반환하는 데 사용 되므로 wp_trim_excerpt발췌 필터에서 먼저 제거해야합니다 . wp_trim_excerpt()에 위치하고 WP-포함 / formatting.php , 라인 2355이는 방법입니다 :

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

이제 새로운 발췌문을 추가 할 수 있습니다 get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

html 태그 / 포맷을 허용하려면 허용 할 태그를 지정해야합니다. 다음 strip_tags문장을 사용하여 이를 달성 할 수 있습니다.

$wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags());

두 번째 인수 wpse_allowedtags()the_excerpt()허용 할 태그를 추가하는 데 사용되는 작은 함수입니다 . 유효한 HTML 5 태그의 전체 목록을 보려면 여기에서 확인 하십시오 . 여기에 기능이 있습니다. 허용 / 유지 해야하는 HTML 태그를 추가하십시오.

function wpse_allowedtags() {
// Add custom tags to this string
    return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
}

모든 HTML 태그를 허용해야하는 경우, 즉 태그를 제거하지 않으면 strips_tags()기능을 완전히 생략 / 제거 할 수 있습니다.

그러나 html 태그가 허용되면 이러한 태그는 단어로 계산되므로 태그가 있거나 태그가없는 발췌에 대한 단어 수는 동일하지 않습니다. 이를 정정하려면 단어 만 계산되도록 먼저 실제 단어 수에서 이러한 태그를 제거해야합니다.

모든 태그를 허용하고 단어로만 단어를 세고 설정된 단어 수만큼 문장을 완성하고 (문장 중간에 텍스트가 잘리지 않음) 마지막 단어 다음에 더 많은 텍스트를 읽을 수있는 발췌문을 작성했습니다 .

완전한 코드는 다음과 같습니다.

function wpse_allowedtags() {
    // Add custom tags to this string
        return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; 
    }

if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) : 

    function wpse_custom_wp_trim_excerpt($wpse_excerpt) {
    $raw_excerpt = $wpse_excerpt;
        if ( '' == $wpse_excerpt ) {

            $wpse_excerpt = get_the_content('');
            $wpse_excerpt = strip_shortcodes( $wpse_excerpt );
            $wpse_excerpt = apply_filters('the_content', $wpse_excerpt);
            $wpse_excerpt = str_replace(']]>', ']]&gt;', $wpse_excerpt);
            $wpse_excerpt = strip_tags($wpse_excerpt, wpse_allowedtags()); /*IF you need to allow just certain tags. Delete if all tags are allowed */

            //Set the excerpt word count and only break after sentence is complete.
                $excerpt_word_count = 75;
                $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 
                $tokens = array();
                $excerptOutput = '';
                $count = 0;

                // Divide the string into tokens; HTML tags, or words, followed by any whitespace
                preg_match_all('/(<[^>]+>|[^<>\s]+)\s*/u', $wpse_excerpt, $tokens);

                foreach ($tokens[0] as $token) { 

                    if ($count >= $excerpt_length && preg_match('/[\,\;\?\.\!]\s*$/uS', $token)) { 
                    // Limit reached, continue until , ; ? . or ! occur at the end
                        $excerptOutput .= trim($token);
                        break;
                    }

                    // Add words to complete sentence
                    $count++;

                    // Append what's left of the token
                    $excerptOutput .= $token;
                }

            $wpse_excerpt = trim(force_balance_tags($excerptOutput));

                $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'wpse' ), get_the_title()) . '</a>'; 
                $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

                //$pos = strrpos($wpse_excerpt, '</');
                //if ($pos !== false)
                // Inside last HTML tag
                //$wpse_excerpt = substr_replace($wpse_excerpt, $excerpt_end, $pos, 0); /* Add read more next to last word */
                //else
                // After the content
                $wpse_excerpt .= $excerpt_more; /*Add read more in new paragraph */

            return $wpse_excerpt;   

        }
        return apply_filters('wpse_custom_wp_trim_excerpt', $wpse_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt'); 

추가 기능이 필요한 기능에서 '//'를 제거하면됩니다.

커스텀 발췌 길이

때로는 길이가 다른 간단한 발췌문을 표시해야하며 모든 게시물 / 기능 / 페이지에 대한 발췌문을 작성하는 것은 불가능합니다. 다음은 사용하는 멋진 작은 기능입니다.wp_trim_words

function wpse_custom_excerpts($limit) {
    return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&hellip;' . __( 'Read more &nbsp;&raquo;', 'wpse' ) . '</a>');
}

이 작은 기능은 사용자 get_the_excerpt$limit설정하여 잘라 내고 끝에 더 많은 링크가있는 텍스트를 반환하는 것입니다.

템플릿에서 다음과 같이이 발췌를 호출 할 수 있습니다

echo wpse_custom_excerpts($limit);

$limit당신의 단어 수는 어디에 있습니까 , 그래서 30 단어의 발췌는

echo wpse_custom_excerpts(30);

여기서 한 가지 기억해야 할 것은, 한도를 55 단어 이상으로 설정하면 발췌 길이는 55 단어이므로 55 ​​단어 만 반환됩니다. 더 긴 발췌가 필요한 경우 get_the_content대신 사용하십시오.

커스텀 발췌 길이

의 길이를 변경 해야하는 경우 the_excerpt()다음 기능을 사용할 수 있습니다

function wpse_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'wpse_excerpt_length', 999 );

사용자 지정 함수가 기본값 이후에 실행되도록 우선 순위를 10보다 크게 설정해야합니다.

추가 링크를 읽으십시오

발췌에 의해 ​​반환 된 모든 텍스트 [...]는 끝에 클릭 할 수없는 증오 를 나타냅니다. 헬프 대신 텍스트를 더 읽으려면이 함수를 사용하십시오.

 function wpse_excerpt_more( $more ) {
    return ' <a class="read-more" href="'. get_permalink( get_the_ID() ) . '">' . __('Read More', 'your-text-domain') . '</a>';
}
add_filter( 'excerpt_more', 'wpse_excerpt_more' );

편집하다

첫 번째 단락 발췌

나는 이것을 완벽하게 유지하고 싶기 때문에 첫 번째 단락 이후에 나오는 발췌 부분이 있습니다.

다음은 HTML 태그를 그대로 유지하고 발췌 부분 끝에 "자세히 읽기"링크를 추가하고 첫 번째 단락 이후 발췌를 자르는 함수입니다.

if ( ! function_exists( 'wpse0001_custom_wp_trim_excerpt' ) ) : 

    function wpse0001_custom_wp_trim_excerpt($wpse0001_excerpt) {
        global $post;
        $raw_excerpt = $wpse0001_excerpt;
        if ( '' == $wpse0001_excerpt ) {

            $wpse0001_excerpt = get_the_content('');
            $wpse0001_excerpt = strip_shortcodes( $wpse0001_excerpt );
            $wpse0001_excerpt = apply_filters('the_content', $wpse0001_excerpt);
            $wpse0001_excerpt = substr( $wpse0001_excerpt, 0, strpos( $wpse0001_excerpt, '</p>' ) + 4 );
            $wpse0001_excerpt = str_replace(']]>', ']]&gt;', $wpse0001_excerpt);

            $excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . '&nbsp;&raquo;&nbsp;' . sprintf(__( 'Read more about: %s &nbsp;&raquo;', 'pietergoosen' ), get_the_title()) . '</a>'; 
            $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end); 

            //$pos = strrpos($wpse0001_excerpt, '</');
            //if ($pos !== false)
            // Inside last HTML tag
            //$wpse0001_excerpt = substr_replace($wpse0001_excerpt, $excerpt_end, $pos, 0);
            //else
            // After the content
            $wpse0001_excerpt .= $excerpt_more;

            return $wpse0001_excerpt;

        }
        return apply_filters('wpse0001_custom_wp_trim_excerpt', $wpse0001_excerpt, $raw_excerpt);
    }

endif; 

remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'wpse0001_custom_wp_trim_excerpt');

편집 29-10-2015

발췌문이 설정된 단어의 양보다 짧을 때 발췌 후 더 많은 링크 읽기를 표시하지 않는 해결 방법이 필요한 사람은 다음 질문 및 답변을 참조하십시오


이 부분을 정확히 function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }혼동하는 위치
user32447

1
이 코드는 모두 들어갑니다 functions.php. 당신은 위의 것을 추가 할 수 있습니다 if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :당신에functions.php
피터 구센

1
nvm 나는 코드의 최고를 놓쳤다
user32447

1
이것이 functions.php 파일에 들어가면 업데이트가 올 때 덮어 쓰지 않습니까?
mcgrailm

3
@mcgrailm 그렇습니다. 그렇기 때문에 이것을 자녀 테마의 functions.php 에 추가하는 것이 중요 합니다. 필수 플러그인에 추가 할 수도 있습니다
Pieter Goosen

1

필요한 경우 더 많은 태그 추가 $allowed_tags = ...

function _20170529_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
    //Retrieve the post content. 
    $text = get_the_content('');

    //Delete all shortcode tags from the content. 
    $text = strip_shortcodes( $text );

    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]&gt;', $text);

    $allowed_tags = '<a>,<b>,<br><i>'; 
    $text = strip_tags($text, $allowed_tags);

    $excerpt_word_count = 55; /*** MODIFY THIS. change the excerpt word count to any integer you like.***/
    $excerpt_length = apply_filters('excerpt_length', $excerpt_word_count); 

    $excerpt_end = '[...]'; /*** MODIFY THIS. change the excerpt endind to something else.***/
    $excerpt_more = apply_filters('excerpt_more', ' ' . $excerpt_end);

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

보낸 사람 : http://bacsoftwareconsulting.com/blog/index.php/wordpress-cat/how-to-preserve-html-tags-in-wordpress-excerpt-without-a-plugin/


0

발췌문에 대한 서식있는 텍스트 편집기를 추가하고 플러그인 파일 또는 테마의 function.php 파일에 아래 코드를 추가하면 발췌에 대한 HTML 편집기를 볼 수 있습니다. 또한 발췌문을 HTML 형식으로 렌더링합니다. #건배

나는 이것을 어딘가에서 복사했지만 소스를 기억하지 못한다. 나는 모든 프로젝트에서 이것을 사용하고 있으며 효과가 있습니다.

여기에 이미지 설명을 입력하십시오

/**
  * Replaces the default excerpt editor with TinyMCE.
*/
add_action( 'add_meta_boxes', array ( 'T5_Richtext_Excerpt', 'switch_boxes' ) );
class T5_Richtext_Excerpt
{
    /**
     * Replaces the meta boxes.
     *
     * @return void
     */
    public static function switch_boxes()
    {
        if ( ! post_type_supports( $GLOBALS['post']->post_type, 'excerpt' ) )
        {
            return;
        }

        remove_meta_box(
            'postexcerpt', // ID
            '',            // Screen, empty to support all post types
            'normal'      // Context
        );

        add_meta_box(
            'postexcerpt2',     // Reusing just 'postexcerpt' doesn't work.
            __( 'Excerpt' ),    // Title
            array ( __CLASS__, 'show' ), // Display function
            null,              // Screen, we use all screens with meta boxes.
            'normal',          // Context
            'core',            // Priority
        );
    }

    /**
     * Output for the meta box.
     *
     * @param  object $post
     * @return void
     */
    public static function show( $post )
    {
        ?>
        <label class="screen-reader-text" for="excerpt"><?php
        _e( 'Excerpt' )
        ?></label>
        <?php
            // We use the default name, 'excerpt', so we don’t have to care about
            // saving, other filters etc.
            wp_editor(
                self::unescape( $post->post_excerpt ),
                'excerpt',
                array (
                    'textarea_rows' => 15,
                    'media_buttons' => FALSE,
                    'teeny'         => TRUE,
                    'tinymce'       => TRUE
                )
            );
    }

    /**
     * The excerpt is escaped usually. This breaks the HTML editor.
     *
     * @param  string $str
     * @return string
     */
    public static function unescape( $str )
    {
        return str_replace(
            array ( '&lt;', '&gt;', '&quot;', '&amp;', '&nbsp;', '&amp;nbsp;' ),
                array ( '<',    '>',    '"',      '&',     ' ', ' ' ),
                $str
        );
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.