Page 1 sur 1

Tirage au sort de bannières sans doublon

Posté : 26 avr. 2011, 15:48
par cedric.c2ware
Salut à tous,

Voici le code un widget «adrotator » qui permet de tirer au sort une bannière dans une sidebar.

Ce dernier m'ait très utile pour afficher simplement plusieurs publicités sur le site, je voudrais faire un test sur la valeur retournée pour ne pas avoir de doublon sur deux instances différentes.

Auriez-vous une solution ? Je ne voudrais pas à avoir à refaire une fonction car je dois simplement faire un test sur des variables… Mais où ?

Bien entendu je garderais le copyright intact une fois la solution trouvée.

Merci d'avance, à charge de revanche évidemment.

Code : Tout sélectionner

<?php class Ad_Rotator_Widget extends WP_Widget { .... } function widget($args, $instance) { extract($args); $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']); $text = $instance['text']; $chunks = explode('<!--more-->', $text); $chunkno = rand(0, sizeof($chunks) - 1); echo $before_widget; if (!empty($title)) echo $before_title . $title . $after_title; echo '<div class="widget_ad_rotator">' . trim($chunks[$chunkno]) . '</div>'; echo $after_widget; } function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = strip_tags($new_instance['title']); if (current_user_can('unfiltered_html')) $instance['text'] = $new_instance['text']; else $instance['text'] = wp_filter_post_kses($new_instance['text']); return $instance; } function form($instance) { $instance = wp_parse_args((array)$instance, array('title' => '', 'text' => '')); $title = strip_tags($instance['title']); $text = format_to_edit($instance['text']); ?> <p> <label for="<?php echo $this->get_field_id('title'); ?>"> 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 attribute_escape($title); ?>" /> </label> </p> <p><label for="<?php echo $this->get_field_id('text'); ?>">HTML Text (chunks are separated with <tt><!--more--></tt>):</label></p> <textarea class="widefat" rows="16" cols="20" id="<?php echo $this->get_field_id('text'); ?>" name="<?php echo $this->get_field_name('text'); ?>"><?php echo $text; ?></textarea> <?php } } ....... ?>

Re: Tirage au sort de bannières sans doublon

Posté : 26 avr. 2011, 16:18
par Mazarini
Bonjour,

Ajoute un
global $banniere en début de la fonction widget

après la ligne $chunkno = rand(0, sizeof($chunks) - 1); ajoutes :
while (isset($bannière[$chunkno]))
{
$chunkno++;
if (sizeof($chunks) - 1)< $chunkno) $chunkno=0;
}
$bannière[$chunkno] = "";

Attention, il faut que tu utilises moins de bannière dans ta page qu'il y en a de possible. Le principe est de prendre la suivant si une est déjà utilisée.

Re: Tirage au sort de bannières sans doublon

Posté : 26 avr. 2011, 17:26
par cedric.c2ware
Salut et merci pour ta réponse!

Est-ce que ça ferait un truc dans le genre ? Je ne suis pas sûr car je ne sais pas quoi mettredans ma variable bannière…

Code : Tout sélectionner

function widget($args, $instance) { global $banniere; $banniere = 2; extract($args); $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']); $text = $instance['text']; $chunks = explode('<!--more-->', $text); $chunkno = rand(0, sizeof($chunks) - 1); while (isset($banniere[$chunkno])) { $chunkno++; if ((sizeof($chunks) - 1) < $chunkno || $chunkno=0){; $banniere[$chunkno] = "";} } echo $before_widget; if (!empty($title)) echo $before_title . $title . $after_title; echo '<div class="widget_ad_rotator">' . trim($chunks[$chunkno]) . '</div>'; echo $after_widget; }

Re: Tirage au sort de bannières sans doublon

Posté : 26 avr. 2011, 20:40
par Mazarini
Bonjour,

Il ne faut pas faire $banniere = 2 car tu perds les valeurs des appels précédents.

$banniere est un tableau dont la clé représente les bannières utilisées.

En fait le premier rand te retourne 3 => tu renseignes $banniere[3] = "" pour que isset( $banniere[3]) soit vrai
Pour le second, si le rand retourne 3 tu prends 4 et s'il retourne autre chose (6 par exemple) tu sais que tu ne l'a pas utilisé car isset($banniere[6]) est faux

Re: Tirage au sort de bannières sans doublon

Posté : 28 avr. 2011, 21:09
par Mazarini
Voilà le code qui doit marcher à condition qu'il y ait plus de bannières possible que de demande de bannières
function widget($args, $instance) {
     global $banniere;
     extract($args);
    
    $title = apply_filters('widget_title', empty($instance['title']) ? '' : $instance['title']);
    $text = $instance['text'];
    $chunks = explode('<!--more-->', $text);
    $chunkno = rand(0, sizeof($chunks) - 1);
    while (isset($banniere[$chunkno]))
    {
        $chunkno++;
        if ((sizeof($chunks) - 1) < $chunkno ) $chunkno=0);
    }
    $banniere[$chunkno] = "";
    echo $before_widget;
    if (!empty($title)) echo $before_title . $title . $after_title;
    echo '<div class="widget_ad_rotator">' . trim($chunks[$chunkno]) . '</div>';
    
    echo $after_widget;
  }