Créer votre propre widget WordPress

23 February 2013 · #php, #wordpress

Le squelette de tous widget WordPress

Il faut placer ce code dans un fichier dans le répertoire wp-content/plugins/.

Remarques :

<p>
    <label for="<?php echo $this->get_field_id('title'); ?>">:</label>
    <input value="<?php echo $title; ?>" type="text" class="widefat"
           name="<?php echo $this->get_field_name('title'); ?>"
           id="<?php echo $this->get_field_id('title'); ?>"></input>
</p>

Fonction form() — À ne PAS renommer.

C'est le formulaire qui vous permet de paramétrer le widget depuis le panneau d'administration. Vous pouvez avoir autant de types d'entrée que vous voulez.

Notez que le titre du widget affiché dans la sidebar est lui aussi un paramètre.

Fonction update() — À ne PAS renommer.

Elle permet de mettre à jour et d'enregistrer les paramètres de votre widget.

Fonction my_widget_widget() — À renommer.

C'est le constructeur du widget. Il hérite de la classe WP_Widget qui s'occupe de presque tout pour nous.

Vous renommez le nom de cette fonction ainsi que le nom de la classe du widget, toujours en gardant le suffixe _widget.

Fonction widget() — À ne PAS renommer.

Elle comporte la logique du widget ainsi que son template. C'est là que vous allez le plus travailler sur votre widget.

add_action()

Il faut modifier le paramètre de cette fonction avec le nom de la fonction constructrice de votre widget. Si vous ne le faites pas, tout votre WordPress sera cassé.

Un exemple de widget fonctionnel

My networks

Voici son code :

<?php
/*
Plugin Name: My Networks Widget
*/

class my_networks_widget extends WP_Widget {
    function my_networks_widget() {
        parent::WP_Widget(false, $name = 'My Networks');
    }

    function widget($args, $instance) {
        extract($args);
        $title    = apply_filters('widget_title', $instance['title']);
        $twitter  = $instance['twitter'];
        $facebook = $instance['facebook'];
        echo $before_widget;
        if ($title) echo $before_title . $title . $after_title;
        ?>
        <div>
            <a href="http://www.facebook.com/<?php echo $instance['facebook']; ?>" target="_blank">
                Facebook
            </a>
        </div>
        <?php
        echo $after_widget;
    }

    function update($new_instance, $old_instance) {
        $instance = $old_instance;
        $instance['title']    = strip_tags($new_instance['title']);
        $instance['twitter']  = strip_tags($new_instance['twitter']);
        $instance['facebook'] = strip_tags($new_instance['facebook']);
        return $instance;
    }

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

add_action('widgets_init', create_function('', 'return register_widget("my_networks_widget");'));
?>