Personalización de get_the_excerpt() para una longitud específica y salida "Leer Más".
Estoy personalizando una plantilla. Hay una lista que toma la introducción de los primeros 1-2 párrafos (todos los artículos de una categoría). Si establezco el extracto en 295 palabras, a veces la lista toma palabras adicionales del siguiente párrafo. Me gustaría añadir una etiqueta Leer Más para detenerlo. ¿Alguien puede ayudarme con esa parte?
<div id="all-div-cabrand-content-stories">
<div class="kids-families-con-cabrand-stories">
<?php echo get_the_post_thumbnail($page->ID, 'thubmnailstorysmall'); ?>
</div>
<div class="kids-con-cabrand-new-stories">
<span>
<?php print substr(get_the_excerpt(),wp_trim_excerpt(),295); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php the_permalink() ?>" rel="bookmark">Clic para Ver Historia y Video</a></i>
<br/>
</span>
</div>
</div>

Para obtener una longitud específica puedes usar la función: wp_trim_words. Tiene 3 parámetros.
- Texto a recortar. Ejemplo:
get_the_content()
- Número de palabras. Ejemplo:
295
- Qué añadir al final del texto. Ejemplo:
''
Esto significa nulo.
Usa esto:
<span>
<?php echo wp_trim_words( get_the_content(), 295, '' ); ?>
<i><a style="color:#1975D1;float:Right;" class="title" href="<?php
the_permalink() ?>" rel="bookmark">Haz clic para ver la historia & video</a></i>
<br/>
</span>

Puedes obtener el primer párrafo o los dos primeros con una expresión regular (regexp)
function custom_excerpt( $content = '' ){
if( empty( $content ) )
return $content;
$result = '';
$matches = array();
// obtener todos los párrafos de $content
preg_match_all( '#<\s*p[^>]*>(.*?)<\s*/\s*p>#ui', $content, $matches );
if( ! empty( $matches ) ){
// agregar el primer párrafo
$result = $matches[0][0];
// agregar el segundo párrafo si está disponible
if( isset( $matches[0][1] ) )
$result .= $matches[0][1];
// establecer la longitud del extracto
add_filter( 'excerpt_length', 'custom_excerpt_length' );
// crear el extracto personalizado
$result = custom_trim_excerpt( $result );
}
return $result;
}
function custom_excerpt_length(){
return 295;
}
function custom_trim_excerpt( $text = '' ){
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
return $text;
}
Llama a la función con
<?php print custom_excerpt( get_the_content( 'Leer más' ) ); ?>
Esto es un poco complicado porque no puedes pasarle un texto a wp_trim_excerpt()
. wp_trim_excerpt()
simplemente devolverá el texto si se le proporciona uno.
Tienes que copiar y personalizar un poco la función.

Puedes usar esta función:
function get_excerpt_trim($num_words='20', $more='...'){
$excerpt = get_the_excerpt();
$excerpt = wp_trim_words( $excerpt, $num_words , $more );
return $excerpt;
}
https://codex.wordpress.org/Function_Reference/wp_trim_words

Puedes usar la función incorporada
function custom_excerpt_length( $length ) {
return 20;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

Para obtener lo que deseas necesitas hacer dos cosas.
1) Establecer una longitud personalizada para el extracto (en palabras, no en caracteres), lo que se logra mejor siguiendo esta respuesta.
2) Simplemente llama a wp_trim_excerpt(), no lo envuelvas dentro de substr
Tu línea de código anterior no está haciendo lo que esperas que haga. Creo que está devolviendo los primeros 295 caracteres del extracto, pero no estoy completamente seguro de lo que la función php subtr() hará cuando le pases una cadena como segundo argumento cuando espera un número entero.
