Voici ce que j'ai ajouté dans le fichier functions.php de mon thème pour activer le formatage d'extraits dans Wordpress ( source du conseil ):
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'bwp_trim_excerpt');
function bwp_trim_excerpt($text)
{
$raw_excerpt = $text;
if ( '' == $text ) {
$text = get_the_content('');
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text, '<em><strong><i><b><a><code>');
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$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);
}
Le problème lié à l’activation du formatage dans les extraits postaux semble être que, si le texte mis en forme par une balise (que ce soit <b>
, <strong>
, <i>
, <em>
ou toute autre chose) est coupé par l’extrait entre les deux, votre le formatage de la page entière sera remplacé par cette balise. Regardez cette capture d'écran par exemple:
Je pense que c’est la raison pour laquelle le formatage des extraits n’est pas activé par défaut. Est-ce qu'il y a un moyen de réparer ceci? Quelque chose ne va pas avec le code?
J'espère que je peux obtenir de l'aide ici. Merci!
C'est l'une des raisons pour lesquelles le balisage HTML est supprimé des extraits en premier lieu, afin d'éviter que de tels problèmes ne se produisent, cependant, lorsqu'il y a une volonté, il y a un moyen ...
Vous pouvez, en utilisant l’expression régulière, fermer les balises ouvertes s’appliquant uniquement à l’extrait et vous pouvez consulter le lien suivant pour des idées,
Ou bien, vous pouvez utiliser ce plugin prêt à l'emploi pour WordPress,
Ou si vous vous sentez si enclin, vous pouvez le modifier ou en échantillonner la structure et l’appliquer à votre fonction.
J'ai décidé de faire un test, mais notez que j'ai utilisé une fonction différente de celle que j'utilise souvent lors de la création d'extraits avec des longueurs personnalisables à la volée;
Mettez ceci dans votre fichier functions.php,
function content($limit) {
global $content;
$content = explode(' ', get_the_content(), $limit);
if (count($content)>=$limit) {
array_pop($content);
$content = implode(" ",$content).'...';
} else {
$content = implode(" ",$content);
}
$content = preg_replace('/\[.+\]/','', $content);
$content = apply_filters('the_content', $content);
$content = str_replace(']]>', ']]>', $content);
return $content;
}
suivi par,
function closetags($html) {
#put all opened tags into an array
$content = $result;
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1]; #put all closed tags into an array
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
# all tags are closed
if (count($closedtags) == $len_opened) {
return $html;
}
$openedtags = array_reverse($openedtags);
# close tags
for ($i=0; $i < $len_opened; $i++) {
if (!in_array($openedtags[$i], $closedtags)){
$html .= '</'.$openedtags[$i].'>';
} else {
unset($closedtags[array_search($openedtags[$i], $closedtags)]); }
}
return $html;
}
Ensuite, dans votre thème, vous feriez ce qui suit,
<?php echo closetags( content(55) );?>
Où 55 = la longueur en mots que vous voulez que votre extrait soit.
Si vous souhaitez utiliser la boîte d’extraits ACTUAL dans l’écran de post-édition, vous pouvez également ajouter cet extrait à votre fichier de fonctions,
function excerpt($limit) {
global $excerpt;
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt).'...';
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('/\[.+\]/','', $excerpt);
$excerpt = apply_filters('the_excerpt', $excerpt);
$excerpt = str_replace(']]>', ']]>', $excerpt);
return $excerpt;
}
Et son utilisation serait,
<?php echo closetags( excerpt(55) );?>
Toutefois, si vous utilisez la zone d’extrait ACTUAL dans l’écran de post-édition, vous devrez bien entendu écrire manuellement vos balises <strong>,<em>,<i>,<a>,etc..
! Sauf si vous modifiez le TinyMCE par défaut pour la boîte d’extrait.
Donc voilà, vous êtes couvert dans les deux cas, soit ...
1) récupérer un extrait de the_content () 2) récupérer un extrait de the_excerpt ()
NOTEIl existe peut-être un moyen plus efficace de résoudre ce problème en écrivant la fonctionnalité de l'exemple Close HTML Tags de Milan au cas où vous souhaiteriez approfondir cette recherche.
C'est aussi simple que d'ajouter cette fonction au fichier functions.php de votre thème. Le code a été commenté clairement, il va donc de soi:
function better_trim_excerpt($text)
{
$raw_excerpt = $text;
if ( '' == $text ) {
$text = get_the_content('');
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
// Removes any JavaScript in posts (between <script> and </script> tags)
$text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $text);
// Enable formatting in excerpts - Add HTML tags that you want to be parsed in excerpts, default is 55
$text = strip_tags($text, '<strong><b><em><i><a><code><kbd>');
// Set custom excerpt length - number of words to be shown in excerpts
$excerpt_length = apply_filters('excerpt_length', 55);
// Modify excerpt more string at the end from [...] to ...
$excerpt_more = apply_filters('excerpt_more', ' ' . '...');
$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);
// IMPORTANT! Prevents tags cutoff by excerpt (i.e. unclosed tags) from breaking formatting
$text = force_balance_tags( $text );
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
// Remove the native excerpt function, and replace it with our improved function
remove_filter('get_the_excerpt', 'wp_trim_excerpt');
add_filter('get_the_excerpt', 'better_trim_excerpt');
EDIT: Et assurez-vous que la minification HTML est désactivée dans W3 Total Cache (si vous l’utilisez).