Créez un widget pour WordPress

Bien que WordPress soit, pour moi l’un des CMS grand public les plus complet du marché. Parfois on a besoin d’un module spécifique et c’est là que ce mini-tutorial entre en jeu !

Vous voyez le widget sur votre droite avec le texte défilant qui vous proposes les derniers articles de la catégorie Print’minute, il est tout simple mais je n’en avais pas trouvé !

Du coup voici le code, que je commenterai dès que j’aurai un peu de temps !
Mais bon au moins celui-ci marche et est testé en live, devant vos yeux !

<?php
/*
Plugin Name: Cat'Ligne
Plugin URI: http://printf.eu
Description: Propose un widget qui affiche ligne par ligne le contenu d'une catégorie
Version: 0.1
Author: Florian Hyne
Author URI: http://printf.eu
*/

function widget_catligne()
{
register_widget("CatLigne");
}
add_action("widgets_init", "widget_catligne");


class CatLigne extends WP_Widget {
 
 //Constructeur
 function CatLigne()
 {
parent::WP_Widget(false, $name = 'CatLigne', array('name' => 'CatLigne', 'description' => 'Affichage les article d'une catégorie ligne par ligne'));
 }
 
 //Affichage du widget
 function widget($args, $instance)
 {

//Récupération des paramètres
extract($args);
$title = apply_filters('widget_title', $instance['title']);
$nb_posts = $instance['nb_posts'];
$category = $instance['category'];
$orderby = $instance['orderby'];
$wait_time = round($instance['wait_time']/70)+2;
 
//Récupération des articles
$lastposts = get_posts(array('numberposts'=>$nb_posts,'category_name'=>$category,'orderby'=>$orderby));
 
//définition des categories pour le js
$list_titre = "";
$list_lien = "";
foreach ( $lastposts as $post ) 
{ 
setup_postdata($post);
$list_titre .= '"'.$post->post_title.'",';
$list_lien .= '"'.get_permalink($post->ID).'",';
$list_date .= '"'.date("d/m H:i #",strtotime($post->post_date)).'",';
}

//on enleve le dernier caractere
$list_titre = substr($list_titre, 0, -1);
$list_lien = substr($list_lien, 0, -1);
$list_date = substr($list_date, 0, -1);
?>


<?php
//Affichage
echo $before_widget;
if ($title)
echo $before_title . $title . $after_title;
else
echo $before_title . 'Print'Minute' . $after_title;

?>
<div style="height:42px">
<a id="display_link" href="http://printf.eu"><p id="display_title"><p></a>
</div>
<script type="text/javascript">
function sleep(time){
var start = date.getTime();
while(start+time > date.getTime()) true;
return;
}

function countInObject(obj) {
var count = 0;
// iterate over properties, increment if a non-prototype property
for(var key in obj) if(obj.hasOwnProperty(key)) count++;
return count;
}

var vitesse = 70;// vitesse de défilement
categories = new Array([<?php echo $list_titre?>],[<?php echo $list_lien?>],[<?php echo $list_date?>]);
titre_tab = new Array(<?php echo $list_titre?>);
var catlen = titre_tab.length;


display_title = document.getElementById('display_title');
display_link = document.getElementById('display_link');

//ajouter heure

var cat = 0;
var txt = categories[0][0];
var link = categories[1][0];
var date = categories[2][0];
var waittime = <?php echo $wait_time?>;

function afficherNouveauTitre(id)
{
if(id > catlen - 1) id = 0;

txt = categories[0][id];
link = categories[1][id];
date = categories[2][id];

display_title.innerHTML = date+" ";
totaltime = txt.length+waittime;

for(var i = 0, l = totaltime+1; i < l; i++) {
(
function(i) {
setTimeout(function() {

display_title.innerHTML += txt.charAt(i);
display_link.href = link;
if(i == totaltime) 
{
cat = id + 1;
afficherNouveauTitre(cat);
}
}, i * vitesse);

}(i));
}


}


afficherNouveauTitre(0);


</script>

<?php
echo $after_widget;
 }
 
 //Mise à jour des paramètres du widget
 function update($new_instance, $old_instance)
 {
$instance = $old_instance;
 
//Récupération des paramètres envoyés
$instance['title'] = strip_tags($new_instance['title']);
$instance['nb_posts'] = $new_instance['nb_posts'];
$instance['category'] = $new_instance['category'];
$instance['orderby'] = $new_instance['orderby'];
$instance['wait_time'] = $new_instance['wait_time'];
 
return $instance;
 }
 
 //Affichage des paramètres du widget dans l'admin
 function form($instance)
 {
$title = esc_attr($instance['title']);
$nb_posts = esc_attr($instance['nb_posts']);
$category = esc_attr($instance['category']);
$orderby = esc_attr($instance['orderby']);
$wait_time = esc_attr($instance['wait_time']);

?>
<p>
<label for="<?php echo $this->get_field_id('title'); ?>">
<?php echo 'Title:'; ?>
<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; ?>" />
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('nb_posts'); ?>">
<?php echo 'Number of Posts:'; ?>
<input class="widefat" id="<?php echo $this->get_field_id('nb_posts'); ?>" name="<?php echo $this->get_field_name('nb_posts'); ?>" type="text" value="<?php echo $nb_posts; ?>" />
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('wait_time'); ?>">
<?php echo 'Waiting time (millisecond):'; ?>
<input class="widefat" id="<?php echo $this->get_field_id('wait_time'); ?>" name="<?php echo $this->get_field_name('wait_time'); ?>" type="text" value="<?php echo $wait_time; ?>" />
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('category'); ?>">
<?php echo 'Catégory:'; $category_list = get_categories();?>
<select class="widefat" id="<?php echo $this->get_field_id( 'category' ); ?>" name="<?php echo $this->get_field_name( 'category' ); ?>">
<?php foreach ($category_list as $category_name) { ?>
<option value="<?php echo $category_name->name; ?>" <?php selected( $instance['category'], $category_name->name ); ?>><?php echo $category_name->name; ?></option>
<?php } ?>
</select>
</label>
</p>
<p>
<label for="<?php echo $this->get_field_id('orderby'); ?>">
<?php echo 'Order:'; ?>
<?php $orders = array('rand'=>'Random','desc'=>'New first','asc'=>'Old first');?>
<select class="widefat" id="<?php echo $this->get_field_id( 'orderby' ); ?>" name="<?php echo $this->get_field_name( 'orderby' ); ?>">
<?php foreach ( $orders as $key => $name ) { ?>
<option value="<?php echo $key; ?>" <?php selected( $instance['orderby'], $key ); ?>><?php echo $name; ?></option>
<?php } ?>
</select>
</label>
</p>
<?php
 }
}

Code is poetry !

Laisser un commentaire