Código para el Widget de Entradas Recientes

26 abr 2013, 22:18:17
Vistas: 43.4K
Votos: 8

Quiero hacer cambios en el código del widget de Entradas Recientes - ¿podría alguien decirme dónde se encuentra ese código?

¡Gracias de antemano!

1
Comentarios

Nunca hackees el núcleo. Registra un nuevo widget: http://codex.wordpress.org/Widgets_API Puedes usar el widget de publicaciones recientes como ejemplo de código.

Andrew Bartel Andrew Bartel
26 abr 2013 22:23:03
Todas las respuestas a la pregunta 2
0
19

Echa un vistazo a wp-includes\default-widgets.php.

/**
 * Clase del Widget Recent_Posts
 *
 * @since 2.8.0
 */
class WP_Widget_Recent_Posts extends WP_Widget {

    function __construct() {
        $widget_ops = array('classname' => 'widget_recent_entries', 'description' => __( "Las publicaciones más recientes de tu sitio") );
        parent::__construct('recent-posts', __('Publicaciones Recientes'), $widget_ops);
        $this->alt_option_name = 'widget_recent_entries';

        add_action( 'save_post', array($this, 'flush_widget_cache') );
        add_action( 'deleted_post', array($this, 'flush_widget_cache') );
        add_action( 'switch_theme', array($this, 'flush_widget_cache') );
    }

    function widget($args, $instance) {
        $cache = wp_cache_get('widget_recent_posts', 'widget');

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

        if ( ! isset( $args['widget_id'] ) )
            $args['widget_id'] = $this->id;

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

        ob_start();
        extract($args);

        $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Publicaciones Recientes' );
        $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
        $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 10;
        if ( ! $number )
            $number = 10;
        $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;

        $r = new WP_Query( apply_filters( 'widget_posts_args', array( 'posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true ) ) );
        if ($r->have_posts()) :
?>
        <?php echo $before_widget; ?>
        <?php if ( $title ) echo $before_title . $title . $after_title; ?>
        <ul>
        <?php while ( $r->have_posts() ) : $r->the_post(); ?>
            <li>
                <a href="<?php the_permalink() ?>" title="<?php echo esc_attr( get_the_title() ? get_the_title() : get_the_ID() ); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a>
            <?php if ( $show_date ) : ?>
                <span class="post-date"><?php echo get_the_date(); ?></span>
            <?php endif; ?>
            </li>
        <?php endwhile; ?>
        </ul>
        <?php echo $after_widget; ?>
<?php
        // Reinicia el global $the_post ya que esta consulta lo habrá sobrescrito
        wp_reset_postdata();

        endif;

        $cache[$args['widget_id']] = ob_get_flush();
        wp_cache_set('widget_recent_posts', $cache, 'widget');
    }

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

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

        return $instance;
    }

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

    function form( $instance ) {
        $title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : false;
?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Título:' ); ?></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( 'Número de publicaciones a mostrar:' ); ?></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>

        <p><input class="checkbox" type="checkbox" <?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
        <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( '¿Mostrar fecha de publicación?' ); ?></label></p>
<?php
    }
}

Si modificas este Widget, asegúrate de hacer un fork y registrar tu Widget modificado como un nuevo Widget.

Editar

Cómo hacer un fork de un Widget del núcleo

Comienza con la entrada del Codex sobre la API de Widgets.

  1. Renombra el Widget

    Cambia esto:

    class WP_Widget_Recent_Posts extends WP_Widget {}
    

    ...por esto:

    class wpse97411_Widget_Recent_Posts extends WP_Widget {}
    
  2. Modifica la clase del Widget según tus necesidades

  3. Registra tu Widget:

    function wpse97413_register_custom_widgets() {
        register_widget( 'wpse97411_Widget_Recent_Posts' );
    }
    add_action( 'widgets_init', 'wpse97413_register_custom_widgets' );
    
26 abr 2013 22:24:29
2

El código predeterminado del Widget de Entradas Recientes se encuentra en includes/default-widgets.php, pero no deberías modificar el código del núcleo. Copia esa función al archivo functions.php de tu tema, renómbrala y crea tu propio widget personalizado.

26 abr 2013 22:24:36
Comentarios

Una pregunta, @s_ha_dum: ¿por qué es una mala práctica modificar el código del núcleo?

Astoria Astoria
26 abr 2013 22:39:34

1) Puedes romper cosas muy fácilmente y quizás ni siquiera te des cuenta y 2) todo tu trabajo se sobrescribirá la próxima vez que actualices WordPress. Entonces tendrás que hacer todo de nuevo. Los hacks al núcleo son un gran dolor de cabeza.

s_ha_dum s_ha_dum
26 abr 2013 22:51:27