/* Widget Name: Button Description: Create a custom button with flexible styling, icon support, and click tracking functionality. Author: SiteOrigin Author URI: https://siteorigin.com Documentation: https://siteorigin.com/widgets-bundle/button-widget-documentation/ Keywords: event, icon, link */ class SiteOrigin_Widget_Button_Widget extends SiteOrigin_Widget { public function __construct() { parent::__construct( 'sow-button', __( 'SiteOrigin Button', 'so-widgets-bundle' ), array( 'description' => __( 'Create a custom button with flexible styling, icon support, and click tracking functionality.', 'so-widgets-bundle' ), 'help' => 'https://siteorigin.com/widgets-bundle/button-widget-documentation/', ), array( ), false, plugin_dir_path( __FILE__ ) ); } public function get_settings_form() { return array( 'responsive_breakpoint' => array( 'type' => 'measurement', 'label' => __( 'Responsive Breakpoint', 'so-widgets-bundle' ), 'default' => '780px', 'description' => __( 'This setting controls when the Mobile Align setting will be used. The default value is 780px.', 'so-widgets-bundle' ), ), ); } public function initialize() { $this->register_frontend_styles( array( array( 'sow-button-base', plugin_dir_url( __FILE__ ) . 'css/style.css', array(), SOW_BUNDLE_VERSION, ), ) ); } public function get_widget_form() { return array( 'text' => array( 'type' => 'text', 'label' => __( 'Button Text', 'so-widgets-bundle' ), ), 'url' => array( 'type' => 'link', 'label' => __( 'Destination URL', 'so-widgets-bundle' ), 'allow_shortcode' => true, ), 'new_window' => array( 'type' => 'checkbox', 'default' => false, 'label' => __( 'Open in a new window', 'so-widgets-bundle' ), ), 'download' => array( 'type' => 'checkbox', 'default' => false, 'label' => __( 'Download', 'so-widgets-bundle' ), 'description' => __( 'The Destination URL will be downloaded when a user clicks on the button.', 'so-widgets-bundle' ), ), 'button_icon' => array( 'type' => 'section', 'label' => __( 'Icon', 'so-widgets-bundle' ), 'fields' => array( 'icon_selected' => array( 'type' => 'icon', 'label' => __( 'Icon', 'so-widgets-bundle' ), ), 'icon_color' => array( 'type' => 'color', 'label' => __( 'Icon Color', 'so-widgets-bundle' ), ), 'icon' => array( 'type' => 'media', 'label' => __( 'Image Icon', 'so-widgets-bundle' ), 'description' => __( 'Replaces the icon with your own image icon.', 'so-widgets-bundle' ), ), 'icon_placement' => array( 'type' => 'select', 'label' => __( 'Icon Placement', 'so-widgets-bundle' ), 'default' => 'left', 'options' => array( 'top' => __( 'Top', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'bottom' => __( 'Bottom', 'so-widgets-bundle' ), 'left' => __( 'Left', 'so-widgets-bundle' ), ), ), ), ), 'design' => array( 'type' => 'section', 'label' => __( 'Design and Layout', 'so-widgets-bundle' ), 'hide' => true, 'fields' => array( 'width' => array( 'type' => 'measurement', 'label' => __( 'Width', 'so-widgets-bundle' ), 'description' => __( 'Leave blank to let the button resize according to content.', 'so-widgets-bundle' ), ), 'align' => array( 'type' => 'select', 'label' => __( 'Align', 'so-widgets-bundle' ), 'default' => 'center', 'options' => array( 'left' => __( 'Left', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'center' => __( 'Center', 'so-widgets-bundle' ), 'justify' => __( 'Full Width', 'so-widgets-bundle' ), ), ), 'mobile_align' => array( 'type' => 'select', 'label' => __( 'Mobile Align', 'so-widgets-bundle' ), 'default' => 'center', 'options' => array( 'left' => __( 'Left', 'so-widgets-bundle' ), 'right' => __( 'Right', 'so-widgets-bundle' ), 'center' => __( 'Center', 'so-widgets-bundle' ), 'justify' => __( 'Full Width', 'so-widgets-bundle' ), ), ), 'theme' => array( 'type' => 'select', 'label' => __( 'Button Theme', 'so-widgets-bundle' ), 'default' => 'flat', 'options' => array( 'atom' => __( 'Atom', 'so-widgets-bundle' ), 'flat' => __( 'Flat', 'so-widgets-bundle' ), 'wire' => __( 'Wire', 'so-widgets-bundle' ), ), ), 'button_color' => array( 'type' => 'color', 'label' => __( 'Button Color', 'so-widgets-bundle' ), ), 'text_color' => array( 'type' => 'color', 'label' => __( 'Text Color', 'so-widgets-bundle' ), ), 'hover' => array( 'type' => 'checkbox', 'default' => true, 'label' => __( 'Use hover effects', 'so-widgets-bundle' ), 'state_emitter' => array( 'callback' => 'conditional', 'args' => array( 'hover[show]: val', 'hover[hide]: ! val', ), ), ), 'hover_background_color' => array( 'type' => 'color', 'label' => __( 'Hover Background Color', 'so-widgets-bundle' ), 'state_handler' => array( 'hover[show]' => array( 'show' ), 'hover[hide]' => array( 'hide' ), ), ), 'hover_text_color' => array( 'type' => 'color', 'label' => __( 'Hover Text Color', 'so-widgets-bundle' ), 'state_handler' => array( 'hover[show]' => array( 'show' ), 'hover[hide]' => array( 'hide' ), ), ), 'font' => array( 'type' => 'font', 'label' => __( 'Font', 'so-widgets-bundle' ), 'default' => 'default', ), 'font_size' => array( 'type' => 'measurement', 'label' => __( 'Font Size', 'so-widgets-bundle' ), 'default' => '1em', ), 'icon_size' => array( 'type' => 'measurement', 'label' => __( 'Icon Size', 'so-widgets-bundle' ), 'default' => '1.3em', ), 'padding' => array( 'type' => 'measurement', 'label' => __( 'Padding', 'so-widgets-bundle' ), 'default' => '1em', ), 'rounding' => array( 'type' => 'multi-measurement', 'label' => __( 'Rounding', 'so-widgets-bundle' ), 'default' => '0.25em 0.25em 0.25em 0.25em', 'measurements' => array( 'top' => array( 'label' => __( 'Top', 'so-widgets-bundle' ), ), 'right' => array( 'label' => __( 'Right', 'so-widgets-bundle' ), ), 'bottom' => array( 'label' => __( 'Bottom', 'so-widgets-bundle' ), ), 'left' => array( 'label' => __( 'Left', 'so-widgets-bundle' ), ), ), ), ), ), 'attributes' => array( 'type' => 'section', 'label' => __( 'Other Attributes and SEO', 'so-widgets-bundle' ), 'hide' => true, 'fields' => array( 'id' => array( 'type' => 'text', 'label' => __( 'Button ID', 'so-widgets-bundle' ), 'description' => __( 'An ID attribute allows you to target this button in JavaScript.', 'so-widgets-bundle' ), ), 'classes' => array( 'type' => 'text', 'label' => __( 'Button Classes', 'so-widgets-bundle' ), 'description' => __( 'Additional CSS classes added to the button link.', 'so-widgets-bundle' ), ), 'title' => array( 'type' => 'text', 'label' => __( 'Title Attribute', 'so-widgets-bundle' ), 'description' => __( 'Adds a title attribute to the button link.', 'so-widgets-bundle' ), ), 'on_click' => array( 'type' => 'text', 'label' => __( 'Onclick', 'so-widgets-bundle' ), 'description' => __( 'Run this JavaScript when the button is clicked. Ideal for tracking.', 'so-widgets-bundle' ), 'onclick' => true, ), 'rel' => array( 'type' => 'text', 'label' => __( 'Rel Attribute', 'so-widgets-bundle' ), 'description' => __( 'Adds a rel attribute to the button link.', 'so-widgets-bundle' ), ), ), ), ); } public function get_style_name( $instance ) { if ( empty( $instance['design']['theme'] ) ) { return 'atom'; } return $instance['design']['theme']; } /** * Get the variables for the Button Widget. * * @return array */ public function get_template_variables( $instance, $args ) { $button_attributes = array(); $attributes = $instance['attributes']; $classes = ! empty( $attributes['classes'] ) ? $attributes['classes'] : ''; if ( ! empty( $classes ) ) { $classes .= ' '; } $classes .= 'sowb-button ow-icon-placement-' . $instance['button_icon']['icon_placement']; if ( ! empty( $instance['design']['hover'] ) ) { $classes .= ' ow-button-hover'; } $button_attributes['class'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $classes ) ) ); if ( ! empty( $instance['new_window'] ) ) { $button_attributes['target'] = '_blank'; $button_attributes['rel'] = 'noopener noreferrer'; } if ( ! empty( $instance['download'] ) ) { $button_attributes['download'] = null; } if ( ! empty( $attributes['id'] ) ) { $button_attributes['id'] = $attributes['id']; } if ( ! empty( $attributes['title'] ) ) { $button_attributes['title'] = $attributes['title']; } if ( ! empty( $attributes['rel'] ) ) { if ( isset( $button_attributes['rel'] ) ) { $button_attributes['rel'] .= " $attributes[rel]"; } else { $button_attributes['rel'] = $attributes['rel']; } } $icon_image_url = ''; if ( ! empty( $instance['button_icon']['icon'] ) ) { $attachment = wp_get_attachment_image_src( $instance['button_icon']['icon'] ); if ( ! empty( $attachment ) ) { $icon_image_url = $attachment[0]; } } return array( 'button_attributes' => apply_filters( 'siteorigin_widgets_button_attributes', $button_attributes, $instance ), 'href' => ! empty( $instance['url'] ) ? $instance['url'] : '', 'on_click' => ! empty( $attributes['on_click'] ) ? $attributes['on_click'] : '', 'align' => $instance['design']['align'], 'icon_image_url' => $icon_image_url, 'icon' => $instance['button_icon']['icon_selected'], 'icon_color' => $instance['button_icon']['icon_color'], 'text' => $instance['text'], ); } /** * Get the variables that we'll be injecting into the less stylesheet. * * @return array */ public function get_less_variables( $instance ) { if ( empty( $instance ) || empty( $instance['design'] ) ) { return array(); } $text_color = isset( $instance['design']['text_color'] ) ? $instance['design']['text_color'] : ''; $button_color = isset( $instance['design']['button_color'] ) ? $instance['design']['button_color'] : ''; $less_vars = array( 'button_width' => isset( $instance['design']['width'] ) ? $instance['design']['width'] : '', 'button_color' => $button_color, 'text_color' => $text_color, 'icon_size' => ! empty( $instance['design']['icon_size'] ) ? $instance['design']['icon_size'] : '1.3em', 'hover_text_color' => ! empty( $instance['design']['hover_text_color'] ) ? $instance['design']['hover_text_color'] : $text_color, 'hover_background_color' => ! empty( $instance['design']['hover_background_color'] ) ? $instance['design']['hover_background_color'] : $button_color, 'font_size' => isset( $instance['design']['font_size'] ) ? $instance['design']['font_size'] : '', 'rounding' => isset( $instance['design']['rounding'] ) ? $instance['design']['rounding'] : '', 'padding' => isset( $instance['design']['padding'] ) ? $instance['design']['padding'] : '', 'has_text' => empty( $instance['text'] ) ? 'false' : 'true', 'responsive_breakpoint' => $this->get_global_settings( 'responsive_breakpoint' ), 'align' => ! empty( $instance['design']['align'] ) ? $instance['design']['align'] : 'center', 'mobile_align' => ! empty( $instance['design']['mobile_align'] ) ? $instance['design']['mobile_align'] : 'center', 'has_button_icon' => empty( $instance['button_icon']['icon_selected'] ) ? 'false' : 'true', ); if ( ! empty( $instance['design']['font'] ) ) { $font = siteorigin_widget_get_font( $instance['design']['font'] ); $less_vars['button_font'] = $font['family']; if ( ! empty( $font['weight'] ) ) { $less_vars['button_font_weight'] = $font['weight_raw']; $less_vars['button_font_style'] = $font['style']; } } return $less_vars; } /** * Make sure the instance is the most up to date version. * * @return mixed */ public function modify_instance( $instance ) { if ( empty( $instance ) ) { return array(); } $migrate_props = array( 'button_icon' => array( 'icon_selected', 'icon_color', 'icon', ), 'design' => array( 'align', 'theme', 'button_color', 'text_color', 'hover', 'hover_text_color', 'hover_background_color', 'font_size', 'rounding', 'padding', ), 'attributes' => array( 'id', ), ); foreach ( $migrate_props as $prop => $sub_props ) { if ( empty( $instance[ $prop ] ) ) { $instance[ $prop ] = array(); foreach ( $sub_props as $sub_prop ) { if ( isset( $instance[ $sub_prop ] ) ) { $instance[ $prop ][ $sub_prop ] = $instance[ $sub_prop ]; unset( $instance[ $sub_prop ] ); } } } } // Migrate onclick setting to prevent Wordfence flag. if ( ! empty( $instance['attributes'] ) && ! empty( $instance['attributes']['onclick'] ) ) { $instance['attributes']['on_click'] = $instance['attributes']['onclick']; } // If the mobile_align setting isn't set, set it to the same value as the align value. if ( ! empty( $instance['design'] ) && ! empty( $instance['design']['align'] ) && empty( $instance['design']['mobile_align'] ) ) { $instance['design']['mobile_align'] = $instance['design']['align']; } // Migrate predefined settings to more customizable settings. if ( ! empty( $instance['design']['font_size'] ) && is_numeric( $instance['design']['font_size'] ) ) { $instance['design']['font_size'] .= 'em'; } if ( ! empty( $instance['design']['padding'] ) && is_numeric( $instance['design']['padding'] ) ) { $instance['design']['padding'] .= 'em'; } if ( ! empty( $instance['design']['rounding'] ) && is_numeric( $instance['design']['rounding'] ) ) { $instance['design']['rounding'] = $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em'; } if ( empty( $instance['design']['icon_size'] ) ) { $instance['design']['icon_size'] = '1.3em'; } return $instance; } public function get_form_teaser() { if ( class_exists( 'SiteOrigin_Premium' ) ) { return false; } return array( sprintf( __( 'Add a beautiful tooltip to the Button Widget with %sSiteOrigin Premium%s', 'so-widgets-bundle' ), '', '' ), ); } } siteorigin_widget_register( 'sow-button', __FILE__, 'SiteOrigin_Widget_Button_Widget' );{"id":140212,"date":"2026-06-10T17:32:46","date_gmt":"2026-06-10T17:32:46","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=140212"},"modified":"2026-06-10T17:32:46","modified_gmt":"2026-06-10T17:32:46","slug":"skyhills-casino","status":"publish","type":"post","link":"https:\/\/klecet.edu.in\/alumni\/skyhills-casino\/","title":{"rendered":"Les Notifications d’Expiration de SkyHills Casino Rappellent \u00e0 la France les \u00c9ch\u00e9ances des Promotions"},"content":{"rendered":"
\n\"Skycity<\/p>\n

Pour les joueurs fran\u00e7ais, les alertes d’expiration ne sont plus un simple gadget. Elles sont devenues un outil primordial. SkyHills Casino a su les int\u00e9grer de mani\u00e8re efficace, transformant la gestion des bonus skyhills<\/a> d’une corv\u00e9e administrative \u00e0 un vrai levier d\u00e9cisionnel. Cette d\u00e9marche proactive montre que la plateforme favorise une relation transparente et juste, pour \u00e9carter les mauvaises surprises de derni\u00e8re minute.<\/p>\n

Dans quel but les Dates Limites Sont Cruciales pour Votre propre Strat\u00e9gie<\/h2>\n

Oublier une date limite, c’est ainsi que jeter de l’argent par la fen\u00eatre. Chaque bonus a ses propres conditions de mise et une dur\u00e9e de validit\u00e9 bien d\u00e9finie. Faute de une gestion attentive du temps, tout le travail pour d\u00e9bloquer ces fonds peut dispara\u00eetre en un clin d’\u0153il.<\/p>\n

L’Impact sur le Retour sur Investissement (RSI) du Joueur<\/h3>\n

Un bonus correctement utilis\u00e9 accro\u00eet votre bankroll et vos chances de gagner. Les alertes vous assistent de tirer le meilleur de ce RSI. Elles vous permettent d’organiser vos sessions de jeu en fonction de la p\u00e9riode de validit\u00e9. Finis le stress de l’ultime minute et les paris faits \u00e0 la h\u00e2te.<\/p>\n

Le M\u00e9canisme Mental derri\u00e8re les D\u00e9lais Impos\u00e9s<\/h3>\n

Ces d\u00e9lais ne sont pas l\u00e0 par hasard. Ils instaurent une dynamique qui pousse \u00e0 l’action. Chez SkyHills, les alertes modifient la donne : cette contrainte devient un simple rappel. Vous gardez le contr\u00f4le sur votre calendrier de jeu, sans subir une pression qui vous ferait jouer n’importe comment.<\/p>\n

Les Cons\u00e9quences du Non-Observation d’une \u00c9ch\u00e9ance<\/h2>\n

Qu’advient-il si, quand m\u00eame, vous permettez \u00e0 un bonus arriver \u00e0 expiration ? Les cons\u00e9quences sont syst\u00e9matiques et irr\u00e9vocables. Les comprendre, c’est mesurer l’int\u00e9r\u00eat des rappels.<\/p>\n

Le bonus, de m\u00eame que tous les gains qu’il a pu g\u00e9n\u00e9rer, sont supprim\u00e9s de votre compte. Cette perte est directe et d\u00e9finitive. SkyHills Casino, comme tout op\u00e9rateur r\u00e9gul\u00e9, met en \u0153uvre cette r\u00e8gle \u00e0 la lettre, conform\u00e9ment \u00e0 ce qui est stipul\u00e9 dans les conditions g\u00e9n\u00e9rales.<\/p>\n

\"Lonely<\/p>\n

Il faut noter une chose : seuls les fonds li\u00e9s au bonus sont concern\u00e9s. Votre solde d’argent r\u00e9el, lui, demeure inchang\u00e9. Le r\u00f4le des alertes est justement de tracer une fronti\u00e8re nette entre ces deux soldes, pour prot\u00e9ger votre argent.<\/p>\n

Param\u00e9trer son Compte pour ne Tout Recevoir<\/h2>\n

Pour que les alertes fonctionnent, votre configuration est importante. Consacrer cinq minutes pour contr\u00f4ler vos param\u00e8tres garantit que vous serez toujours bien joignable. Faites-le d\u00e8s votre inscription, c’est un automatisme utile.<\/p>\n

    \n
  1. Confirmez votre adresse email et votre num\u00e9ro de t\u00e9l\u00e9phone dans les param\u00e8tres du compte.<\/li>\n
  2. Allumez les notifications push dans l’application mobile et dans les r\u00e9glages de votre smartphone.<\/li>\n
  3. Incluez l’adresse email de SkyHills \u00e0 votre liste de contacts pour qu’elle ne finisse pas en spam.<\/li>\n
  4. Jetez r\u00e9guli\u00e8rement un \u0153il \u00e0 l’onglet “Messages” ou “Promotions” de votre compte joueur.<\/li>\n<\/ol>\n

    Ces param\u00e8tres, souvent oubli\u00e9s, font de vous un partenaire actif du syst\u00e8me. Vous n’\u00eates plus un simple r\u00e9cepteur qui subit l’information.<\/p>\n

    Comparatif avec les M\u00e9thodes du March\u00e9 Fran\u00e7ais<\/h2>\n

    \"SkyCity<\/p>\n

    Il est pertinent de confronter l’approche de SkyHills par rapport au reste du march\u00e9 fran\u00e7ais. Si l’id\u00e9e de notifier les joueurs se d\u00e9veloppe, les m\u00e9thodes diff\u00e8rent \u00e9norm\u00e9ment d’un casino \u00e0 l’autre.<\/p>\n

    Certains sites se limitent d’une ligne dans les conditions g\u00e9n\u00e9rales, sans rappel actif. D’autres adressent un email unique, facile \u00e0 rater. La strat\u00e9gie multicanal et progressive de SkyHills se d\u00e9marque par son c\u00f4t\u00e9 syst\u00e9matique et, osons le dire, bien con\u00e7u.<\/p>\n

    Cette mani\u00e8re de travailler rehausse le niveau de service. Elle contraint, en quelque sorte, le march\u00e9 \u00e0 \u00eatre plus loyal. Le joueur fran\u00e7ais y gagne en information et en contr\u00f4le, ce qui colle parfaitement avec les objectifs de l’Autorit\u00e9 Nationale des Jeux (ANJ).<\/p>\n

    Maximiser vos Gains Via une Saine Gestion du Temps<\/h2>\n

    Recevoir une alerte, c’est bien. Intervenir , c’est mieux. Pour convertir ces rappels en r\u00e9sultats r\u00e9els, une approche m\u00e9thodique est requise.<\/p>\n

    D\u00e9finir un Plan de Jeu apr\u00e8s une Alerte<\/h3>\n

    Lorsque vous observez la notification, \u00e9valuez la situation. V\u00e9rifiez le montant qu’il est \u00e0 jouer et le temps \u00e0 votre disposition. R\u00e9partissez le total des mises requises par le nombre de jours restants. Vous obtenez ainsi un objectif de mise quotidienne, plus simple \u00e0 atteindre sans vous pr\u00e9cipiter.<\/p>\n

    S\u00e9lectionner les Jeux les Plus Adapt\u00e9s<\/h3>\n

    Prudence, tous les jeux ne se valent pas pour lib\u00e9rer un bonus. Pour satisfaire les conditions de mise de mani\u00e8re efficace, privil\u00e9giez les jeux au taux de contribution \u00e9lev\u00e9. Les machines \u00e0 sous sont g\u00e9n\u00e9ralement compt\u00e9es \u00e0 100%. En revanche, un jeu comme le blackjack peut ne valoir qu’\u00e0 10% ou 20%.<\/p>\n

    Le m\u00e9canisme des alertes d’expiration : une nouvelle transparence<\/h2>\n

    Pendant que dans plusieurs casinos, les bonus s’effacent sans pr\u00e9avis, SkyHills Casino a choisi de communiquer. Leur plateforme \u00e9met des alertes d\u00e9taill\u00e9es \u00e0 travers divers canaux avant l’\u00e9ch\u00e9ance d’une offre. Cette honn\u00eatet\u00e9 constitue un changement significatif dans la m\u00e9thode par laquelle les op\u00e9rateurs communiquent avec leurs joueurs en France.<\/p>\n

    C’est un instrument qui donne des responsabilit\u00e9s. Averti en direct, le joueur peut choisir en toute connaissance comment employer son bonus. Cette approche est conforme d’ailleurs \u00e0 l’esprit des normes fran\u00e7aises sur le gaming responsable.<\/p>\n

    Types de Bonus Touch\u00e9s par les Alertes d’Expiration<\/h2>\n

    Les alertes ne visent pas exclusivement le bonus de bienvenue. Elles englobent tout l’univers promotionnel du casino, pour une gestion coh\u00e9rente de tous vos avantages. Voici les principaux bonus qui sont suivis :<\/p>\n