limitar palabras en el contenido del post y agregar enlace "leer más"

15 oct 2012, 01:27:08
Vistas: 18K
Votos: 4

Como puedes ver en el código, la rutina muestra el post que tiene un id de 266. Ahora lo único que quiero es limitar las palabras mostradas en el contenido de ese post. Digamos, quiero limitar las palabras a un número de 300 y luego agregar un enlace "leer más".

Este es el código que tengo hasta ahora:

    $post_id = 266;
    echo "<div id='widgets-wrapper3'><div id='marginwidgets' style='overflow: auto; max-width: 100%; margin: 0 auto; border: none !important;'>";

    $queried_post = get_post($post_id); 
    echo "<div class='thewidgets'>";
    echo $queried_post->post_content;
    echo '</div>';

    echo "</div></div>";    
?>
1
Comentarios

¿Algún progreso en esta pregunta? Tienes tres respuestas (de alto nivel) proporcionadas.

kaiser kaiser
26 nov 2012 04:59:40
Todas las respuestas a la pregunta 2
3

Siempre tengo el mismo problema con el extracto del post y el contenido del post. Existen varios hooks y funciones para este propósito, como mencionó @kaiser. Pero a veces no hacen exactamente lo que necesito.

Aquí está mi solución: escribo mi propia función que toma el contenido del post y lo trunca en un número específico de palabras:

function wpse69204_excerpt( $num_words = 20, $ending = '...', $post_id = null )
{
    global $post;

    // Truncar contenido del post
    $current_post = $post_id ? get_post( $post_id ) : $post;
    $excerpt = strip_shortcodes( $current_post->post_content );
    $excerpt = wp_trim_words( $excerpt, $num_words, $ending );

    // Enlace "Leer más"
    $excerpt .= '<a href="' . get_permalink( $post ) . '" title="">Continuar leyendo...</a>';

    return $excerpt;
}
15 oct 2012 04:26:04
Comentarios

Acabo de encontrar wp_trim_words/*_excerpt(). Algo interesante a tener en cuenta: También maneja idiomas donde 1 carácter = 1 palabra como el chino.

kaiser kaiser
15 oct 2012 04:30:21

¿Qué pasa si hay HTML dentro del contenido de una publicación? ¿También se contaría en el límite de palabras? No quiero incluir las etiquetas HTML y que permanezcan intactas, para que cuando haya HTML, solo el contenido puro sea lo que capture la función para limitar el conteo de palabras.

Juliver Galleto Juliver Galleto
16 oct 2012 01:03:51

La función wp_trim_words elimina todas las etiquetas HTML. Ver código fuente aquí

Anh Tran Anh Tran
16 oct 2012 04:01:40
2

Hay tres filtros que controlan el enlace »más«, dependiendo de qué función/Etiqueta de Plantilla se esté utilizando. Lo malo es que se interceptan entre sí. Lo bueno es que puedes modificar fácilmente la salida del filtro usando current_filter() para obtener el nombre del filtro actualmente adjunto y modificar la salida.

Luego tenemos el filtro 'excerpt_length' para limitar la longitud del extracto. Este no nos permite añadir un enlace permanente, pero nos ayuda en combinación con los otros filtros. Mira el 2do plugin.

El plugin permalink-more

Este plugin añade el enlace permanente al contenido o al extracto, dependiendo de lo que se muestre. También reinicia el filtro excerpt_more para que no devuelva nada, evitando así interferencias con los otros filtros.

<?php
/** Plugin Name: (#69204) »kaiser« Añade un enlace permanente al extracto y al contenido */

/**
 * Modifica la visualización del enlace "más"
 * 
 * @param  string $permalink
 * @param  string $text
 * @return string $html
 */
function wpse69204_more_link( $output )
{
    $html .= '<span class="post-more">&nbsp;';
    $html .= sprintf(
        '<a href="%s#more-%s" class="more-link" title="leer más" >'
        ,get_permalink()
        ,get_the_ID()
    );
    $html .= '</a></span>';

    // Sobrescribe 'excerpt_more'
    if ( 'excerpt_more' === current_filter() )
        return;

    // Recorta el contenido para el filtro `get_the_excerpt`.
    $output = wp_trim_words( $output, 300 );

    // Añade para el extracto
    if ( 'get_the_excerpt' === current_filter() )
        return $output.$html;

    // El enlace permanente para el filtro `the_content_more_link`.
    return $html;
}
# Enlace "Más" para el contenido
add_filter( 'the_content_more_link', 'wpse69204_more_link' );
add_filter( 'get_the_excerpt', 'wpse69204_more_link' );
add_filter( 'excerpt_more', 'wpse69204_more_link' );

El plugin excerpt-more length

Si solo quieres modificar la longitud del extracto, puedes usar una configuración de filtros mucho más simple. El siguiente plugin hace un trabajo muy ingenioso. Reduce el contenido (estamos en el bucle y tenemos datos del post para acceder) a 300 palabras. En el siguiente paso, cuenta las letras de cada palabra individual. Luego simplemente devuelve este número (asignado dinámicamente).

<?php
/** Plugin Name: (#69204) »kaiser« Limita la longitud del extracto por conteo de palabras */

function wpse69204_excerpt_length( $length )
{
    $to_count = array_splice( get_the_content(), 300 );
    $i = 0;
    foreach ( $to_count as $word )
    {
        $i += strlen( $word );
    }

    return $i;
}
add_filter( 'excerpt_length', 'wpse69204_excerpt_length' );

Notas

  1. Ambos plugins son »sin configuración«. Solo sube, activa y listo.
  2. Deberás usar the_content() o the_excerpt() en tu tema para aprovechar estos plugins.
15 oct 2012 04:17:15
Comentarios

¿qué pasa si hay HTML dentro del contenido de una publicación? ¿también se contaría en el límite de palabras? solo quiero excluir las etiquetas HTML y dejarlas aparte para que cuando haya HTML, solo el contenido puro sea capturado por la función que limita el conteo de palabras.

Juliver Galleto Juliver Galleto
16 oct 2012 01:02:21

No, the_excerpt no tiene etiquetas HTML. Consejo: Siempre prueba esto antes de reportar. Probar y equivocarse es más fácil que discutir y adivinar :) Gracias.

kaiser kaiser
16 oct 2012 01:04:27