Codice per il Widget Post Recenti

26 apr 2013, 22:18:17
Visualizzazioni: 43.4K
Voti: 8

Vorrei apportare delle modifiche al codice del widget Post Recenti - qualcuno potrebbe dirmi dove si trova questo codice?

Grazie in anticipo!

1
Commenti

Non modificare mai il core. Registra un nuovo widget: http://codex.wordpress.org/Widgets_API Puoi usare il widget degli articoli recenti come esempio di codice.

Andrew Bartel Andrew Bartel
26 apr 2013 22:23:03
Tutte le risposte alla domanda 2
0
19

Dai un'occhiata a wp-includes\default-widgets.php.

/**
 * Classe 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' => __( "Gli articoli più recenti del tuo sito") );
        parent::__construct('recent-posts', __('Articoli Recenti'), $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'] : __( 'Articoli Recenti' );
        $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
        // Ripristina il global $the_post in quanto questa query lo avrà modificato
        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( 'Titolo:' ); ?></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( 'Numero di articoli da mostrare:' ); ?></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( 'Mostrare la data dell\'articolo?' ); ?></label></p>
<?php
    }
}

Se modifichi questo Widget, assicurati di effettuare un fork e registrare il tuo Widget modificato come un nuovo Widget.

Modifica

Come effettuare un fork di un Widget core

Inizia con la voce del Codex sull'API dei Widget.

  1. Rinomina il Widget

    Cambia questo:

    class WP_Widget_Recent_Posts extends WP_Widget {}
    

    ...in questo:

    class wpse97411_Widget_Recent_Posts extends WP_Widget {}
    
  2. Modifica la classe del Widget in base alle tue esigenze

  3. Registra il tuo Widget:

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

Il codice predefinito del Widget degli Articoli Recenti si trova in includes/default-widgets.php ma non dovresti modificare il codice del Core. Copia quella funzione nel functions.php del tuo tema, rinominala e crea il tuo widget personalizzato.

26 apr 2013 22:24:36
Commenti

Una domanda, però, @s_ha_dum: perché è una cattiva pratica modificare il codice core?

Astoria Astoria
26 apr 2013 22:39:34

1) Puoi rompere facilmente delle cose e potresti non accorgertene nemmeno e 2) tutto il tuo lavoro viene sovrascritto al prossimo aggiornamento di WordPress. Poi dovrai rifare tutto da capo. Le modifiche al core sono un enorme mal di testa.

s_ha_dum s_ha_dum
26 apr 2013 22:51:27