/** * Astra Updates * * Functions for updating data, used by the background updater. * * @package Astra * @version 2.1.3 */ defined( 'ABSPATH' ) || exit; /** * Clear Astra + Astra Pro assets cache. * * @since 3.6.1 * @return void. */ function astra_clear_all_assets_cache() { if ( ! class_exists( 'Astra_Cache_Base' ) ) { return; } // Clear Astra theme asset cache. $astra_cache_base_instance = new Astra_Cache_Base( 'astra' ); $astra_cache_base_instance->refresh_assets( 'astra' ); // Clear Astra Addon's static and dynamic CSS asset cache. $astra_addon_cache_base_instance = new Astra_Cache_Base( 'astra-addon' ); $astra_addon_cache_base_instance->refresh_assets( 'astra-addon' ); } /** * 4.0.0 backward handling part. * * 1. Migrate existing setting & do required onboarding for new admin dashboard v4.0.0 app. * 2. Migrating Post Structure & Meta options in title area meta parts. * * @since 4.0.0 * @return void */ function astra_theme_background_updater_4_0_0() { // Dynamic customizer migration starts here. $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['dynamic-blog-layouts'] ) && ! isset( $theme_options['theme-dynamic-customizer-support'] ) ) { $theme_options['dynamic-blog-layouts'] = false; $theme_options['theme-dynamic-customizer-support'] = true; $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); // Archive summary box compatibility. $archive_title_font_size = array( 'desktop' => isset( $theme_options['font-size-archive-summary-title']['desktop'] ) ? $theme_options['font-size-archive-summary-title']['desktop'] : 40, 'tablet' => isset( $theme_options['font-size-archive-summary-title']['tablet'] ) ? $theme_options['font-size-archive-summary-title']['tablet'] : '', 'mobile' => isset( $theme_options['font-size-archive-summary-title']['mobile'] ) ? $theme_options['font-size-archive-summary-title']['mobile'] : '', 'desktop-unit' => isset( $theme_options['font-size-archive-summary-title']['desktop-unit'] ) ? $theme_options['font-size-archive-summary-title']['desktop-unit'] : 'px', 'tablet-unit' => isset( $theme_options['font-size-archive-summary-title']['tablet-unit'] ) ? $theme_options['font-size-archive-summary-title']['tablet-unit'] : 'px', 'mobile-unit' => isset( $theme_options['font-size-archive-summary-title']['mobile-unit'] ) ? $theme_options['font-size-archive-summary-title']['mobile-unit'] : 'px', ); $single_title_font_size = array( 'desktop' => isset( $theme_options['font-size-entry-title']['desktop'] ) ? $theme_options['font-size-entry-title']['desktop'] : '', 'tablet' => isset( $theme_options['font-size-entry-title']['tablet'] ) ? $theme_options['font-size-entry-title']['tablet'] : '', 'mobile' => isset( $theme_options['font-size-entry-title']['mobile'] ) ? $theme_options['font-size-entry-title']['mobile'] : '', 'desktop-unit' => isset( $theme_options['font-size-entry-title']['desktop-unit'] ) ? $theme_options['font-size-entry-title']['desktop-unit'] : 'px', 'tablet-unit' => isset( $theme_options['font-size-entry-title']['tablet-unit'] ) ? $theme_options['font-size-entry-title']['tablet-unit'] : 'px', 'mobile-unit' => isset( $theme_options['font-size-entry-title']['mobile-unit'] ) ? $theme_options['font-size-entry-title']['mobile-unit'] : 'px', ); $archive_summary_box_bg = array( 'desktop' => array( 'background-color' => ! empty( $theme_options['archive-summary-box-bg-color'] ) ? $theme_options['archive-summary-box-bg-color'] : '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), 'tablet' => array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), 'mobile' => array( 'background-color' => '', 'background-image' => '', 'background-repeat' => 'repeat', 'background-position' => 'center center', 'background-size' => 'auto', 'background-attachment' => 'scroll', 'background-type' => '', 'background-media' => '', ), ); // Single post structure. foreach ( $post_types as $index => $post_type ) { /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_post_structure = isset( $theme_options['blog-single-post-structure'] ) ? $theme_options['blog-single-post-structure'] : array( 'single-image', 'single-title-meta' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_structure = array(); if ( ! empty( $single_post_structure ) ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $single_post_structure as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( 'single-title-meta' === $key ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title'; if ( 'post' === $post_type ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-meta'; } } if ( 'single-image' === $key ) { $migrated_post_structure[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-image'; } } $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-structure' ] = $migrated_post_structure; } // Single post meta. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_post_meta = isset( $theme_options['blog-single-meta'] ) ? $theme_options['blog-single-meta'] : array( 'comments', 'category', 'author' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_metadata = array(); if ( ! empty( $single_post_meta ) ) { $tax_counter = 0; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy'; /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $single_post_meta as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort switch ( $key ) { case 'author': $migrated_post_metadata[] = 'author'; break; case 'date': $migrated_post_metadata[] = 'date'; break; case 'comments': $migrated_post_metadata[] = 'comments'; break; case 'category': if ( 'post' === $post_type ) { $migrated_post_metadata[] = $tax_slug; $theme_options[ $tax_slug ] = 'category'; $tax_counter = ++$tax_counter; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy-' . $tax_counter; } break; case 'tag': if ( 'post' === $post_type ) { $migrated_post_metadata[] = $tax_slug; $theme_options[ $tax_slug ] = 'post_tag'; $tax_counter = ++$tax_counter; $tax_slug = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-taxonomy-' . $tax_counter; } break; default: break; } } $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-metadata' ] = $migrated_post_metadata; } // Archive layout compatibilities. $archive_banner_layout = ( class_exists( 'WooCommerce' ) && 'product' === $post_type ) ? false : true; // Setting WooCommerce archive option disabled as WC already added their header content on archive. $theme_options[ 'ast-archive-' . esc_attr( $post_type ) . '-title' ] = $archive_banner_layout; // Single layout compatibilities. $single_banner_layout = ( class_exists( 'WooCommerce' ) && 'product' === $post_type ) ? false : true; // Setting WC single option disabled as there is no any header set from default WooCommerce. $theme_options[ 'ast-single-' . esc_attr( $post_type ) . '-title' ] = $single_banner_layout; // BG color support. $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-image-type' ] = ! empty( $theme_options['archive-summary-box-bg-color'] ) ? 'custom' : 'none'; $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-custom-bg' ] = $archive_summary_box_bg; // Archive title font support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-family' ] = ! empty( $theme_options['font-family-archive-summary-title'] ) ? $theme_options['font-family-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-size' ] = $archive_title_font_size; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-weight' ] = ! empty( $theme_options['font-weight-archive-summary-title'] ) ? $theme_options['font-weight-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $archive_dynamic_line_height = ! empty( $theme_options['line-height-archive-summary-title'] ) ? $theme_options['line-height-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $archive_dynamic_text_transform = ! empty( $theme_options['text-transform-archive-summary-title'] ) ? $theme_options['text-transform-archive-summary-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-title-font-extras' ] = array( 'line-height' => $archive_dynamic_line_height, 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => $archive_dynamic_text_transform, 'text-decoration' => '', ); // Archive title colors support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-title-color' ] = ! empty( $theme_options['archive-summary-box-title-color'] ) ? $theme_options['archive-summary-box-title-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-text-color' ] = ! empty( $theme_options['archive-summary-box-text-color'] ) ? $theme_options['archive-summary-box-text-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort // Single title colors support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-banner-title-color' ] = ! empty( $theme_options['entry-title-color'] ) ? $theme_options['entry-title-color'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort // Single title font support. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-family' ] = ! empty( $theme_options['font-family-entry-title'] ) ? $theme_options['font-family-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-size' ] = $single_title_font_size; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-weight' ] = ! empty( $theme_options['font-weight-entry-title'] ) ? $theme_options['font-weight-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_dynamic_line_height = ! empty( $theme_options['line-height-entry-title'] ) ? $theme_options['line-height-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $single_dynamic_text_transform = ! empty( $theme_options['text-transform-entry-title'] ) ? $theme_options['text-transform-entry-title'] : ''; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-extras' ] = array( 'line-height' => $single_dynamic_line_height, 'line-height-unit' => 'em', 'letter-spacing' => '', 'letter-spacing-unit' => 'px', 'text-transform' => $single_dynamic_text_transform, 'text-decoration' => '', ); } // Set page specific structure, as page only has featured image at top & title beneath to it, hardcoded writing it here. $theme_options['ast-dynamic-single-page-structure'] = array( 'ast-dynamic-single-page-image', 'ast-dynamic-single-page-title' ); // EDD content layout & sidebar layout migration in new dynamic option. $theme_options['archive-download-content-layout'] = isset( $theme_options['edd-archive-product-layout'] ) ? $theme_options['edd-archive-product-layout'] : 'default'; $theme_options['archive-download-sidebar-layout'] = isset( $theme_options['edd-sidebar-layout'] ) ? $theme_options['edd-sidebar-layout'] : 'no-sidebar'; $theme_options['single-download-content-layout'] = isset( $theme_options['edd-single-product-layout'] ) ? $theme_options['edd-single-product-layout'] : 'default'; $theme_options['single-download-sidebar-layout'] = isset( $theme_options['edd-single-product-sidebar-layout'] ) ? $theme_options['edd-single-product-sidebar-layout'] : 'default'; update_option( 'astra-settings', $theme_options ); } // Admin backward handling starts here. $admin_dashboard_settings = get_option( 'astra_admin_settings', array() ); if ( ! isset( $admin_dashboard_settings['theme-setup-admin-migrated'] ) ) { if ( ! isset( $admin_dashboard_settings['self_hosted_gfonts'] ) ) { $admin_dashboard_settings['self_hosted_gfonts'] = isset( $theme_options['load-google-fonts-locally'] ) ? $theme_options['load-google-fonts-locally'] : false; } if ( ! isset( $admin_dashboard_settings['preload_local_fonts'] ) ) { $admin_dashboard_settings['preload_local_fonts'] = isset( $theme_options['preload-local-fonts'] ) ? $theme_options['preload-local-fonts'] : false; } // Consider admin part from theme side migrated. $admin_dashboard_settings['theme-setup-admin-migrated'] = true; update_option( 'astra_admin_settings', $admin_dashboard_settings ); } // Check if existing user and disable smooth scroll-to-id. if ( ! isset( $theme_options['enable-scroll-to-id'] ) ) { $theme_options['enable-scroll-to-id'] = false; update_option( 'astra-settings', $theme_options ); } // Check if existing user and disable scroll to top if disabled from pro addons list. $scroll_to_top_visibility = false; /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( defined( 'ASTRA_EXT_VER' ) && Astra_Ext_Extension::is_active( 'scroll-to-top' ) ) { /** @psalm-suppress UndefinedClass */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $scroll_to_top_visibility = true; } if ( ! isset( $theme_options['scroll-to-top-enable'] ) ) { $theme_options['scroll-to-top-enable'] = $scroll_to_top_visibility; update_option( 'astra-settings', $theme_options ); } // Default colors & typography flag. if ( ! isset( $theme_options['update-default-color-typo'] ) ) { $theme_options['update-default-color-typo'] = false; update_option( 'astra-settings', $theme_options ); } // Block editor experience improvements compatibility flag. if ( ! isset( $theme_options['v4-block-editor-compat'] ) ) { $theme_options['v4-block-editor-compat'] = false; update_option( 'astra-settings', $theme_options ); } } /** * 4.0.2 backward handling part. * * 1. Read Time option backwards handling for old users. * * @since 4.0.2 * @return void */ function astra_theme_background_updater_4_0_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-0-2-update-migration'] ) && isset( $theme_options['blog-single-meta'] ) && in_array( 'read-time', $theme_options['blog-single-meta'] ) ) { if ( isset( $theme_options['ast-dynamic-single-post-metadata'] ) && ! in_array( 'read-time', $theme_options['ast-dynamic-single-post-metadata'] ) ) { $theme_options['ast-dynamic-single-post-metadata'][] = 'read-time'; $theme_options['v4-0-2-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } } /** * Handle backward compatibility on version 4.1.0 * * @since 4.1.0 * @return void */ function astra_theme_background_updater_4_1_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-1-0-update-migration'] ) ) { $theme_options['v4-1-0-update-migration'] = true; $current_payment_list = array(); $old_payment_list = isset( $theme_options['single-product-payment-list']['items'] ) ? $theme_options['single-product-payment-list']['items'] : array(); $visa_payment = isset( $theme_options['single-product-payment-visa'] ) ? $theme_options['single-product-payment-visa'] : ''; $mastercard_payment = isset( $theme_options['single-product-payment-mastercard'] ) ? $theme_options['single-product-payment-mastercard'] : ''; $discover_payment = isset( $theme_options['single-product-payment-discover'] ) ? $theme_options['single-product-payment-discover'] : ''; $paypal_payment = isset( $theme_options['single-product-payment-paypal'] ) ? $theme_options['single-product-payment-paypal'] : ''; $apple_pay_payment = isset( $theme_options['single-product-payment-apple-pay'] ) ? $theme_options['single-product-payment-apple-pay'] : ''; false !== $visa_payment ? array_push( $current_payment_list, array( 'id' => 'item-100', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-visa', 'image' => '', 'label' => __( 'Visa', 'astra' ), ) ) : ''; false !== $mastercard_payment ? array_push( $current_payment_list, array( 'id' => 'item-101', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-mastercard', 'image' => '', 'label' => __( 'Mastercard', 'astra' ), ) ) : ''; false !== $mastercard_payment ? array_push( $current_payment_list, array( 'id' => 'item-102', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-amex', 'image' => '', 'label' => __( 'Amex', 'astra' ), ) ) : ''; false !== $discover_payment ? array_push( $current_payment_list, array( 'id' => 'item-103', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-discover', 'image' => '', 'label' => __( 'Discover', 'astra' ), ) ) : ''; $paypal_payment ? array_push( $current_payment_list, array( 'id' => 'item-104', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-paypal', 'image' => '', 'label' => __( 'Paypal', 'astra' ), ) ) : ''; $apple_pay_payment ? array_push( $current_payment_list, array( 'id' => 'item-105', 'enabled' => true, 'source' => 'icon', 'icon' => 'cc-apple-pay', 'image' => '', 'label' => __( 'Apple Pay', 'astra' ), ) ) : ''; if ( $current_payment_list ) { $theme_options['single-product-payment-list'] = array( 'items' => array_merge( $current_payment_list, $old_payment_list ), ); update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['woo_support_global_settings'] ) ) { $theme_options['woo_support_global_settings'] = true; update_option( 'astra-settings', $theme_options ); } if ( isset( $theme_options['theme-dynamic-customizer-support'] ) ) { $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-title-font-extras' ]['text-transform'] = ''; } update_option( 'astra-settings', $theme_options ); } } } /** * 4.1.4 backward handling cases. * * 1. Migrating users to combined color overlay option to new dedicated overlay options. * * @since 4.1.4 * @return void */ function astra_theme_background_updater_4_1_4() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-1-4-update-migration'] ) ) { $ast_bg_control_options = array( 'off-canvas-background', 'footer-adv-bg-obj', 'footer-bg-obj', ); foreach ( $ast_bg_control_options as $key => $bg_option ) { if ( isset( $theme_options[ $bg_option ] ) && ! isset( $theme_options[ $bg_option ]['overlay-type'] ) ) { $bg_type = isset( $theme_options[ $bg_option ]['background-type'] ) ? $theme_options[ $bg_option ]['background-type'] : ''; $theme_options[ $bg_option ]['overlay-type'] = 'none'; $theme_options[ $bg_option ]['overlay-color'] = ''; $theme_options[ $bg_option ]['overlay-gradient'] = ''; if ( 'image' === $bg_type ) { $bg_img = isset( $theme_options[ $bg_option ]['background-image'] ) ? $theme_options[ $bg_option ]['background-image'] : ''; $bg_color = isset( $theme_options[ $bg_option ]['background-color'] ) ? $theme_options[ $bg_option ]['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $bg_option ]['overlay-type'] = 'classic'; $theme_options[ $bg_option ]['overlay-color'] = $bg_color; $theme_options[ $bg_option ]['overlay-gradient'] = ''; } } } } $ast_resp_bg_control_options = array( 'hba-footer-bg-obj-responsive', 'hbb-footer-bg-obj-responsive', 'footer-bg-obj-responsive', 'footer-menu-bg-obj-responsive', 'hb-footer-bg-obj-responsive', 'hba-header-bg-obj-responsive', 'hbb-header-bg-obj-responsive', 'hb-header-bg-obj-responsive', 'header-mobile-menu-bg-obj-responsive', 'site-layout-outside-bg-obj-responsive', 'content-bg-obj-responsive', ); $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $ast_resp_bg_control_options[] = 'ast-dynamic-archive-' . esc_attr( $post_type ) . '-banner-custom-bg'; $ast_resp_bg_control_options[] = 'ast-dynamic-single-' . esc_attr( $post_type ) . '-banner-background'; } $component_limit = defined( 'ASTRA_EXT_VER' ) ? Astra_Builder_Helper::$component_limit : Astra_Builder_Helper::$num_of_header_menu; for ( $index = 1; $index <= $component_limit; $index++ ) { $_prefix = 'menu' . $index; $ast_resp_bg_control_options[] = 'header-' . $_prefix . '-bg-obj-responsive'; } foreach ( $ast_resp_bg_control_options as $key => $resp_bg_option ) { // Desktop version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['desktop'] ) && is_array( $theme_options[ $resp_bg_option ]['desktop'] ) && ! isset( $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $desk_bg_type = isset( $theme_options[ $resp_bg_option ]['desktop']['background-type'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['desktop']['overlay-gradient'] = ''; if ( 'image' === $desk_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['desktop']['background-image'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['desktop']['background-color'] ) ? $theme_options[ $resp_bg_option ]['desktop']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['desktop']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['desktop']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['desktop']['overlay-gradient'] = ''; } } } // Tablet version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['tablet'] ) && is_array( $theme_options[ $resp_bg_option ]['tablet'] ) && ! isset( $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $tablet_bg_type = isset( $theme_options[ $resp_bg_option ]['tablet']['background-type'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['tablet']['overlay-gradient'] = ''; if ( 'image' === $tablet_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['tablet']['background-image'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['tablet']['background-color'] ) ? $theme_options[ $resp_bg_option ]['tablet']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['tablet']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['tablet']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['tablet']['overlay-gradient'] = ''; } } } // Mobile version. /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( isset( $theme_options[ $resp_bg_option ]['mobile'] ) && is_array( $theme_options[ $resp_bg_option ]['mobile'] ) && ! isset( $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] ) ) { // @codingStandardsIgnoreStart $mobile_bg_type = isset( $theme_options[ $resp_bg_option ]['mobile']['background-type'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-type'] : ''; // @codingStandardsIgnoreEnd $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-color'] = ''; $theme_options[ $resp_bg_option ]['mobile']['overlay-gradient'] = ''; if ( 'image' === $mobile_bg_type ) { $bg_img = isset( $theme_options[ $resp_bg_option ]['mobile']['background-image'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-image'] : ''; $bg_color = isset( $theme_options[ $resp_bg_option ]['mobile']['background-color'] ) ? $theme_options[ $resp_bg_option ]['mobile']['background-color'] : ''; if ( '' !== $bg_img && '' !== $bg_color && ( ! is_numeric( strpos( $bg_color, 'linear-gradient' ) ) && ! is_numeric( strpos( $bg_color, 'radial-gradient' ) ) ) ) { $theme_options[ $resp_bg_option ]['mobile']['overlay-type'] = 'classic'; $theme_options[ $resp_bg_option ]['mobile']['overlay-color'] = $bg_color; $theme_options[ $resp_bg_option ]['mobile']['overlay-gradient'] = ''; } } } } $theme_options['v4-1-4-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.1.6 * * @since 4.1.6 * @return void */ function astra_theme_background_updater_4_1_6() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['list-block-vertical-spacing'] ) ) { $theme_options['list-block-vertical-spacing'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Set flag to avoid direct reflections on live site & to maintain backward compatibility for existing users. * * @since 4.1.7 * @return void */ function astra_theme_background_updater_4_1_7() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['add-hr-styling-css'] ) ) { $theme_options['add-hr-styling-css'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['astra-site-svg-logo-equal-height'] ) ) { $theme_options['astra-site-svg-logo-equal-height'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Migrating users to new container layout options * * @since 4.2.0 * @return void */ function astra_theme_background_updater_4_2_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-2-0-update-migration'] ) ) { $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); $theme_options = get_option( 'astra-settings' ); $blog_types = array( 'single', 'archive' ); $third_party_layouts = array( 'woocommerce', 'edd', 'lifterlms', 'lifterlms-course-lesson', 'learndash' ); // Global. if ( isset( $theme_options['site-content-layout'] ) ) { $theme_options = astra_apply_layout_migration( 'site-content-layout', 'ast-site-content-layout', 'site-content-style', 'site-sidebar-style', $theme_options ); } // Single, archive. foreach ( $blog_types as $index => $blog_type ) { foreach ( $post_types as $index => $post_type ) { $old_layout = $blog_type . '-' . esc_attr( $post_type ) . '-content-layout'; $new_layout = $blog_type . '-' . esc_attr( $post_type ) . '-ast-content-layout'; $content_style = $blog_type . '-' . esc_attr( $post_type ) . '-content-style'; $sidebar_style = $blog_type . '-' . esc_attr( $post_type ) . '-sidebar-style'; if ( isset( $theme_options[ $old_layout ] ) ) { $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ); } } } // Third party existing layout migrations to new layout options. foreach ( $third_party_layouts as $index => $layout ) { $old_layout = $layout . '-content-layout'; $new_layout = $layout . '-ast-content-layout'; $content_style = $layout . '-content-style'; $sidebar_style = $layout . '-sidebar-style'; if ( isset( $theme_options[ $old_layout ] ) ) { if ( 'lifterlms' === $layout ) { // Lifterlms course/lesson sidebar style migration case. $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, 'lifterlms-course-lesson-sidebar-style', $theme_options ); } $theme_options = astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ); } } if ( ! isset( $theme_options['fullwidth_sidebar_support'] ) ) { $theme_options['fullwidth_sidebar_support'] = false; } $theme_options['v4-2-0-update-migration'] = true; update_option( 'astra-settings', $theme_options ); } } /** * Handle migration from old to new layouts. * * Migration cases for old users, old layouts -> new layouts. * * @since 4.2.0 * @param mixed $old_layout old_layout. * @param mixed $new_layout new_layout. * @param mixed $content_style content_style. * @param mixed $sidebar_style sidebar_style. * @param array $theme_options theme_options. * @return array $theme_options The updated theme options. */ function astra_apply_layout_migration( $old_layout, $new_layout, $content_style, $sidebar_style, $theme_options ) { switch ( astra_get_option( $old_layout ) ) { case 'boxed-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'boxed'; $theme_options[ $sidebar_style ] = 'boxed'; break; case 'content-boxed-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'boxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'plain-container': $theme_options[ $new_layout ] = 'normal-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'page-builder': $theme_options[ $new_layout ] = 'full-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; case 'narrow-container': $theme_options[ $new_layout ] = 'narrow-width-container'; $theme_options[ $content_style ] = 'unboxed'; $theme_options[ $sidebar_style ] = 'unboxed'; break; default: $theme_options[ $new_layout ] = 'default'; $theme_options[ $content_style ] = 'default'; $theme_options[ $sidebar_style ] = 'default'; break; } return $theme_options; } /** * Handle backward compatibility on version 4.2.2 * * @since 4.2.2 * @return void */ function astra_theme_background_updater_4_2_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-2-2-core-form-btns-styling'] ) ) { $theme_options['v4-2-2-core-form-btns-styling'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.0 * * @since 4.4.0 * @return void */ function astra_theme_background_updater_4_4_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-4-0-backward-option'] ) ) { $theme_options['v4-4-0-backward-option'] = false; // Migrate primary button outline styles to secondary buttons. if ( isset( $theme_options['font-family-button'] ) ) { $theme_options['secondary-font-family-button'] = $theme_options['font-family-button']; } if ( isset( $theme_options['font-size-button'] ) ) { $theme_options['secondary-font-size-button'] = $theme_options['font-size-button']; } if ( isset( $theme_options['font-weight-button'] ) ) { $theme_options['secondary-font-weight-button'] = $theme_options['font-weight-button']; } if ( isset( $theme_options['font-extras-button'] ) ) { $theme_options['secondary-font-extras-button'] = $theme_options['font-extras-button']; } if ( isset( $theme_options['button-bg-color'] ) ) { $theme_options['secondary-button-bg-color'] = $theme_options['button-bg-color']; } if ( isset( $theme_options['button-bg-h-color'] ) ) { $theme_options['secondary-button-bg-h-color'] = $theme_options['button-bg-h-color']; } if ( isset( $theme_options['theme-button-border-group-border-color'] ) ) { $theme_options['secondary-theme-button-border-group-border-color'] = $theme_options['theme-button-border-group-border-color']; } if ( isset( $theme_options['theme-button-border-group-border-h-color'] ) ) { $theme_options['secondary-theme-button-border-group-border-h-color'] = $theme_options['theme-button-border-group-border-h-color']; } if ( isset( $theme_options['button-radius-fields'] ) ) { $theme_options['secondary-button-radius-fields'] = $theme_options['button-radius-fields']; } // Single - Article Featured Image visibility migration. $post_types = Astra_Posts_Structure_Loader::get_supported_post_types(); foreach ( $post_types as $index => $post_type ) { $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-position-layout-1' ] = 'none'; $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-position-layout-2' ] = 'none'; $theme_options[ 'ast-dynamic-single-' . esc_attr( $post_type ) . '-article-featured-image-ratio-type' ] = 'default'; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.5.0. * * @since 4.5.0 * @return void */ function astra_theme_background_updater_4_5_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-5-0-backward-option'] ) ) { $theme_options['v4-5-0-backward-option'] = false; $palette_options = get_option( 'astra-color-palettes', Astra_Global_Palette::get_default_color_palette() ); if ( ! isset( $palette_options['presets'] ) ) { $palette_options['presets'] = astra_get_palette_presets(); update_option( 'astra-color-palettes', $palette_options ); } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.5.2. * * @since 4.5.2 * @return void */ function astra_theme_background_updater_4_5_2() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['scndry-btn-default-padding'] ) ) { $theme_options['scndry-btn-default-padding'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.0 * * @since 4.6.0 * @return void */ function astra_theme_background_updater_4_6_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['v4-6-0-backward-option'] ) ) { $theme_options['v4-6-0-backward-option'] = false; /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $blog_post_structure = isset( $theme_options['blog-post-structure'] ) ? $theme_options['blog-post-structure'] : array( 'image', 'title-meta' ); /** @psalm-suppress PossiblyUndefinedStringArrayOffset */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort $migrated_post_structure = array(); if ( ! empty( $blog_post_structure ) ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort foreach ( $blog_post_structure as $key ) { /** @psalm-suppress PossiblyInvalidIterator */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort if ( 'title-meta' === $key ) { $migrated_post_structure[] = 'title'; $migrated_post_structure[] = 'title-meta'; } if ( 'image' === $key ) { $migrated_post_structure[] = 'image'; } } $migrated_post_structure[] = 'excerpt'; $migrated_post_structure[] = 'read-more'; $theme_options['blog-post-structure'] = $migrated_post_structure; } if ( defined( 'ASTRA_EXT_VER' ) ) { $theme_options['ast-sub-section-author-box-border-width'] = isset( $theme_options['author-box-border-width'] ) ? $theme_options['author-box-border-width'] : array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ); $theme_options['ast-sub-section-author-box-border-radius'] = isset( $theme_options['author-box-border-radius'] ) ? $theme_options['author-box-border-radius'] : array( 'top' => '', 'right' => '', 'bottom' => '', 'left' => '', ); $theme_options['ast-sub-section-author-box-border-color'] = isset( $theme_options['author-box-border-color'] ) ? $theme_options['author-box-border-color'] : ''; if ( isset( $theme_options['single-post-inside-spacing'] ) ) { $theme_options['ast-sub-section-author-box-padding'] = $theme_options['single-post-inside-spacing']; } if ( isset( $theme_options['font-family-post-meta'] ) ) { $theme_options['font-family-post-read-more'] = $theme_options['font-family-post-meta']; } if ( isset( $theme_options['font-extras-post-meta'] ) ) { $theme_options['font-extras-post-read-more'] = $theme_options['font-extras-post-meta']; } } if ( isset( $theme_options['single-post-inside-spacing'] ) ) { $theme_options['ast-sub-section-related-posts-padding'] = $theme_options['single-post-inside-spacing']; } $theme_options['single-content-images-shadow'] = false; $theme_options['ast-font-style-update'] = false; update_option( 'astra-settings', $theme_options ); } $docs_legacy_data = get_option( 'astra_docs_data', array() ); if ( ! empty( $docs_legacy_data ) ) { delete_option( 'astra_docs_data' ); } } /** * Handle backward compatibility on version 4.6.2. * * @since 4.6.2 * @return void */ function astra_theme_background_updater_4_6_2() { $theme_options = get_option( 'astra-settings', array() ); // Unset "featured image" for pages structure. if ( ! isset( $theme_options['v4-6-2-backward-option'] ) ) { $theme_options['v4-6-2-backward-option'] = false; $page_banner_layout = isset( $theme_options['ast-dynamic-single-page-layout'] ) ? $theme_options['ast-dynamic-single-page-layout'] : 'layout-1'; $page_structure = isset( $theme_options['ast-dynamic-single-page-structure'] ) ? $theme_options['ast-dynamic-single-page-structure'] : array( 'ast-dynamic-single-page-image', 'ast-dynamic-single-page-title' ); $layout_1_image_position = isset( $theme_options['ast-dynamic-single-page-article-featured-image-position-layout-1'] ) ? $theme_options['ast-dynamic-single-page-article-featured-image-position-layout-1'] : 'behind'; $migrated_page_structure = array(); if ( 'layout-1' === $page_banner_layout && 'none' === $layout_1_image_position && ! empty( $page_structure ) ) { foreach ( $page_structure as $key ) { if ( 'ast-dynamic-single-page-image' !== $key ) { $migrated_page_structure[] = $key; } } $theme_options['ast-dynamic-single-page-structure'] = $migrated_page_structure; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility on version 4.6.4. * * @since 4.6.4 * @return void */ function astra_theme_background_updater_4_6_4() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['btn-stylings-upgrade'] ) ) { $theme_options['btn-stylings-upgrade'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Elementor Pro heading's margin. * * @since 4.6.5 * @return void */ function astra_theme_background_updater_4_6_5() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['elementor-headings-style'] ) ) { $theme_options['elementor-headings-style'] = defined( 'ELEMENTOR_PRO_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Elementor Loop block post div container padding. * * @since 4.6.6 * @return void */ function astra_theme_background_updater_4_6_6() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['elementor-container-padding-style'] ) ) { $theme_options['elementor-container-padding-style'] = defined( 'ELEMENTOR_PRO_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for Starter template library preview line height cases. * * @since 4.6.11 * @return void */ function astra_theme_background_updater_4_6_11() { $theme_options = get_option( 'astra-settings', array() ); if ( isset( $theme_options['global-headings-line-height-update'] ) ) { return; } $headers_fonts = array( 'h1' => '1.4', 'h2' => '1.3', 'h3' => '1.3', 'h4' => '1.2', 'h5' => '1.2', 'h6' => '1.25', ); foreach ( $headers_fonts as $header_tag => $header_font_value ) { if ( empty( $theme_options[ 'font-extras-' . $header_tag ]['line-height'] ) ) { $theme_options[ 'font-extras-' . $header_tag ]['line-height'] = $header_font_value; if ( empty( $theme_options[ 'font-extras-' . $header_tag ]['line-height-unit'] ) ) { $theme_options[ 'font-extras-' . $header_tag ]['line-height-unit'] = 'em'; } } } $theme_options['global-headings-line-height-update'] = true; update_option( 'astra-settings', $theme_options ); } /** * Handle backward compatibility for heading `clear:both` css in single posts and pages. * * @since 4.6.12 * @return void */ function astra_theme_background_updater_4_6_12() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['single_posts_pages_heading_clear_none'] ) ) { $theme_options['single_posts_pages_heading_clear_none'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['elementor-btn-styling'] ) ) { $theme_options['elementor-btn-styling'] = defined( 'ELEMENTOR_VERSION' ) ? true : false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['remove_single_posts_navigation_mobile_device_padding'] ) ) { $theme_options['remove_single_posts_navigation_mobile_device_padding'] = true; update_option( 'astra-settings', $theme_options ); } }/** * Off Canvas. * * @package astra-builder * @author Brainstorm Force * @copyright Copyright (c) 2020, Brainstorm Force * @link https://www.brainstormforce.com * @since 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } define( 'ASTRA_OFF_CANVAS_DIR', ASTRA_THEME_DIR . 'inc/builder/type/header/off-canvas' ); define( 'ASTRA_OFF_CANVAS_URI', ASTRA_THEME_URI . 'inc/builder/type/header/off-canvas' ); /** * Off Canvas Initial Setup * * @since 3.0.0 */ class Astra_Off_Canvas { /** * Constructor function that initializes required actions and hooks. */ public function __construct() { // @codingStandardsIgnoreStart WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound require_once ASTRA_OFF_CANVAS_DIR . '/class-astra-off-canvas-loader.php'; // Include front end files. if ( ! is_admin() || Astra_Builder_Customizer::astra_collect_customizer_builder_data() ) { require_once ASTRA_OFF_CANVAS_DIR . '/dynamic-css/dynamic.css.php'; } // @codingStandardsIgnoreEnd WPThemeReview.CoreFunctionality.FileInclude.FileIncludeFound } } /** * Kicking this off by creating an object. */ new Astra_Off_Canvas();/** * WIDGET Styling Loader for Astra theme. * * @package Astra Builder * @author Brainstorm Force * @copyright Copyright (c) 2020, Brainstorm Force * @link https://www.brainstormforce.com * @since Astra 3.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Customizer Initialization * * @since 3.0.0 */ class Astra_Footer_Widget_Component_Loader { /** * Constructor * * @since 3.0.0 */ public function __construct() { add_action( 'customize_preview_init', array( $this, 'preview_scripts' ), 110 ); } /** * Customizer Preview * * @since 3.0.0 */ public function preview_scripts() { /** * Load unminified if SCRIPT_DEBUG is true. */ /* Directory and Extension */ $dir_name = ( SCRIPT_DEBUG ) ? 'unminified' : 'minified'; $file_prefix = ( SCRIPT_DEBUG ) ? '' : '.min'; wp_enqueue_script( 'astra-footer-widget-customizer-preview-js', ASTRA_BUILDER_FOOTER_WIDGET_URI . '/assets/js/' . $dir_name . '/customizer-preview' . $file_prefix . '.js', array( 'customize-preview', 'astra-customizer-preview-js' ), ASTRA_THEME_VERSION, true ); // Localize variables for WIDGET JS. wp_localize_script( 'astra-footer-widget-customizer-preview-js', 'AstraBuilderWidgetData', array( 'footer_widget_count' => defined( 'ASTRA_EXT_VER' ) ? Astra_Builder_Helper::$component_limit : Astra_Builder_Helper::$num_of_footer_widgets, 'tablet_break_point' => astra_get_tablet_breakpoint(), 'mobile_break_point' => astra_get_mobile_breakpoint(), 'is_flex_based_css' => Astra_Builder_Helper::apply_flex_based_css(), 'has_block_editor' => astra_has_widgets_block_editor(), ) ); } } /** * Kicking this off by creating the object of the class. */ new Astra_Footer_Widget_Component_Loader(); onlayn mərc, rəsmi kazin - Montenegro Tours

onlayn mərc, rəsmi kazin

onlayn mərc, rəsmi kazino

onlayn mərc, rəsmi kazino

İstifadəçilər tətbiq interfeysini konfiqurasiya eləmək imkanına malikdirlər. Tətbiqdə, bölmələrin nümayiş etdirilməsi prosedurunu qura bilərsiniz, məlumatların hissəsi gizlənər. Xəttin parametrlərində və canlı kimi, istədiyiniz idmanı təyin eləmək yolveriləndir.

  • Yeniləmə paketləri cihazlara yüklənir, və  quraşdırılırlar.
  • Alınan məbləğin miqdarından 3 dəfə mərc eləmək lazım gələcək.
  • Bir qayda kimi, rəssamlıqdakı 1xbet mobile sadəcə iclasın qalibini və turların sayını qoymağı əlçatan edir.
  • 1xbet rəsmi veb saytına linklə giriş bloklanıbsa belə, 1xWin kompüterdə işləyəcək, oyunçuların bütün imkanlarına tam giriş imkanı verən oyunçular.
  • Cihazların   öncəki versiyalarında iOS üçün 1xbet azerbaycan tətbiqetməsi problem olmadan başlanılır.

Əlavəetmədəki slot maşınlarının yeganə çatışmazlığı pulsuz bir demo versiyasının olmamasıdır. İstifadəçilər təkcə real pul səbəbindən oyun mövcuddur. PC user-ləri səbəbindən 1xbet həmçinin kompüterlər üçün aparat hazırladı. 1xbet download proqramı rəsmi saytın bütöv funksionallığına malikdir və interfeysini təkrarlayır. İstifadəçilər mərc eləyə, virtual casino, toto və canlı kazinoda qumar oyunu oynamaq imkanına malikdirlər.

IPhone-da PULSUZ 1xBet-i yükləyin

Bir hesabın balansını 1xbetin kriptovalyutası ilə doldurarkən, bəxşiş əldə etməkdən imtina edəcəkdir. Yeni isitfadəçilərin bonuslar şəklində birinci depozitin 120% -ni əldə eləyə bilmə imkanları var. Bunu eləmək üçün, bəxşiş kimi qeydiyyatdan keçərkən “İdman dərəcələri” seçin və 1 AZN-dən əmanət edin. Azərbaycanda yeni 1xbet mobi yükle müştəri ala biləcəyi maksimal bonusun məbləği AZN. Bonus hesablamasının həcmi ən birinci depozitin miqdarından asılıdır.

Fiat valyutasına əlavə olaraq, Kriptokurlar hesabı səbəbdən mövcuddur. Bukmeyker 1xbet apk da, oyunçular başlıq, canlı və uzun müddətli mərclər səbəbdən əlçatandır. İdman mərclərinə əlavə kimi, bukmeyker siyasət, hava və media hadisələri üçünbahis edir. 30-dan artıq sport növü bahislər səbəbdən mövcuddur.

Androin üçün PULSUZ 1xbet APK faylı işə salın

Wagging, ikiqat ölçüdə nəzərə alındıqda 1XGAMES-dən oyunlara mərc etmək. Məsələn, 2 EUR dək oynarkən 1 EUR dərəcəsi nəzərə alınacaqdır. Cümə müntəzəm olaraq 1xbet app istifadəçiləri sport mərcləri üçün 150 avroya dək bəxşiş ala bilərlər. Bunu eləmək səbəbdən hesabı ən azı 1 avro ilə depozit eləmək lazımlıdır. 24 saat ərzində bəxşiş məbləğindən 3 dəfə yüksək bahis eləmək lazımdır https://1win-azerbaijan2.com.

Əsas vurğu Azərbaycanda populyar – futbol, ​​basketbol, ​​e -sports. Ancaqbahis ekzotik, məsələn, gell futbol və ya it qaçışınabahis əlavə eləyə bilərsiz. Futbol Azərbaycanda 1xbet download bukmeykerində ən populyar sport növüdür.

Müraciət Azərbaycanda qanunidir?

Müştərilərin rahatlığı üçün, Bookmaker 1xbet mobile download tətbiqetməni inkişaf etdirdi. Mobil tətbiqin rəsmi saytın bütöv funksionallığına malikdir. Bütün qumar əyləncəsi mərc edənlər səbəbindən əlçatandır. Hesabınızın balansını tətbiq vasitəsilə də artıra və qazanmağı göstərə bilərsiz. Live-də mərc həyata keçirən oyunçular birbaşa 1xbet yükle tətbiqetməsində yararlanma imkanları var.

  • Sekyuriti parametrlərində, bilinməyən mənbələrdən mobil tətbiqetmələrin quraşdırılmasına icazə vermək lazım gələcək.
  • Aşağıda göstərilən təlimatda tətbiqin rəsmi səhifədən yüklənməsi və quraşdırılması üçün ətraflı məlumat verilib.
  • 1xbet tətbiqetməsi iOS və Android platformalarıyla mobil cihazdan mərc eləmək  səbəbindən tək yol deyil.
  • Bonusun oynanılması zamanı vəsaitin çıxarışı mümkünsüzdür.
  • Digər turnirlər üçün, bukmeker komissiyası 5-7% -dir.

Bu o deməkdir ki, qumar oyunları idarə olunur və lisenziyalıdır. Ayrıca, bukmeyker oyun asılılığıyla bağlı problemli oyunçuları özünüzə çevirmək imkanı verir. Sayt HTTPS protokolunda işləyir, bu, məlumatların şifrələnmiş şəkildə ötürülməsi deməkdir. Şəxsi məlumat və ödəniş məlumatları Şifrələməylə SSL tərəfindən 128 bitlik qorunur.

bet tətbiqetməsinin nəzərdən keçirilməsi

Ən populyar turnirlər üçün, məsələn, Premyer Liqa, Bundesliga, çempionlar Liqası və Dünya Kuboku, Margin 2-4% -dir. Digər turnirlər üçün, bukmeker komissiyası 5-7% -dir. Premyer Liqa və Bundesligacan iri turnirlər səbəbdən 1xbet uzunmüddətli bahis edir. Ancaq kimin çempion olacağına, ən yaxşı 4 və ya ən yaxşı Bundesliga Scorer-də bahis səbəbdən qəbul edildiyini mərc eləmək imkanınız var.

  • Azərbaycandan  isitifadəçilər üçün, bukmeyker 5 hesab doldurma metodundan istifadə etməyi tövsiyyə edir.
  • 1xbet bukmeykerin tətbiqində  neçə vacib xüsusiyyət var.
  • Məsələn, 2 EUR dək oynarkən 1 EUR dərəcəsi nəzərə alınacaqdır.
  • Bonusun oynanılması zamanı hesabdan vəsaitin çəkilməsində məhdudiyyətlər var.

InterSeason dövründə 1xbet köçürmə dərəcələrini qəbul edir. Bu və ya bu futbolçunun transfer pəncərəsinin bağlanmasından keçərkən tapa biləcəyi bahis bağlaya bilərsiz. Ancaq xəttdə belə matçlara bahis əlavə eləyə bilməzsiniz. Adətən, matç başlamazdan 30 dəqiqə əvvəl Cyberfutball-da mərc etmə fürsətiniz var 1win apk.

bet az tətbiqetməsinə giriş

Basketbol 1xbet mobi da ən populyar sport növlərindən biridir. Vurğu AMB, Euroleague və VTB Liqasının matçlarında idi. Vacib turnirlərə əlavə kimi, 1xbet da əksər ölkələrin yerli çempionatlarına, Afrikaya dək mərc etməniz yolveriləndir. 1xbet yukle, demək olar ki, oyunlar səbəbindən iclas vaxtı mərcləri qəbul edir. Və bəzi matçlar üçün təkcə canlı yayımlarda mərc etmə imkanınız var. Live-də marjinallıq dərəcələri xətdə olduğundan 1-2% yüksəkdir.

  • Azərbaycan səbəbdən1xbet download təqdimat kodu veb saytımızda əldə edilər.
  • Bir güzgü başqa  domendə yerləşən saytın dəqiq bir nüsxəsidir.
  • İstifadəçilər təkcə real pul  səbəbindən  oyun mövcuddur.
  • Ayrıca, bukmeyker oyun asılılığıyla bağlı problemli oyunçuları özünüzə çevirmək imkanı verir.

1xbetdəki ikinci proqram, yükləmək səbəbindən mövcuddur – 1xaccess. Bu, həmişə Azərbaycanda cari 1xbet güzgüsünü göstərən proqramdır. Bloklanma halında, Siz 1Xaccess-in köməyiylə müntəzəm olaraq həqiqi alternativ bir ünvana sahib ola bilərsiz. Proqramı quraşdırmaq səbəbindən Windows 7 və ya yuxarı versiyanın kompüterdə quraşdırılmaması zəruridir. Yeniləmə paketləri cihazlara yüklənir, və quraşdırılırlar. Çətinliklər istifadəçilərlə yalnızca Android smartfonları baş verər.

bet Azerbaycan Android üçün sistem tələbləri

UFC-yə əlavə kimi, Bellator, KSW, Cəsur FC, Hype Reallıq və başqalarına mərc eləyə bilməniz yolveriləndir. Bir qayda kimi, rəssamlıqdakı 1xbet mobile sadəcə iclasın qalibini və turların sayını qoymağı əlçatan edir. Adi döyüşlər səbəbdən margin, tanıtımın populyarlığından asılı kimi 5-10% -dir.

  • Oynanılması səbəbdənbonusun miqdarının 10 dəfəsi həcmində qoymalısınız.
  • Bonusun oynanılmasının hesabına əmsalı ən azı 1.40-dan yuxar, özündə 3 hadisəni cəmləşdirən mərclər əlavə olunacaqdır.
  • Yeni isitifadəçilər  səbəbindən aktual 1xbet app təqdimat kodu veb saytımızda əldə olunar.

Gündəlik bukmeyker 1500-dən artıq matç səbəbdən mərcləri qəbul edir. 1xbet populyar çempionatların və kiçik regional liqaların iki görüşündə mərcləri qəbul edir. Futbol mərclərinin marjası çempionatın populyarlığından asılıdır.

sadə addımda  tətbiq 1xbet mobile tətbiqini nə cür quraşdırmaq olar

Tətbiqetmənin yeganə aydın çatışmazlığı, slot maşınları səbəbindən demovement funksiyası olmamasıdır. İstifadəçilər 1xbet AZ tətbiqində təkcə real pul səbəbindən yuvalar oynayar. Qeydiyyat başa çatdıqdan keçərkən istifadəçi dərhal hesabı doldurub mərc etməsi yolveriləndir. 18 yaşdan yuxarı şəxslər 1xbetdə qeydiyyatdan keçmə imkanları var. Təkrar qeydiyyat – bukmeker qaydalarının pozulması sayılır.

  • Adətən, matç başlamazdan 30 dəqiqə əvvəl Cyberfutball-da mərc etmə fürsətiniz var.
  • 20-dən çox provayderdən  cədvəllər Live Casino-da mövcuddur.
  • 1xbet download tətbiqetməsi Azərbaycan  səbəbindən smartfondan yüksək imkanlar tələb etmir.
  • Dilin dəyişdirildikdə regional parametrlər qorunur, saytın və ya tətbiqin dil versiyasına bağlı deyillər.
  • Həmin anda, köhnə hesablardan vəsait heç yerdə yox olmur.
  • Bukmeker 1xbet Azerbaycan hesab balansını artırmağın 70-dən artıq fərqli yolu imkanını verir.

Bununla likdə, 1xbet tətbiqetməsii təkcə rəsmi saytından yükləməyi tövsiyyə edir. Bu vəziyyətdə, tətbiqin faylından istifadə edərək özünüz mexaniki formada quraşdırmalısınız. Aşağıda göstərilən təlimatda tətbiqin rəsmi səhifədən yüklənməsi və quraşdırılması üçün ətraflı məlumat verilib. Bu bənd Android OS-un köhnə 1xbet yükle versiyalarının idarə etdiyi smartfonlar səbəbindən 8.0-dan və aşağı olanlardan başlayaraq aktualdır.

bet tətbiqetməsində nə cür bahis eləmək olar

Online kazinoda bonus, hesabın açıq olduğu valyutadan asılı olmayaraq avroya konvertasiya olunur. Yeni oyunçular 1500 avro və 150 ​​frispinov dək bəxşiş əldə eləmək imkanlarına malikdirlər. Bununla birlikdə, kazinoda xoş gəldin bonusu 4 hissəyə bölünür.

  • Anketi şəxsi məlumatları ilə doldurmalı və əlaqə nömrəsini bağlamalısınız.
  • Live-də mərc həyata keçirən oyunçular birbaşa 1xbet yükle tətbiqetməsində yararlanma imkanları var.
  • Tətbiqdə, bölmələrin nümayiş etdirilməsi prosedurunu qura bilərsiniz, məlumatların  hissəsi gizlənər.
  • Müştərilərin rahatlığı üçün, Bookmaker 1xbet mobile download tətbiqetməni inkişaf etdirdi.

Çıxarış üçün sadəcə depozit edilən ödəniş əməliyyatları sistemlərindən istifadə eləmək lazım gələcək. Məsələn, kartdan əmanət eləyə bilməzsiniz, ancaq kriptovalyuta vasitəsilə göstərin. Kriptoməzənnə səbəbindən minimal nəticə BTC-yə cari AZN kursundan asılıdır. Mobil nömrəsini 1xbet hesabına bağlamaq da tələb olunur. Sekyuriti xidməti 1xbet oyunçudan şəxsiyyəti təsdiqləməsini istəyər.

bet yukle (download) rəsmi tətbiqetməsində online kazino

Buna səbəbən naməlum mənbələrdən tətbiqləri quraşdırmaq üçün icazə vermək lazım gələcək. Hesabı tətbiqdə 2 yolla – giriş və şifrə və ya sosial şəbəkələr vasitəsilə əlavə ola bilərsiz. ID hesabları – qeydiyyatdan keçərkən akkaunt üçün təyin olunan unikal bir nömrə. Giriş, istifadəçi sosial şəbəkələr və ya 1 kliklə qeydiyyata alınırsa, sistem yaradır.

  • 1 xbet ilə həyata keçirilən  bir depozitlərin miqdarından artıq olmayan bir məbləği çıxarmaq yolveriləndir.
  • 1xbet yukle, demək olar ki,   oyunlar  səbəbindən iclas vaxtı mərcləri qəbul edir.
  • Sayt HTTPS protokolunda işləyir, bu,   məlumatların şifrələnmiş şəkildə ötürülməsi deməkdir.
  • Ancaq Bookmakers, Böyük Britaniya, İrlandiya və ya Fransanın lisenziyasıyla işləyən oyun bazarında proqramlar göndərə bilər.
  • XüSUSİ bəxşiş növü akkaunt parametrlərində dəyişdirilər.

Bonusun ölçüsündən asılı olmayaraq, geri qaytarılması yolverilən ümumi, əlcək və nisbətləri əlavə eləmək mümkünsüzdür. Bonusun oynanılması zamanı hesabdan vəsaitin çəkilməsində məhdudiyyətlər var. 1 xbet ilə həyata keçirilən bir depozitlərin miqdarından artıq olmayan bir məbləği çıxarmaq yolveriləndir. Ancaq həm də, akkaunt bonusdan ən azı 2 dəfə daha artıq bir miqdar qalmalıdır. Məsələn, bəxşiş hesabında 500 AZN, çıxarış etdikdən sonra hesabda ən azı 1000 AZN qalmalıdır.

Bet azerbaycan tətbiqini necə yeniləmək olar

Ən azı 3 hadisədən ibarət və birinin əmsalı 1.40-dan yuxarı mərclər bonusun oynanılmasının hesabına əlavə olacaq. Hər hadisələr son tarixin sonunacani hesablanmalıdır. Bonusun oynanılması zamanı vəsaitin çıxarışı mümkünsüzdür.

  • Sekyuriti xidməti 1xbet  oyunçudan şəxsiyyəti təsdiqləməsini istəyər.
  • Bir sosial şəbəkə vasitəsilə giriş sadəcəistifadəçi 1xbet giriş hesabına sosial şəbəkəyə bağlasanız mövcuddur.
  • Sekyuriti xidməti video zəng və ya əlavə sənəd tələb olunar.
  • IPhone-da 1xBet app tətbiqetməsini birbaşa App Store mağazasından yükləmək yolveriləndir.
  • Fiat valyutasına əlavə olaraq, Kriptokurlar hesabı  səbəbdən mövcuddur.

Istifadəçiyə neçə hesabların aid olduğu faktı aşkar edilərsə, hamısı bloklanacaqdır. Qeyd edərkən, user yeni başlayanlar üçün geniş edilmiş bəxşiş əldə etməyə imkan verən təqdimat kodu göstərər. Yeni isitifadəçilər səbəbindən aktual 1xbet app təqdimat kodu veb saytımızda əldə olunar. Akkaunt yaratdıqdan keçərkən yeni mərc edənlər səbəbindən təqdimat kodunu aktivləşdirmək mümkünsüzdür.

bet mobi tətbiqetməsində yenidən qeydiyyatdan keçmək lazım gələcək?

1xbet download Bukmeker iOS əməliyyat sistemləri və Android platformaları səbəbindən mobil tətbiqetmələr buraxdı. Əlavəetməni iOS-da tətbiq mağazasından yükləyə bilərsiz. Məhşur axdarış portalları, casino oyunlarəyla tətbiqlərin dərc edilməsi ilə bağlı ciddi siyasət aparır. Ancaq Bookmakers, Böyük Britaniya, İrlandiya və ya Fransanın lisenziyasıyla işləyən oyun bazarında proqramlar göndərə bilər. Android üçün mobil proqramı bukmeyker rəsmi saytından yükləmək yolveriləndir. Android səbəbindən nəzərdə tutulan mobil clienti Play Market və digər tədbiq mağazalarından yükləməyə çalışa bilərsiniz.

Oyunçu depozit ilə birlikdə xoş gəldin bonusun hissəsini alır. Hər bir xoş gəldin bonuslarnın paketinə sahib səbəbdənhesabı 4 dəfə doldurmalısınız. Bonusun ilk hissəsinə sahib olmaq üçün ən azı 10 avro depozit etməlisiniz. Bonusun digər hissələrini qazanmaq səbəbdənminimal 15 avro depozit olunmalıdır. Bununla birlikdə, bonusun növbəti hissəsi təkcə əvvəlki birinin artıq tamamilə oynadıqdan sonra əldə olunar. Pulsuz spinlər üçün həmin panel şərtləri etibarlıdır, ancaq Weiger X45-dir.

bet Azerbaycan İOS  səbəbindən sistem tələbləri

Bonusu almaq səbəbdən minimum 1 avro hesabınıza depozit etməlisiniz. Maksimal bəxşiş məbləği cümə günü alınan bonusu qabaqlaya bilməz. Alınan məbləğin miqdarından 3 dəfə mərc eləmək lazım gələcək. Bonusun oynanılmasının hesabına əmsalı ən azı 1.40-dan yuxar, özündə 3 hadisəni cəmləşdirən mərclər əlavə olunacaqdır. 1xbet app rəsmi tətbiqi və rəsmi veb sayt 50-dən artıq dildə, o cümlədən Azərbaycan, rus, türk və ingilis dillərində mövcuddur.

  • Siyahının istehsalçısı və ya modeli yoxdursa, ancaq smartfon minimal sistem tələblərinə cavab verirsə, onda bu 1xbet app üzərində quraşdırılar.
  • Slotlar  səbəbindən ayrıca 1xbet app tətbiqetmənin yükləməyə ehtiyac yoxdur.
  • Ancaqbahis ekzotik, məsələn, gell futbol və ya it qaçışınabahis əlavə eləyə bilərsiz.
  • Qeyd edərkən, user yeni başlayanlar üçün geniş edilmiş  bəxşiş əldə etməyə imkan verən  təqdimat kodu göstərər.
  • 1xbetdəki ikinci proqram, yükləmək  səbəbindən mövcuddur – 1xaccess.

Bununla birlikdə, tətbiqetməsinin bu ölkədə istifadəsində məhdudiyyət olmasıdır. Ondan keçərkən, AppStore axtarışında 1xbet download daxil edin və cihazı quraşdırın. Mobil client-in yükləməsində regional parametrləri dəyişdirdikdən səhv baş verərsə, onda AppStore-da yeni akkaunt yaratmaq lazım gələcək. Tətbiqetməni quraşdırdıqdan yeni hesabı tərk edib köhnəyə keçə bilərsiz. Tətbiq hesabınızın dəyişməsinə baxmayaraq yeniləmələr alacaq.

bet az tətbiqetməsini yükləyərkən səhv baş verdikdə nə etmək lazımdır

Qorunan məlumatları kəsmək və ya oğurlamaq mümkünsüzdür. 1xbet tətbiqetməsi iOS və Android platformalarıyla mobil cihazdan mərc eləmək səbəbindən tək yol deyil. Oyunçular, tətbiqin oxşar interfeysli mobil versiya var. Ondan əlavə, tətbiq və mobil versiyada sıra vacib fərqlər var.

Bir qayda kimi, yoxlama sorğusu vəsaitin ödənilməsi səbəbindən birinci tətbiqə gəlir. İri qələbə və ya qaydaların pozulması şübhəsi olduqda, 1xbet giriş hesabı yenidən qiymətləndirilməsini tələb olunar. Sekyuriti xidməti video zəng və ya əlavə sənəd tələb olunar. Təkrar yoxlama daha artıq, ümumiyyətlə 2 həftəyədək davam edir. Bukmeker 1xbet az Curacao lisenziyası altında işləyir.

Bet az ilə necə mərc eləmək olar

İOS nəzarətində olan cihazlar səbəbindən aşağıdakı minimal tələblər quraşdırılmışdır. Cihazların öncəki versiyalarında iOS üçün 1xbet azerbaycan tətbiqetməsi problem olmadan başlanılır. 1xbet bukmeykerin tətbiqində neçə vacib xüsusiyyət var. Narahat anlardan, maksimala dərəcələr haqqında məlumatlar fərqlənər.

  • Mobil tətbiqin rəsmi saytın bütöv funksionallığına malikdir.
  • Ən populyar turnirlər üçün, məsələn, Premyer Liqa, Bundesliga, çempionlar Liqası və Dünya Kuboku, Margin 2-4% -dir.
  • 1xbet az tətbiqin tamamlandıqdan sekyuriti parametrlərini orijinal vəziyyətə qaytarmaq tövsiyyə olunur.
  • Şəxsi hesabınızın parametrlərində oyunçu müxtəlif valyutalarda  neçə akkaunt aça bilər.
  • İstifadəçilərin rahatlığı üçün, bukmeykeri əksər matçların yayımlarını keçirir.

Görüşün sonuna yaxın, təkcə nəticəyə, populyar ümumi və handikap-a mərc eləyə bilərsiz. Voleybol və tennis oynununa bənzər bəzi sport növləri səbəbindən Live-dəki mərclərin sayı, 1xbet download yem səbəbindən bahis alır. İstifadəçilərin rahatlığı üçün, bukmeykeri əksər matçların yayımlarını keçirir. Qarşılaşma üçün onlayn yayım yoxdursa, oyunçular matçın nə cür inkişaf etdiyini izləyə biləcəyiniz ətraflı infoqrafikanı təmin edir. Məsələn, futbolda topun dəqiq mövqeyini tarlada izləyə bilərsiniz. 20-dən çox provayderdən cədvəllər Live Casino-da mövcuddur.