web-dev-qa-db-fra.com

Problème lié à l'activation du formatage dans des extraits dans Wordpress

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:

 Screenshot 

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!

4
its_me

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,

Fermer les balises HTML

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

Extrait avancé

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

METTRE À JOUR

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

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.

5
userabuser

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

EDIT: Et assurez-vous que la minification HTML est désactivée dans W3 Total Cache (si vous l’utilisez).

[ Article d'origine ]

0
its_me