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 le HTML comme <a> <b> <i> <br>
GUIDE COMPLET POUR EXTRAITS
J'ai récemment répondu à quelques questions concernant des extraits, je vais donc vous donner une explication détaillée couvrant autant que 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 simplement 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 :-)
HTML TAGS/FORMATTING
the_excerpt()
d'abord n'accepte aucun paramètre, donc rien ne peut lui être transmis. Il est un fait que the_excerpt()
réduit le contenu à 55 mots et que toutes les balises HTML sont supprimées avant de renvoyer le 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 associée à get_the_excerpt
. Veuillez prendre note que ce nouvel extrait pourra toujours être appelé en tant que the_excerpt()
dans les fichiers de modèle, inutile de le modifier. get_the_excerpt()
se trouve dans wp-includes/post-template.php .
L'extrait utilise wp_trim_excerpt
pour renvoyer le texte coupé. Nous devons donc supprimer wp_trim_excerpt
du filtre d'extraits. wp_trim_excerpt()
se trouve dans wp-includes/formatting.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'instruction strip_tags
suivante 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 que the_excerpt()
autorisera. Pour une liste complète des balises HTML 5 valides, allez voir 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 supprimer aucune balise, la fonction strips_tags()
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 votre compte de mots pour les extraits avec des balises et sans balises ne sera pas le même. Pour corriger cela, vous devrez d'abord supprimer ces balises 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 tronqué 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(']]>', ']]>', $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() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', '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.
LONGUEURS EXTRAITS PERSONNALISÉS
Parfois, vous devez 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 petite petite fonction en utilisant wp_trim_words
function wpse_custom_excerpts($limit) {
return wp_trim_words(get_the_excerpt(), $limit, '<a href="'. esc_url( get_permalink() ) . '">' . ' …' . __( 'Read more »', 'wpse' ) . '</a>');
}
Cette petite fonction prend get_the_excerpt
, la coupe en $limit
défini par l'utilisateur et renvoie le texte avec un lien en savoir plus à la fin.
Vous pouvez appeler cet extrait comme suit dans votre modèle
echo wpse_custom_excerpts($limit);
où $limit
sera votre nombre de mots, ainsi 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 plutôt get_the_content
.
LONGUEUR EXTRAIT PERSONNALISÉE
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 PLUS DE LIENS
Tous les textes renvoyés par l'extrait ont le [...]
haï à la fin qui n'est pas cliquable. 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' );
EDIT
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 plus" à 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(']]>', ']]>', $wpse0001_excerpt);
$excerpt_end = ' <a href="'. esc_url( get_permalink() ) . '">' . ' » ' . sprintf(__( 'Read more about: %s »', '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');
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.
Ajoutez 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(']]>', ']]>', $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);
}
Vous pouvez également ajouter un éditeur de texte enrichi pour les extraits, ajouter le code ci-dessous dans le fichier de plug-in ou le fichier function.php du thème et accéder à 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.
/**
* 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 ( '<', '>', '"', '&', ' ', '&nbsp;' ),
array ( '<', '>', '"', '&', ' ', ' ' ),
$str
);
}
}