Problema al habilitar el formato en extractos en Wordpress

4

Esto es lo que agregué en el archivo functions.php de mi tema para habilitar el formato de extractos en Wordpress ( fuente de la punta ):

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

El problema con habilitar el formato en los extractos de publicaciones parece ser que, si el texto está formateado por una etiqueta (ya sea <b> , <strong> , <i> , <em> , o cualquier otro) ) está cortado por el extracto intermedio, la etiqueta anulará el formato de toda la página. Echa un vistazo a esta captura de pantalla, por ejemplo:

Creo que esa es la razón por la que el formato de los extractos no está habilitado de forma predeterminada. ¿Hay alguna forma de arreglar esto? ¿Hay algún problema con el código?

Espero que pueda obtener ayuda aquí. Gracias!

    
pregunta its_me 07.04.2012 - 15:10

2 respuestas

5

Esta es una de las razones por las que el marcado HTML se elimina de los extractos en primer lugar, para evitar que este tipo de problemas ocurran, sin embargo, donde hay una voluntad, hay una manera ...

Puede, mediante el uso de expresiones regulares, cerrar las etiquetas abiertas aplicables solo al extracto y es posible que desee consultar el siguiente enlace para obtener algunas ideas,

Cerrar etiquetas HTML

O, alternativamente, puedes usar este complemento listo para WordPress,

Extracto avanzado

O si se siente tan inclinado, puede modificarlo o muestrear su estructura y aplicarlo a su función.

ACTUALIZACIÓN

Decidí realizar una prueba, sin embargo, tenga en cuenta que he usado una función diferente que uso a menudo al crear extractos con longitudes personalizables sobre la marcha;

Ponga esto en su archivo 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 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;
} 

Entonces en tu tema harías lo siguiente,

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

Donde 55 = la longitud en palabras que quieres que sea tu extracto.

Si desea utilizar el cuadro de extracto ACTUAL dentro de la pantalla de edición posterior, también puede agregar este fragmento a su archivo de funciones,

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

Y su uso sería,

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

Sin embargo, si utiliza el cuadro de extracto ACTUAL en la pantalla de edición posterior, tendría que escribir manualmente las etiquetas <strong>,<em>,<i>,<a>,etc.. , por supuesto. A menos que modifique el TinyMCE predeterminado para el cuadro de extracto.

Así que ahí lo tienen, están cubiertos en ambos casos, ya sea ...

1) capturar un extracto de the_content () 2) capturar un extracto de the_excerpt ()

NOTA Puede haber una manera más eficiente de hacerlo escribiendo la funcionalidad del ejemplo de Cerrar etiquetas HTML por Milan en caso de que desee investigar más a fondo.

    
respondido por el userabuser 07.04.2012 - 17:12
0

Es tan simple como agregar esta función al archivo functions.php de tu tema. El código ha sido comentado claramente, por lo que es 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');

EDITAR: Y asegúrese de que la minificación de HTML esté desactivada en W3 Total Cache (si la está usando).

[ Artículo de origen ]

    
respondido por el its_me 08.04.2012 - 08:18

Lea otras preguntas en las etiquetas