Erlaube HTML im Auszug

56

Hier ist mein Auszugscode.

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

Wie erlaube ich HTML wie <a> <b> <i> <br>

user32447
quelle

Antworten:

124

KOMPLETTE ANLEITUNG ZU AUSZÜGEN

Ich habe vor kurzem einige Fragen zu Auszügen beantwortet, daher werde ich eine detaillierte Erläuterung geben, soweit ich kann.

VORWORT

Aus dieser Antwort scheinen sich einige Fragen zu ergeben, wo der Code hingehen soll, und die Antwort lautet: Es liegt wirklich an Ihnen und wie Sie es für richtig halten. Es gibt eine Reihe von Optionen, mit denen Sie den Code platzieren können (falls nicht ausdrücklich angegeben):

  • In der functions.php deines Themas oder in einer beliebigen Datei, die als Funktionsdatei verwendet wird. Denken Sie daran, wenn Sie dies tun, und wenn das Thema nicht Ihr eigenes ist, gehen alle Änderungen verloren, wenn Sie Ihr Thema aktualisieren

  • Eine bessere Möglichkeit wäre, den Code in einem untergeordneten Thema zu verwenden. Wie oben in der Datei functions.php oder functions related

  • Verwenden Sie den Code in einem Plugin. Dies ist die bevorzugte Methode, da der Code auf diese Weise für alle Themen verfügbar ist. Wenn Sie das Thema wechseln, müssen Sie sich nicht darum kümmern, den gleichen Code neu zu schreiben.

Ich hoffe das klärt ein bisschen auf :-)

HTML-TAGS / FORMATIERUNG

the_excerpt()Erstens akzeptiert er keine Parameter, daher kann nichts an ihn übergeben werden. Es ist eine Tatsache, dass the_excerpt()der Inhalt auf 55 Wörter gekürzt wird und alle HTML-Tags entfernt werden, bevor der Text zurückgegeben wird. the_excerpt()befindet sich in wp-includes / post-template.php . Um bestimmte oder alle HTML-Tags im Auszug zuzulassen, muss ein neuer Auszug erstellt werden.

Zuerst muss die ursprüngliche Funktion entfernt werden, und dann muss die neue Funktion verknüpft werden get_the_excerpt. Bitte beachten Sie, dass dieser neue Auszug weiterhin wie the_excerpt()in Vorlagendateien aufrufbar ist , ohne dass dies geändert werden muss. get_the_excerpt()befindet sich in wp-includes / post-template.php .

Der Auszug wird verwendet wp_trim_excerpt, um den zugeschnittenen Text zurückzugeben, daher müssen wir ihn wp_trim_excerptzuerst aus dem Auszugfilter entfernen . wp_trim_excerpt()befindet sich in wp-includes / formatting.php, Zeile 2355. So geht's:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Sie können jetzt Ihren neuen Auszug hinzufügen get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Um HTML-Tags / Formatierungen zuzulassen, müssen wir angeben, welche Tags Sie zulassen müssen. Sie können die folgende strip_tagsAnweisung verwenden, um dies zu erreichen

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

Das zweite Argument wpse_allowedtags()ist eine kleine Funktion, die zum Hinzufügen der Tags verwendet the_excerpt()wird. Eine vollständige Liste der gültigen HTML 5-Tags finden Sie hier . Hier ist die Funktion, fügen Sie alle HTML-Tags hinzu, die Sie zulassen / behalten müssen

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

Wenn Sie alle HTML-Tags zulassen müssen, dh keine Tags strips_tags()entfernen müssen , kann die Funktion vollständig weggelassen / entfernt werden.

Wenn HTML-Tags zulässig sind, werden diese Tags jedoch als Wörter gezählt, sodass Ihre Wortanzahl für Auszüge mit Tags und ohne Tags nicht identisch ist. Um dies zu korrigieren, müssen Sie diese Tags zuerst aus der tatsächlichen Wortanzahl entfernen, damit nur Wörter gezählt werden.

Ich habe einen Auszug geschrieben, der alle Tags zulässt, nur Wörter als Wörter zählt und einen Satz nach der festgelegten Anzahl von Wörtern vervollständigt (sodass der Text nicht in der Mitte des Satzes abgeschnitten wird) und nach dem letzten Wort einen weiteren Text hinzufügt .

