Problema ao ativar a formatação em trechos no Wordpress

4

Isso é o que eu adicionei no arquivo functions.php do meu tema para habilitar a formatação de trechos no Wordpress ( fonte de a dica ):

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

O problema de ativar a formatação em trechos de postagem parece ser que, se o texto formatado por uma tag (seja <b> , <strong> , <i> , <em> ou qualquer outro para esse assunto ) é cortado pelo trecho intermediário, a formatação de toda a página será substituída por essa tag. Dê uma olhada nesta captura de tela, por exemplo:

Acredito que essa seja a razão pela qual a formatação de trechos não está ativada por padrão. Existe alguma maneira de corrigir isso? Tem algo errado com o código?

Espero conseguir ajuda aqui. Obrigado!

    
por its_me 07.04.2012 / 15:10

2 respostas

5

Esta é uma das razões pelas quais a marcação HTML é removida de trechos em primeiro lugar, para evitar que tais problemas ocorram, no entanto, onde há um testamento, há uma maneira ...

Você pode, usando expressões regulares, fechar as tags abertas aplicáveis apenas ao trecho e talvez queira dar uma olhada no link a seguir para algumas ideias,

Feche as tags HTML

Ou, alternativamente, você pode usar este plugin pronto para o WordPress,

Trecho avançado

Ou, se você se sentir inclinado, pode modificá-lo ou experimentar sua estrutura e aplicá-lo à sua função.

UPDATE

Eu decidi fazer um teste, mas por favor note que usei uma função diferente que costumo usar ao criar trechos com comprimentos personalizáveis na hora;

Coloque isso no arquivo 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;
}

seguido por

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;
} 

Em seguida, no seu tema, você faria o seguinte,

<?php echo closetags( content(55) );?>  

Onde 55 = o comprimento em palavras que você deseja que seu trecho seja.

Se você quiser usar a caixa EXTREMIDADE REAL na tela de edição de postagens, também poderá adicionar esse snippet ao arquivo de funções,

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;
}

E seu uso seria

<?php echo closetags( excerpt(55) );?>  

No entanto, se estiver usando a caixa de excertos ACTUAL na tela de edição de post, você terá que escrever manualmente suas tags <strong>,<em>,<i>,<a>,etc.. , é claro! A menos que você modifique o TinyMCE padrão para a caixa de trechos.

Então, você tem isso, você está coberto em ambos os casos, quer ...

1) pegando um trecho de the_content () 2) pegando um trecho do the_excerpt ()

OBSERVAÇÃO Pode haver uma maneira mais eficiente de fazer isso escrevendo a funcionalidade do exemplo Fechar tags HTML por Milan caso você queira investigar isso ainda mais.

    
por userabuser 07.04.2012 / 17:12
0

É tão simples quanto adicionar essa função ao arquivo functions.php do seu tema. O código foi comentado claramente, por isso é autoexplicativo:

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: E certifique-se de que a minição de HTML está desativada no Cache total do W3 (se você estiver usando).

[ Artigo de origem ]

    
por its_me 08.04.2012 / 08:18