Establecer longitud máxima del título - similar a la longitud del extracto fuera de single.php
He estado buscando un fragmento de código que me permita limitar la longitud del título de forma similar a lo que se puede hacer con the_excerpt, mostrando "(...)" si el título es demasiado largo.
Quiero usarlo en bucles fuera de single.php, por ejemplo en mi barra lateral donde un título extremadamente largo afectaría el diseño.
Todo lo que encontré fue este código, pero obviamente no hace lo que necesito:
function maxWord($title)
{
global $post;
$title = $post->post_title;
if (str_word_count($title) >= 10 ) // Establece esto al número máximo de palabras
wp_die( __('Error: el título de tu publicación excede el máximo de palabras permitidas.') );
}
add_action('publish_post', 'maxWord');
¿Es posible hacer esto?
Busco algo similar a esto, pero para el título en lugar del extracto:
function excerpt($limit) {
$excerpt = explode(' ', get_the_excerpt(), $limit);
if (count($excerpt)>=$limit) {
array_pop($excerpt);
$excerpt = implode(" ",$excerpt).' (...)';
} else {
$excerpt = implode(" ",$excerpt);
}
$excerpt = preg_replace('`\[[^\]]*\]`','',$excerpt);
return $excerpt;
}
function content($limit) {
$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(']]>', ']]>', $content);
return $content;
}

Esto depende 100% de cómo estés obteniendo el título. Si estás usando un objeto global (es decir, $post->post_title
) entonces no estás pasándolo por ningún filtro y tendrás que usar algún procesamiento posterior sofisticado para recortar el título.
Sin embargo, si estás dentro de un bucle de publicaciones (post loop), usa the_title()
para mostrar el título de la publicación actual o get_the_title()
para obtenerlo programáticamente.
Si usas una de esas dos funciones, WordPress pasará automáticamente el título por un filtro antes de devolvértelo.
Luego puedes agregar lo siguiente al principio de tu archivo sidebar.php
:
function japanworm_shorten_title( $title ) {
$newTitle = substr( $title, 0, 20 ); // Solo toma los primeros 20 caracteres
return $newTitle . " …"; // Añade puntos suspensivos al texto (...)
}
add_filter( 'the_title', 'japanworm_shorten_title', 10, 1 );
Ahora, cada vez que referencies the_title()
o get_the_title()
en tu barra lateral, devolverán la versión acortada automáticamente en lugar de la versión completa.
Solo recuerda eliminar este filtro al final de tu archivo sidebar.php
o también se aplicará en otras partes de tu tema:
remove_filter( 'the_title', 'japanworm_shorten_title' );
Actualización 10/3/2011
Si quieres una función que puedas usar en cualquier parte, recomiendo crear tus propias versiones de get_the_title()
y the_title()
y usarlas en tu código. Por ejemplo:
function japanworm_get_the_title( $length = null, $id = 0 ) {
$post = &get_post($id);
$title = isset($post->post_title) ? $post->post_title : '';
$id = isset($post->ID) ? $post->ID : (int) $id;
if ( !is_admin() ) {
if ( !empty($post->post_password) ) {
$protected_title_format = apply_filters('protected_title_format', __('Protegido: %s'));
$title = sprintf($protected_title_format, $title);
} else if ( isset($post->post_status) && 'private' == $post->post_status ) {
$private_title_format = apply_filters('private_title_format', __('Privado: %s'));
$title = sprintf($private_title_format, $title);
}
}
// Acortar el título
if ( null != $length ) {
$length = (int) $length;
$title = substr( $title, 0, $length ); // Solo toma los primeros X caracteres
$title .= " …";
}
return apply_filters( 'the_title', $title, $id );
}
function japanworm_the_title($before = '', $after = '', $echo = true, $length = null) {
$title = get_the_title($length);
if ( strlen($title) == 0 )
return;
$title = $before . $title . $after;
if ( $echo )
echo $title;
else
return $title;
}
Estas funciones están copiadas de las originales the_title()
y get_the_title()
, por lo que deberían funcionar en el bucle de la misma manera. Aunque no lo he probado.

Hola. Muchas gracias. En realidad estoy buscando algo que pueda usar más "libremente" en cualquier lugar que desee (ver mi pregunta actualizada). No quiero usarlo solo en mi barra lateral, eso era solo un ejemplo. Tengo un código similar en mi function.php para un extracto personalizado donde puedo ajustar la longitud poniendo un número en "(30)". ¿Es eso también posible para el título?

Hola. Disculpa la demora en responder. Estuve fuera unos días. Probé el código y lo puse en mi function.php pero obtuve un error de sintaxis, así que parece que no funciona desafortunadamente.

Ahí es donde entra el comentario "No he probado esto, sin embargo". ¿Cuál fue el error de sintaxis? Podría haber tenido un error tipográfico.

Parece ser esta línea $title .= " …"
}
ya que el mensaje de error dice: "Parse error: syntax error, unexpected '}' in /hermes/bosweb25a/b155/ipg.zoomingjapancom/wp-content/themes/alltuts/functions.php on line 51"

Debería haber un punto y coma adicional al final de esa línea (dejándolo como $title .= " …";
). Editando mi respuesta...

Vale, genial, ahora ya no recibo un mensaje de error, pero la función no parece funcionar. Quizás estoy llamando mal al título. Probé: <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title('12'); ?></a>
Lo intenté con y sin las '' ... en ambos casos solo muestra un "12" delante del título. ¿Alguna idea? ¡Y muchísimas gracias!

Vuelve a mirar el código. Si todavía estás llamando a the_title()
entonces no estás usando las funciones que escribí arriba. Estas estaban destinadas a ser reemplazos de las funciones estándar de WordPress que incluyen tu funcionalidad personalizada.

¿Así, verdad? <?php japanworm_the_title(2); ?>
Sigue el mismo problema. Y si pruebo esto <?php japanworm_get_the_title(12); ?>
no se muestra ningún título en absoluto.

Mira la firma de la función: function japanworm_get_the_title( $length = null, $id = 0 )
... así que necesitas especificar tanto la longitud como el ID. Prueba japanworm_get_the_title(20, 12)
para devolver un título de 20 caracteres para el post con ID 12.

Entiendo, eso significa que solo puedo elegir acortar el título de UN post por ciclo, ¿correcto? ¿O es posible usar varios IDs conectados con &? Pero supongo que sería mejor poder establecer una longitud máxima global para todos los títulos en un ciclo.

Puedes usar la función wp_trim_excerpt().
Si necesitas especificar un límite de caracteres, puedes usar el filtro excerpt_length.
<?php echo wp_trim_excerpt( get_the_title() ); ?>

Solución con API de WordPress
Si deseas recortar texto únicamente en inglés o en idiomas con caracteres simples, usar substring
sería la forma correcta. Sin embargo, si quieres recortar idiomas como Chino, Japonés u otros, usar substring podría ser problemático, ya que utilizan unicode para su representación.
Usar wp_trim_words() sería una forma simple y directa de resolver tu problema.
wp_trim_words( $text, $num_words = 55, $more = null );
P.D. Inspirado por Leo Caseiro.
Solución solo con CSS
Si deseas descubrir cómo recortar palabras dinámicamente, especialmente en diseño responsivo, deberías usar CSS de esta manera:
.card-title {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
