Tirage au sort de bannières sans doublon

Petit nouveau ! | 2 Messages

26 avr. 2011, 15:48

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 } } ....... ?>

ViPHP
ViPHP | 2577 Messages

26 avr. 2011, 16:18

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.

Petit nouveau ! | 2 Messages

26 avr. 2011, 17:26

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; }

ViPHP
ViPHP | 2577 Messages

26 avr. 2011, 20:40

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

ViPHP
ViPHP | 2577 Messages

28 avr. 2011, 21:09

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;
  }