Hier ist der vollständige Code

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

Sie können einfach das '//' von Funktionen entfernen, die Sie zusätzlich benötigen.

BENUTZERDEFINIERTE AUSZUGSLÄNGEN

Manchmal müssen Sie einfache Auszüge unterschiedlicher Länge anzeigen, und es ist nicht sinnvoll, für jeden Beitrag / jede Funktion / Seite einen Auszug zu schreiben. Hier ist eine nette kleine Funktion mitwp_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>');
}

Diese kleine Funktion übernimmt die Aufgabe get_the_excerpt, sie auf $limitdie vom Benutzer festgelegten Werte zu trimmen und den Text mit einem weiterführenden Link am Ende zurückzugeben.

Sie können diesen Auszug wie folgt in Ihrer Vorlage aufrufen

echo wpse_custom_excerpts($limit);

Wo $limitwird Ihre Wortzahl sein, so wird ein Auszug von 30 Wörtern sein

echo wpse_custom_excerpts(30);

Nur eine Sache zu beachten, wenn Sie Ihr Limit auf mehr als 55 Wörter setzen, werden nur 55 Wörter zurückgegeben, da der Auszug nur 55 Wörter lang ist. Wenn längere Auszüge benötigt werden, verwenden Sie get_the_contentstattdessen.

CUSTOM EXCERPT LÄNGE

Wenn Sie nur die Länge von ändern müssen the_excerpt(), können Sie die folgende Funktion verwenden

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

Denken Sie daran, dass Sie eine höhere Priorität als 10 festlegen müssen, damit Ihre benutzerdefinierte Funktion nach der Standardeinstellung ausgeführt wird.

HINZUFÜGEN MEHR LINK LESEN

Alle Texte, die vom Auszug zurückgegeben werden, haben [...]am Ende den Hass, der nicht anklickbar ist. Verwenden Sie diese Funktion, um anstelle der hellips einen weiteren Text hinzuzufügen

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

BEARBEITEN

Auszug aus dem ersten Absatz

Ich möchte dies vollständig halten, daher hier der Auszug, der nach dem ersten Absatz abgeschnitten wird.

Hier ist eine Funktion, die HTML-Tags auf dem neuesten Stand hält, einen "Read More" -Link am Ende des Ausschnitts hinzufügt und den Auszug nach dem ersten Absatz abschneidet.

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

EDIT 29-10-2015

Wenn Sie eine Problemumgehung benötigen, um den Link "Mehr lesen" nach dem Auszug nicht anzuzeigen, wenn der Auszug kürzer ist als die festgelegte Anzahl von Wörtern, lesen Sie bitte die folgende Frage und Antwort

Pieter Goosen
quelle
Wo genau platziere ich diesen Teil function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }im verwirrt
user32447
1
All dieser Code geht rein functions.php. Sie können das oben if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :in Ihremfunctions.php
Pieter Goosen
1
nvm Ich habe den oberen
Rand
1
Wenn dies in die Datei functions.php geht, wird das nicht überschrieben, wenn ein Update kommt?
McGrailm
3
@mcgrailm ja das würde es. Aus diesem Grund ist es wichtig, dies in die functions.php Ihrer untergeordneten Themen aufzunehmen . Sie können es sogar einem Plugin hinzufügen, das Sie unbedingt benötigen
Pieter Goosen
1

Fügen Sie bei Bedarf weitere Tags hinzu $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);
}

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

prosti
quelle
0

Sie können auch einen Rich-Text-Editor für Auszüge hinzufügen. Fügen Sie den folgenden Code in die Plugin-Datei oder die function.php-Datei des Themas ein, und Sie können den HTML-Editor für Auszüge anzeigen. Außerdem werden auch Auszüge im HTML-Format gerendert. #Prost

Ich habe das von irgendwoher kopiert, erinnere mich aber nicht an die Quelle. Ich benutze dies in allen Projekten und es funktioniert.

Bildbeschreibung hier eingeben

/**
  * 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
        );
    }
}
Mayur Chauhan
quelle