Problème lié à l'activation de la mise en forme d'extraits dans Wordpress

4

C’est ce que j’ai ajouté dans le fichier functions.php de mon thème pour permettre le formatage des extraits dans Wordpress ( source de le 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 avec l'activation de la mise en forme dans les extraits de publication semble être que, si le texte est mis en forme par une balise (que ce soit <b> , <strong> , <i> , <em> ou toute autre chose de ce genre ) est coupé par l'extrait entre les deux, le formatage de votre page entière sera remplacé par cette balise. Jetez un coup d’œil à cette capture d’écran par exemple:

C’est pour cette raison que 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!

    
posée its_me 07.04.2012 - 15:10

2 réponses

5

C’est l’une des raisons pour lesquelles le balisage HTML a été supprimé des extraits en premier lieu, afin d’empêcher que de tels problèmes ne se reproduisent. Cependant, s’il ya une volonté, il existe un moyen ...

Vous pouvez, grâce à l’expression régulière, fermer les balises ouvertes s’appliquant uniquement à l’extrait et consulter le lien suivant pour des idées,

.

Fermer les balises HTML

Ou bien vous pouvez utiliser ce plugin prêt à l'emploi pour WordPress,

Extrait avancé

Ou, si vous le souhaitez, vous pouvez le modifier ou en échantillonner la structure et l’appliquer à votre fonction.

MISE À JOUR

J'ai décidé de faire un test, mais veuillez noter que j'ai utilisé une fonction différente que j'utilise souvent lors de la création d'extraits à la volée de longueurs personnalisables;

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(']]>', ']]&gt;', $content);
  return $content;
}

suivi de,

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 voir dans votre extrait.

Si vous souhaitez utiliser la boîte d'extraits ACTUAL dans l'écran d'édition postérieure, vous pouvez également ajouter cet extrait de code à 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(']]>', ']]&gt;', $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.

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 ()

REMARQUE Il 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 votre recherche.

    
réponse donnée userabuser 07.04.2012 - 17:12
0

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(']]>', ']]&gt;', $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');

MODIFIER: , assurez-vous que la minification HTML est désactivée dans W3 Total Cache (si vous l'utilisez).

[ Article d'origine ]

    
réponse donnée its_me 08.04.2012 - 08:18

Lire d'autres questions sur les étiquettes