No estás registrado (Registrarse)

Vanilla 1.1.10 es un producto de Lussumo. Para más información: Documentación, Soporte.

    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 20th 2011 editado
     # 1
    Tengo un problemilla con la extension de los comentarios recientes en un nuevo site que estoy lanzando, funciona sobre wordpress. El tema es que la barra lateral es estrecha, y el widget de comentarios recientes me rompe el diseño en cuanto un titulo del post comentado es demasiado largo.
    Me gustaria saber como podría limitar la extension del titulo de modo que en lugar de "Titulo de post que es muy largo" me aparezca "Titulo de post que...".
    El site es este: AboutLux (barra lateral derecha, "Recent commented posts")
    Muchas gracias :webmainer:

    Edito: dejo el codigo del widget a ver si algun alma caritativa me puede echar una mano :jat:
    /**
    * Recent_Comments widget class
    *
    * @since 2.8.0
    */
    class WP_Widget_Recent_Comments extends WP_Widget {

    function WP_Widget_Recent_Comments() {
    $widget_ops = array('classname' => 'widget_recent_comments', 'description' => __( 'The most recent comments' ) );
    $this->WP_Widget('recent-comments', __('Recent Comments'), $widget_ops);
    $this->alt_option_name = 'widget_recent_comments';

    if ( is_active_widget(false, false, $this->id_base) )
    add_action( 'wp_head', array(&$this, 'recent_comments_style') );

    add_action( 'comment_post', array(&$this, 'flush_widget_cache') );
    add_action( 'transition_comment_status', array(&$this, 'flush_widget_cache') );
    }

    function recent_comments_style() { ?>
    <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>
    <?php
    }

    function flush_widget_cache() {
    wp_cache_delete('widget_recent_comments', 'widget');
    }

    function widget( $args, $instance ) {
    global $comments, $comment;

    $cache = wp_cache_get('widget_recent_comments', 'widget');

    if ( ! is_array( $cache ) )
    $cache = array();

    if ( isset( $cache[$args['widget_id']] ) ) {
    echo $cache[$args['widget_id']];
    return;
    }

    extract($args, EXTR_SKIP);
    $output = '';
    $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title']);

    if ( ! $number = (int) $instance['number'] )
    $number = 5;
    else if ( $number < 1 )
    $number = 1;

    $comments = get_comments( array( 'number' => $number, 'status' => 'approve' ) );
    $output .= $before_widget;
    if ( $title )
    $output .= $before_title . $title . $after_title;

    $output .= '<ul id="recentcomments">';
    if ( $comments ) {
    foreach ( (array) $comments as $comment) {
    $output .= '<li class="recentcomments">' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('%2$s', 'widgets'), get_comment_author_link(), '<a href="' . esc_url( get_comment_link($comment->comment_ID) ) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
    }
    }
    $output .= '</ul>';
    $output .= $after_widget;

    echo $output;
    $cache[$args['widget_id']] = $output;
    wp_cache_set('widget_recent_comments', $cache, 'widget');
    }

    function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['title'] = strip_tags($new_instance['title']);
    $instance['number'] = (int) $new_instance['number'];
    $this->flush_widget_cache();

    $alloptions = wp_cache_get( 'alloptions', 'options' );
    if ( isset($alloptions['widget_recent_comments']) )
    delete_option('widget_recent_comments');

    return $instance;
    }

    function form( $instance ) {
    $title = isset($instance['title']) ? esc_attr($instance['title']) : '';
    $number = isset($instance['number']) ? absint($instance['number']) : 5;
    ?>
    <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label>
    <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p>

    <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of comments to show:'); ?></label>
    <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p>
    •  
      CommentAuthorignatius
    • CommentTimeJan 20th 2011
     # 2
    Puedes editar la plantilla y procesar al variable del título antes de que la muestre con la función substr() de php

    algo como

    if(strlen($titulo) > 60) { $titulo=substr($titulo, 0, 60)."..."; } //si el título mide más de 60 caracteres, esto pilla los primeros 60

    Esta forma es muy simple pero tiene el inconveniente de que corta donde le pille, si quieres que no corte palabras a medias hay que currar un pelín más pero tampoco es difícil
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 20th 2011
     # 3
    Hombre preferiria que no cortase palabras pero si es muy complicado me vale que corte donde le pille. He pegado el codigo del widget arrriba, donde hay que meter el codigo que dices?
    •  
      CommentAuthorignatius
    • CommentTimeJan 20th 2011
     # 4
    Tendría que mirarlo con calma y ahora mismo no puedo... sorry, seguro que algo wpexpert lo mira en un pis pás

    Aquí tienes varias soluciones para evitar cortar palabras
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 20th 2011
     # 5
    Ok muchas gracias voy a investigar a ver si lo consigo. Pregunte en ese foro hace unos dias pero nadie respondio :smash:
    •  
      CommentAuthorJavi
    • CommentTimeJan 20th 2011 editado
     # 6
    if(strlen($titulo) > 60) { $titulo=substr($titulo, 0, 60)."..."; } //si el título mide más de 60 caracteres, esto pilla los primeros 60

    podría ser algo así por palabras:


    <?php
    function cortarPalabras($titulo,$numPalabras){

    $arrayTitulo=explode(' ',$titulo);

    $tituloFinal="";
    $i=0;

    while($i<$numPalabras){
    $tituloFinal.=$arrayTitulo[$i];
    $i++;
    }
    return $tituloFinal;
    }


    Algo así podría servir, donde $numPalabras pones el numero máximo de palabras

    No me hago responsable del codigo que he escrito, si se te borra la base de datos no es mi culpa :dumb::dumb:
    •  
      CommentAuthorPedro
    • CommentTimeJan 20th 2011
     # 7
    f(strlen($title)>60) $title=substr($title,0,strpos($title," ",50))."...";

    Yo probaría una solución así. Si título tiene más de 60 caracteres, cortar en el espacio que esté a partir del carácter 50 (media de longitud de palabra de 10 caracteres, igual y me he pasado)X-Y.es
    •  
      CommentAuthorPedro
    • CommentTimeJan 20th 2011
     # 8
    Posted By: Javi$tituloFinal.=$arrayTitulo[$i];


    Aquí sería: $tituloFinal.=" ".$arrayTitulo[$i]; :webmainer:X-Y.es
    •  
      CommentAuthorJavi
    • CommentTimeJan 20th 2011
     # 9
    sierto Pedro :bigsmile:
    •  
      CommentAuthorAntonio
    • CommentTimeJan 20th 2011 editado
     # 10
    Inspirándome en la función de Javi, esto se adecuará a lo que buscar


    function cortar_titulo( $titulo, $longitud = 60 ) { // Devuelve el título cortado en palabras

    // Inicializacion de variables
    $longitud -= 3; // Para poner los puntitos
    $palabras = explode( ' ', $titulo ); // Separamos por palabras
    $resultado = '';
    $resultadoTemporal = $palabras[0];
    $i = 1;

    while( strlen( $resultadoTemporal ) < $longitud ) { // Añadimos palabras mientras sea menor de longitud
    $resultado = $resultadoTemporal;
    $resultadoTemporal .= ' ' . $palabras[$i];
    $i++;
    }

    if( strlen( $resultado ) == 0 ) // Si el resultado ha quedado vacío porque la primera palabra es menor que la longitud
    $resultado = substr( $titulo, 0, $longitud );

    return( $resultado . '...' );

    }
    •  
      CommentAuthorPedro
    • CommentTimeJan 20th 2011
     # 11
    explode en vez de implode :smash:X-Y.es
    •  
      CommentAuthorJavi
    • CommentTimeJan 20th 2011
     # 12
    Posted By: Pedroexplode en vez de implode :smash:Mis sitios


    Como te gusta la función explode eh :devil::devil::devil:
    •  
      CommentAuthorignatius
    • CommentTimeJan 20th 2011 editado
     # 13
    Esto cada vez está más completo... Pero la función ya se depurará más o menos: echadle una mano a integrarla en el widget que es lo que más falta le hace :komete4:
    •  
      CommentAuthorAntonio
    • CommentTimeJan 20th 2011
     # 14
    Posted By: Pedroexplode en vez de implode


    Rectificado. :cata3:
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 20th 2011
     # 15
    Posted By: ignatiusEsto cada vez está más completo... Pero la función ya se depurará más o menos: echadle una mano a integrarla en el widget que es lo que más falta le hace

    :silbo:
    •  
      CommentAuthorAntonio
    • CommentTimeJan 20th 2011 editado
     # 16
    En la función widget esta linea:

    $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title']);

    Cambiarla por

    $title = cortar_titulo( apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] ) );

    y añadir la función al fichero y ya está. (espero)

    :bigsmile:

    PD: he corregido dos pequeños errores que había.
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 20th 2011
     # 17
    Fatal error: Call to undefined function cortar_titulo() in /home/xxx/public_html/xxx/wp-includes/default-widgets.php on line 664
    :confuso:
    ¿Que hago mal?

    Lo he dejado de la siguiente manera: (lo de $title = cambiar_titulo lo he sustituido por $title = cortar_titulo)

    function cortar_titulo( $titulo, $longitud = 60 ) { // Devuelve el título cortado en palabras

    // Inicializacion de variables
    $longitud -= 3; // Para poner los puntitos
    $palabras = explode( ' ', $titulo ); // Separamos por palabras
    $resultado = '';
    $resultadoTemporal = $palabras[0];
    $i = 1;

    while( strlen( $resultadoTemporal ) < $longitud ) { // Añadimos palabras mientras sea menor de longitud
    $resultado = $resultadoTemporal;
    $resultadoTemporal .= ' ' . $palabras[$i];
    $i++;
    }

    if( strlen( $resultado ) == 0 ) // Si el resultado ha quedado vacío porque la primera palabra es menor que la longitud
    $resultado = substr( $titulo, 0, $longitud );

    return( $resultado . '...' );

    }


    function widget( $args, $instance ) {
    global $comments, $comment;

    $cache = wp_cache_get('widget_recent_comments', 'widget');

    if ( ! is_array( $cache ) )
    $cache = array();

    if ( isset( $cache[$args['widget_id']] ) ) {
    echo $cache[$args['widget_id']];
    return;
    }

    extract($args, EXTR_SKIP);
    $output = '';
    $title = cortar_titulo( apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] ) );

    if ( ! $number = (int) $instance['number'] )
    $number = 5;
    else if ( $number < 1 )
    $number = 1;

    $comments = get_comments( array( 'number' => $number, 'status' => 'approve' ) );
    $output .= $before_widget;
    if ( $title )
    $output .= $before_title . $title . $after_title;

    $output .= '';
    $output .= $after_widget;

    echo $output;
    $cache[$args['widget_id']] = $output;
    wp_cache_set('widget_recent_comments', $cache, 'widget');
    }
    •  
      CommentAuthorAntonio
    • CommentTimeJan 20th 2011 editado
     # 18
    La funcion debes definirla antes o después de la clase (mejor antes).

    PEGARLA AQUÍ function cortar_titulo(......

    class WP_Widget_Recent_Comments extends WP_Widget {
    .....
    $title = cortar_titulo(....



    sino lo que pasa es que lo hass definido como un método de la clase (que se puede dejar como está) pero para llamarla tienes que hacerlo como:


    $title = $this->cortar_titulo( apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] ) );


    Aunque en esta opción tengo dudas de si la clase es llamada como Singleton o de forma tradicional. Si es como Singleton (aunque desconozco la clase padre) debe ser algo como.


    $title = $instance->cortar_titulo( apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] ) );


    Para evitar problemas dejaría la función fura de la clase aunque la otra opción se adecúe más al estilo POO de WP.
    :phantom:
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 21st 2011 editado
     # 19
    He colocado la funcion fuera como has dicho pero lo que hace es que los puntos suspensivos aparezcan arriba, antes de la lista de comentarios (que no los corta).

    /**
    * Recent_Comments widget class
    *
    * @since 2.8.0
    */
    <strong>function cortar_titulo( $titulo, $longitud = 60 ) { // Devuelve el título cortado en palabras

    // Inicializacion de variables
    $longitud -= 3; // Para poner los puntitos
    $palabras = explode( ' ', $titulo ); // Separamos por palabras
    $resultado = '';
    $resultadoTemporal = $palabras[0];
    $i = 1;

    while( strlen( $resultadoTemporal ) < $longitud ) { // Añadimos palabras mientras sea menor de longitud
    $resultado = $resultadoTemporal;
    $resultadoTemporal .= ' ' . $palabras[$i];
    $i++;
    }

    if( strlen( $resultado ) == 0 ) // Si el resultado ha quedado vacío porque la primera palabra es menor que la longitud
    $resultado = substr( $titulo, 0, $longitud );

    return( $resultado . '...' );

    }</strong>

    class WP_Widget_Recent_Comments extends WP_Widget {
    ...


    Y mas abajo sustituido la linea de $title, voy a probar con el metodo POO a ver si no me termino cargando el site :dumb:

    Acutalizo:
    Metodo POO 1: Lo mismo, los 3 puntitos arriba
    Metodo POO2: Fatal error: Call to a member function cortar_titulo() on a non-object in /home/xxx/public_html/xxx/wp-includes/default-widgets.php on line 665
    •  
      CommentAuthorAntonio
    • CommentTimeJan 21st 2011
     # 20

    class WP_Widget_Recent_Comments extends WP_Widget {
    ...


    Jeje, los 3 puntitos eran para indicarte que ahí va el resto de la clase. eliminalos:
    class WP_Widget_Recent_Comments extends WP_Widget {
    Aquí sin puntitos
    •  
      CommentAuthorlbarcelo
    • CommentTimeJan 21st 2011
     # 21
    No no, si esos puntitos los he puesto yo, era a modo de etc :tongue:
    •  
      CommentAuthorAntonio
    • CommentTimeJan 21st 2011
     # 22
    :bigsmile:

    Lo único que se me ocurre ya es que, siguiendo con la implementación "Metodo POO 1: Lo mismo, los 3 puntitos arriba",

    volver a poner esto como estaba:
    $title = $this->cortar_titulo( apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] ) );

    $title = apply_filters('widget_title', empty($instance['title']) ? __('Recent Comments') : $instance['title'] );


    y aplicar el filtro aqui:
    $output .= $before_title . $title . $after_title;
    y cambiarlo por
    $output .= $before_title . cortar_titulo( $title ) . $after_title;

    por si fuera un problema del tipo de variable con la condición ternaria.

    A ver si eso te lo solucionara.

    No entiendo muy bien porqué te salen los 3 puntitos antes, ya que debería aplicarlos donde sale el título. :confuso:
    •  
      CommentAuthorAntonio
    • CommentTimeJan 22nd 2011
     # 23
    Vale, después de releer tu post inicial he entendido lo que querías decir con lo de los 3 puntitos que te salían arriba, y es que había interpretado que lo que querías corar era el título del widget y lo de la lista de comentarios.

    Vuelve a dejar esto

    $title = cortar_titulo(....
    <code>

    como estaba y llama a la función aquí.

    <code>
    $output .= '
    ';
    if ( $comments ) {
    foreach ( (array) $comments as $comment) {
    $output .= '
    ' . /* translators: comments widget: 1: comment author, 2: post link */ sprintf(_x('%2$s', 'widgets'), cortar_titulo( get_comment_author_link() ), 'comment_ID) ) . '">' . get_the_title($comment->comment_post_ID) . '') . '
    ';
    }
    }
    $output .= '
    ';


    Debería leer todo el hilo bien antes de contestar :dumb: