/* 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":1892,"date":"2026-04-17T14:30:46","date_gmt":"2026-04-17T14:30:46","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=1892"},"modified":"2026-04-17T14:30:46","modified_gmt":"2026-04-17T14:30:46","slug":"comment-trouver-le-optimal-site-de-paris-sportif-selon-vos-attentes","status":"publish","type":"post","link":"https:\/\/klecet.edu.in\/alumni\/comment-trouver-le-optimal-site-de-paris-sportif-selon-vos-attentes\/","title":{"rendered":"Comment trouver le optimal site de paris sportif selon vos attentes"},"content":{"rendered":"
S\u00e9lectionner le site de paris sportif optimal correspondant \u00e0 vos besoins peut para\u00eetre difficile face \u00e0 la multitude d’options disponibles sur le march\u00e9 fran\u00e7ais. Ce guide vous accompagnera dans votre s\u00e9lection en examinant les crit\u00e8res essentiels pour faire un choix \u00e9clair\u00e9 et fiable.<\/p>\n
La s\u00e9curit\u00e9 constitue le premier pilier dans l’\u00e9valuation d’un site de paris sportif fiable. V\u00e9rifiez syst\u00e9matiquement la pr\u00e9sence d’une licence octroy\u00e9 par l’ANJ, l’autorit\u00e9 fran\u00e7aise charg\u00e9e de r\u00e9guler les jeux num\u00e9riques \u00e0 partir de 2020. Cette accr\u00e9ditation garantit que la plateforme se conforme aux standards strictes de protection des joueurs et de clart\u00e9 financi\u00e8re requises par la r\u00e9glementation fran\u00e7aise.<\/p>\n
L’satisfaction des utilisateurs et la diversit\u00e9 des options de march\u00e9 repr\u00e9sentent \u00e9galement des \u00e9l\u00e9ments cl\u00e9s. Un site de paris sportif efficace doit proposer une interface intuitive, des cotes comp\u00e9titives et une large gamme de disciplines sportives incluses. Les m\u00e9thodes de paiement fiables, le support client disponible et les r\u00e9compenses int\u00e9ressantes compl\u00e8tent le tableau des \u00e9l\u00e9ments \u00e0 consid\u00e9rer attentivement.<\/p>\n
Au-del\u00e0 des \u00e9l\u00e9ments techniques, consid\u00e9rez votre profil de joueur pour choisir un site de paris sportif adapt\u00e9. Les novices privil\u00e9gieront les plateformes proposant des guides et des paris basiques, tandis que les joueurs confirm\u00e9s recherchent des options sophistiqu\u00e9es comme le cash-out ou les statistiques d\u00e9taill\u00e9es pour optimiser leurs tactiques de jeu.<\/p>\n
Avant de cr\u00e9er un compte sur un site de paris sportif, il est essentiel de comprendre la vari\u00e9t\u00e9 des options de paris propos\u00e9es. Les plateformes modernes mettent \u00e0 disposition des nombreux march\u00e9s diff\u00e9rents pour chaque \u00e9v\u00e9nement sportif majeur.<\/p>\n
La vari\u00e9t\u00e9 de types de paris permet aux joueurs de tous niveaux de trouver des opportunit\u00e9s adapt\u00e9es \u00e0 leur plan. Un bon site de paris sportif offrira \u00e0 la fois les paris traditionnels et des alternatives modernes pour r\u00e9pondre aux besoins de diff\u00e9rents profils.<\/p>\n
Le pari simple constitue la forme la plus basique et accessible pour les nouveaux parieurs sur tout site de paris sportif. Il faut s\u00e9lectionner une seule issue sur un \u00e9v\u00e9nement sportif, par exemple le succ\u00e8s d’une \u00e9quipe ou le total de buts inscrits.<\/p>\n
Les paris combin\u00e9s permettent de multiplier les gains potentiels en regroupant plusieurs s\u00e9lections sur un m\u00eame ticket. Cette strat\u00e9gie populaire sur chaque site de paris sportif exige que tous les pronostics soient corrects pour remporter le pari, augmentant ainsi le risque mais \u00e9galement les gains.<\/p>\n
Les paris live en direct \u00e9galement appel\u00e9s paris live, transforment l’exp\u00e9rience de jeu en permettant de parier pendant le d\u00e9roulement d’un match. Cette fonctionnalit\u00e9 dynamique sur un site de paris sportif moderne offre des cotes qui \u00e9voluent en temps r\u00e9el en fonction des \u00e9v\u00e9nements du jeu.<\/p>\n
Au-del\u00e0 des paris conventionnels, un site de paris sportif complet propose des march\u00e9s sp\u00e9ciaux comme le nombre de corners, les avertissements ou le premier buteur. Ces choix suppl\u00e9mentaires s\u00e9duisent les parieurs avertis recherchant des opportunit\u00e9s de valeur.<\/p>\n
Les mises \u00e0 long terme sur les comp\u00e9titions sportives constituent \u00e9galement une cat\u00e9gorie appr\u00e9ci\u00e9e des amateurs. Chaque site de paris sportif r\u00e9put\u00e9 offre des paris sur les champions de ligue, les meilleurs buteurs et d’autres march\u00e9s sp\u00e9cifiques \u00e0 la saison avec des cotes int\u00e9ressantes.<\/p>\n
Les propositions commerciales de bienvenue constituent souvent le premier crit\u00e8re d’attraction, mais il est crucial d’analyser attentivement les conditions qui accompagnent chaque site de paris sportif avant de vous engager. Les avantages diff\u00e8rent sensiblement en termes de montant, de exigences de jeu et de limitations d’emploi qui sont susceptibles d’affecter votre exp\u00e9rience globale.<\/p>\n
Cat\u00e9gorie de bonus<\/strong><\/td>\n| B\u00e9n\u00e9fices<\/strong><\/td>\n | Conditions typiques<\/strong><\/td>\n | Points \u00e0 v\u00e9rifier<\/strong><\/td>\n<\/tr>\n | Bonus d’accueil<\/td>\n | Fonds initiaux renforc\u00e9s<\/td>\n | Multiplicateur x5 \u00e0 x10<\/td>\n | D\u00e9lai de validit\u00e9<\/td>\n<\/tr>\n | Mises gratuites<\/td>\n | Exempte de risque<\/td>\n | C\u00f4te minimum obligatoire<\/td>\n | Limite de retrait des b\u00e9n\u00e9fices<\/td>\n<\/tr>\n | Cashback<\/td>\n | Remboursement des pertes<\/td>\n | Taux changeant<\/td>\n | Plafond de remboursement<\/td>\n<\/tr>\n | Programme fid\u00e9lit\u00e9<\/td>\n | R\u00e9compenses continues<\/td>\n | Collecte de points<\/td>\n | Conditions de conversion<\/td>\n<\/tr>\n | Offres exceptionnelles<\/td>\n | Cotes boost\u00e9es<\/td>\n | \u00c9v\u00e9nements sp\u00e9cifiques<\/td>\n | Restrictions sportives<\/td>\n<\/tr>\n<\/table>\n | En plus du montant affich\u00e9, examinez minutieusement les exigences de rollover qui d\u00e9terminent combien de fois vous devrez parier le bonus avant tout retrait. Un site de paris sportif proposant un bonus plus modeste avec des conditions favorables sera souvent plus avantageux qu’une promotion attractive assortie de contraintes difficiles \u00e0 satisfaire.<\/p>\n Ne manquez pas de examiner les programmes de fid\u00e9lit\u00e9 et promotions r\u00e9guli\u00e8res qui valorisent votre activit\u00e9 \u00e0 long terme plut\u00f4t que de vous focaliser exclusivement sur l’proposition de d\u00e9part. Les meilleurs op\u00e9rateurs offrent des b\u00e9n\u00e9fices permanents comme des paris rembours\u00e9s, des cotes am\u00e9lior\u00e9es sur des \u00e9v\u00e9nements sp\u00e9cifiques, et des bonus de d\u00e9p\u00f4t qui enrichissent constamment votre exp\u00e9rience sur site de paris sportif et maximisent votre fonds de jeu.<\/p>\n S\u00fbret\u00e9 et fiabilit\u00e9 des plateformes de paris<\/h2>\nLa sauvegarde demeure un \u00e9l\u00e9ment essentiel au moment de s\u00e9lectionner d’un site de paris sportif afin de s\u00e9curiser vos informations priv\u00e9es et vos op\u00e9rations bancaires en pr\u00e9vention de la fraude \u00e9ventuelle.<\/p>\n Les plateformes agr\u00e9\u00e9es par l’ANJ proposent des protections essentielles en mati\u00e8re de protection des joueurs et garantissent le respect strict des normes fran\u00e7aises en vigueur relatif aux paris en ligne.<\/p>\n
|