Autoriser le code HTML dans un extrait


56

Voici mon code extrait.

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

Comment puis-je autoriser HTML comme <a> <b> <i> <br>

Réponses:


125

GUIDE COMPLET DES EXTRAITS

J'ai récemment répondu à quelques questions concernant des extraits, alors je vais vous donner une explication détaillée couvrant le plus possible.

PRÉFACE

Il semble y avoir quelques questions qui découlent de cette réponse sur la direction que devrait prendre le code. La réponse est que cela dépend vraiment de vous et de votre choix. Il y a plusieurs options pour placer le code (à moins d'indication explicite):

  • Dans functions.php de votre thème ou dans tout autre fichier, utilisez-le comme un fichier de fonctions. Rappelez-vous que lorsque vous faites cela, si le thème n'est pas le vôtre, tous les changements seront perdus lorsque vous améliorerez votre thème.

  • Un meilleur moyen serait d'utiliser le code dans un thème enfant. Comme ci-dessus, dans le fichier functions.php ou fonctions

  • Utilisez le code dans un plugin. C'est la méthode préférée car cela rend le code disponible pour tous les thèmes. Si vous changez de thème, vous n'avez pas à craindre de réécrire le même code.

J'espère que cela clarifie un peu les choses :-)

TAGS HTML / FORMATAGE

the_excerpt()Tout d'abord, n'accepte aucun paramètre, donc rien ne peut lui être transmis. En réalité, the_excerpt()le contenu est réduit à 55 mots et toutes les balises HTML sont supprimées avant le renvoi du texte. the_excerpt()se trouve dans wp-includes / post-template.php . Pour autoriser certaines ou toutes les balises HTML dans l'extrait, un nouvel extrait doit être créé.

Tout d'abord, la fonction d'origine doit d'abord être supprimée, puis la nouvelle fonction doit être connectée get_the_excerpt. S'il vous plaît prendre note, ce nouvel extrait sera toujours appelable comme the_excerpt()dans les fichiers de modèle, pas besoin de changer cela. get_the_excerpt()se trouve dans wp-includes / post-template.php .

L'extrait utilise wp_trim_excerptpour renvoyer le texte coupé, nous devons donc d' wp_trim_excerptabord supprimer du filtre extrait. wp_trim_excerpt()se trouve dans wp-includes / formating.php, ligne 2355. Voici comment:

remove_filter('get_the_excerpt', 'wp_trim_excerpt');

Vous pouvez maintenant ajouter votre nouvel extrait à get_the_excerpt

add_filter('get_the_excerpt', 'wpse_custom_wp_trim_excerpt');

Pour autoriser les balises HTML / formatage, nous devrons spécifier quelles balises vous devez autoriser. Vous pouvez utiliser l' strip_tagsénoncé suivant pour y parvenir

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

Le deuxième argument wpse_allowedtags()est une petite fonction utilisée pour ajouter les balises the_excerpt()autorisées. Pour obtenir une liste complète des balises HTML 5 valides, cliquez ici . Voici la fonction, ajoutez les balises html que vous devez autoriser / garder.

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

Si vous devez autoriser toutes les balises HTML, c'est-à-dire sans strips_tags()supprimer aucune balise, la fonction peut être omise / supprimée complètement.

Un point à noter cependant, lorsque les balises HTML sont autorisées, ces balises sont comptées comme des mots, de sorte que le nombre de mots pour les extraits avec balises et sans balises ne sera pas le même. Pour corriger cela, vous devez commencer par supprimer ces étiquettes du nombre de mots afin que seuls les mots soient comptés.

J'ai écrit un extrait qui autorise toutes les balises, ne compte que les mots en tant que mots et complète une phrase après le nombre de mots défini (afin que le texte ne soit pas coupé au milieu d'une phrase) et ajoute une lecture supplémentaire après le dernier mot. .

Voici le code complet

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

Vous pouvez simplement supprimer le "//" des fonctions dont vous avez besoin en plus.

EXTRAITS PERSONNALISÉS

Parfois, vous avez besoin d'afficher des extraits simples de différentes longueurs et il n'est pas viable d'écrire un extrait pour chaque message / fonction / page. Voici une belle petite fonction utilisantwp_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>');
}

Ce que cette petite fonction prend get_the_excerpt, le réduit à la taille $limitdéfinie par l'utilisateur et renvoie le texte avec un lien "lire plus" à la fin.

Vous pouvez appeler cet extrait comme suit dans votre modèle

echo wpse_custom_excerpts($limit);

$limitsera votre compte de mots, donc un extrait de 30 mots sera

echo wpse_custom_excerpts(30);

Juste une chose à retenir ici, si vous définissez votre limite à plus de 55 mots, seuls 55 mots seront retournés car l'extrait ne contient que 55 mots. Si des extraits plus longs sont nécessaires, utilisez get_the_contentplutôt.

EXTRAIT PERSONNALISÉ

Si vous avez juste besoin de modifier la longueur de the_excerpt(), vous pouvez utiliser la fonction suivante

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

N'oubliez pas que vous devez définir une priorité supérieure à 10 pour que votre fonction personnalisée s'exécute après la valeur par défaut.

AJOUTER LIRE PLUS LINK

Tous les textes renvoyés par l'extrait comportent [...]à la fin une haine incompréhensible. Pour ajouter une lecture plus de texte à la place des hellips, utilisez cette fonction

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

MODIFIER

Extrait premier paragraphe

Je veux que cela reste complet, alors voici l'extrait qui coupe après le premier paragraphe.

Voici une fonction qui garde les balises HTML intacts, ajoute un lien "Lire la suite" à la fin de l'extrait et ajuste l'extrait après le premier paragraphe.

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

Pour tous ceux qui ont besoin d'une solution de contournement pour ne pas afficher le lien lire plus après l'extrait lorsque l'extrait est plus court que le nombre de mots définis, veuillez consulter la question et la réponse suivantes.


où exactement je place cette partie function wpse_allowedtags() { // Add custom tags to this string return '<script>,<style>,<br>,<em>,<i>,<ul>,<ol>,<li>,<a>,<p>,<img>,<video>,<audio>'; }im confused
user32447

1
Tout ce code va dans functions.php. Vous pouvez ajouter que juste au dessus if ( ! function_exists( 'wpse_custom_wp_trim_excerpt' ) ) :dans votrefunctions.php
Pieter Goosen

1
nvm j'ai manqué le haut du code
user32447

1
si cela se trouve dans le fichier functions.php, cela ne sera-t-il pas écrasé lorsqu'une mise à jour sera fournie?
mcgrailm

3
@ mcgrailm oui il le ferait. C'est pourquoi il est important d'ajouter ceci au fichier functions.php de vos thèmes enfants . Vous pouvez même l'ajouter à un plugin à ne pas manquer
Pieter Goosen

1

Ajouter plus de tags si vous avez besoin de $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);
}

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


0

Vous pouvez également ajouter un éditeur de texte enrichi pour les extraits, ajoutez le code ci-dessous dans le fichier plug-in ou le fichier function.php du thème et vous pourrez voir l'éditeur HTML pour les extraits. De plus, il rendra des extraits au format HTML. #à votre santé

Je l'ai copié quelque part mais je ne me souviens pas de la source. J'utilise ceci dans tous mes projets et ça marche.

entrez la description de l'image ici

/**
  * 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
        );
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.