Дозволити 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

ПОВНІШНЕ ВІДПОВІДЬ ДО ЕКСПЕРТУ

Нещодавно я відповів на кілька запитань щодо уривків, тому збираюся дати докладне пояснення, наскільки я можу.

ПЕРЕДМОВА

Здається, є кілька запитань, які виникають з цієї відповіді про те, куди повинен дійти код, і відповідь - це саме вам і як ви вважаєте за потрібне. Є кілька варіантів, де ви можете розмістити код (якщо це прямо не зазначено):

  • У вашій темі function.php або будь-який файл використовується як файл функцій. Просто пам’ятайте, коли ви це зробите, якщо тема не ваша, усі зміни будуть втрачені під час оновлення теми

  • Кращим способом було б використання коду в дочірній темі. Як зазначено вище, у файлі function.php або пов'язаних з функціями

  • Використовуйте код у плагіні. Це кращий спосіб, оскільки це робить код доступним для всіх тем. Якщо ви перемикаєте теми, вам не доведеться турбуватися про те, щоб переписати той самий код.

Я сподіваюся, що це трохи прояснить справи :-)

HTML ТЕГИ / ФОРМУВАННЯ

the_excerpt()насамперед не приймає жодних параметрів, тому нічого не можна передавати. Це факт, який the_excerpt()обробляє вміст до 55 слів, а всі теги HTML знімаються перед поверненням тексту. the_excerpt()знаходиться в wp-include / post-template.php . Щоб дозволити певні або всі теги HTML у витязі, слід створити новий уривок.

Перш за все, потрібно спочатку видалити оригінальну функцію, а потім нову функцію потрібно підключити get_the_excerpt. Зверніть увагу, цей новий уривок все ще може називатися, як the_excerpt()у файлах шаблонів, не потрібно змінювати це. get_the_excerpt()знаходиться в wp-include / post-template.php .

Уривок використовується wp_trim_excerptдля повернення обрізаного тексту, тому нам потрібно видалити wp_trim_excerptспочатку з фільтра уривку. wp_trim_excerpt()знаходиться в wp-include / 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, щоб ваша власна функція виконувалась за замовчуванням.

ДОДАТИ ЧИТАТИ БІЛЬШЕ ПОСИЛУ

Усі тексти, повернені уривком, ненавиджу [...]в кінці, про який не можна натискати. Щоб додати прочитаний текст на місці hellips, скористайтеся цією функцією

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

EDIT

Уривок першого абзацу

Я хочу, щоб це було повно, тому ось уривок, який обрізається після першого абзацу.

Ось функція, яка зберігає 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
якщо це переходить у function.php, файл не перезапишеться, коли з'явиться оновлення?
mcgrailm

3
@mcgrailm так. Ось чому важливо додати це до функцій теми для дітей .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. #cheers

Я скопіював це звідкись, але не пам’ятаю джерела. Я використовую це у всіх своїх проектах, і це працює.

введіть тут опис зображення

/**
  * 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
        );
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.