• Resuelto ogonzalez

    (@ogonzalez)


    Hola.

    Estoy mirando de hacer un truncate (recortar) el titulo de los posts con la siguiente funcion:

    function custom_trim_my_title( $title ) {
    if ( strlen( $title ) >= 70 && ! is_singular() ) {
    $title = substr( $title, 0, 70 ) . ‘…’;
    return $title;
    }
    return $title;
    }
    add_filter( ‘the_title’, ‘custom_trim_my_title’ );

    El problema es que esta función corta los 70 caracteres sin respetar la palabra. Alguien sabe como hacer lo mismo pero sin cortar la palabra, es decir, hacer el corte por palabras y no por caracteres?

    Gracias.

Viendo 9 respuestas - de la 1 a la 9 (de un total de 9)
  • Yo personalmente crearia una funcion

    function cut_words( $str, $num ) {
    $words = preg_split( ‘/[\s]+/’, $str, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $str = substr( $str, 0, $words[$num][1] );
    }
    unset( $words, $num );
    return trim( $str );
    }

    Y a la hora de mostrar el titulo:
    $title = get_the_title();
    $num_words = 10; /*limitamos a 10 palabras */
    echo cut_words($title, $num_words);

    Usando tu funcion:

    function custom_trim_my_title( $title ) {
    $num = 10;
    $words = preg_split( ‘/[\s]+/’, $title, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $title = substr( $str, 0, $words[$num][1] );
    }
    return trim( $title );
    }
    add_filter( ‘the_title’, ‘custom_trim_my_title’ );

    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    Iniciador del debate ogonzalez

    (@ogonzalez)

    Gracias Feno.

    El problema que veo o que tengo es que a parte de desaparecer los «…» usando el equivalente que has puesto a la funcion que ya uso, al final del texto si se tiene que cortar, si tengo algun titulo con más de 10 palabras este no se visualiza al parecer.

    • Esta respuesta fue modificada hace 6 años, 7 meses por ogonzalez.

    El tema de los puntos es sencillo:
    if( isset($words[$num][1]) ){
    $title = substr( $str, 0, $words[$num][1] ).’…’;
    }

    Si que se visualizaria:
    haces un return de $title Siempre, en el caso de que existan 10 palabra entras en el «if» y acortas y luego haces el return, si no se el caso, simplemente haces el return.
    Pero siempre hace te devuelve el $title, acortado o no.

    Iniciador del debate ogonzalez

    (@ogonzalez)

    El problema es que si el titulo tiene menos de 10 palabras no lo muestra. Si supera las 10 palabras si lo muestra. Esto lo estoy haciendo con desde el functions.php, ya que no puedo editar la parte que monta el post. Uso la funcion asi:

    function custom_trim_my_title( $title ) {
    $num = 10;
    $words = preg_split( ‘/[\s]+/’, $title, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $title = substr( $str, 0, $words[$num][1] ).’…’;
    }
    return trim( $title );
    }
    add_filter( ‘the_title’, ‘custom_trim_my_title’ );

    Perdona lo hice sin probarlo

    $title = substr( $title, 0, $words[$num][1] ).’…’;

    fui haciendo el codigo sin probar… y por costumbre las cadenas de texto las nombro $str

    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    Iniciador del debate ogonzalez

    (@ogonzalez)

    Disculpa, lamentablemente no acaba de ir fino, usando esta formulación en el functions.php

    function custom_trim_my_title( $title ) {
    $num = 3;
    $words = preg_split( ‘/[\s]+/’, $title, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $title = substr( $title, 0, $words[$num][1] ).’…’;
    }
    return trim( $title );
    }
    add_filter( ‘the_title’, ‘custom_trim_my_title’ );

    Ahora no corta ningun titulo, entiendo que deberia de recortar los titulos a un máximo de 3 palabras tal y como esta puesto, pero en cambio aparece el titulo sin hacer ningún truncate.

    HE copiado el codigo tal lo has puesto (cambiando las comillas simples )
    y me funciona perfectamente

    function custom_trim_my_title( $title ) {
    $num = 3;
    $words = preg_split( '/[\s]+/', $title, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $title = substr( $title, 0, $words[$num][1] ).'…';
    }
    return trim( $title );
    }
    add_filter( 'the_title', 'custom_trim_my_title' );

    Lo unico que debo hacer es cambiar la comilla «´» por la comilla simple ' ( el foro la cambia).

    Imagen ejemplo

    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    • Esta respuesta fue modificada hace 6 años, 7 meses por Feno.
    Iniciador del debate ogonzalez

    (@ogonzalez)

    Genial, ahora funciona a la parfección. El problema que tengo ahora es que en la pagina de detalle del post tambien aparece el titulo cortado, la idea era, que esta funcion fuera para el listado de post, pero luego en el post general se viera completo el titulo.

    El post usa

    <?php the_title(); ?>

    Que entiendo que es lo mismo y por eso se corta. Se pueda añadir una excepción aqui?

    Creo que esto te sirve:

    function custom_trim_my_title( $title ) {
    if (!is_single()) {
    $num = 3;
    $words = preg_split( '/[\s]+/', $title, -1, PREG_SPLIT_OFFSET_CAPTURE );
    if( isset($words[$num][1]) ){
    $title = substr( $title, 0, $words[$num][1] ).'…';
    }
    }
    return trim( $title );
    }
    add_filter( 'the_title', 'custom_trim_my_title' );
Viendo 9 respuestas - de la 1 a la 9 (de un total de 9)
  • El debate ‘Cortar titulos de post por palabras’ está cerrado a nuevas respuestas.