/** * 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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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-opacity'] = ''; $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 ); } } /** * Handle backward compatibility for following pointers. * * 1. unit less line-height support. * 2. H5 font size case. * * @since 4.6.14 * @return void */ function astra_theme_background_updater_4_6_14() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['enable-4-6-14-compatibility'] ) ) { $theme_options['enable-4-6-14-compatibility'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for following cases. * * 1. Making edd default option enable by default. * 2. Handle backward compatibility for Heading font size fix. * * @since 4.7.0 * @return void */ function astra_theme_background_updater_4_7_0() { $theme_options = get_option( 'astra-settings', array() ); if ( class_exists( 'Easy_Digital_Downloads' ) && ! isset( $theme_options['can-update-edd-featured-image-default'] ) ) { $theme_options['can-update-edd-featured-image-default'] = false; update_option( 'astra-settings', $theme_options ); } if ( ! isset( $theme_options['heading-widget-font-size'] ) ) { $theme_options['heading-widget-font-size'] = false; update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility for version 4.7.1 * * @since 4.7.1 * @return void */ function astra_theme_background_updater_4_7_1() { $theme_options = get_option( 'astra-settings', array() ); // Setting same background color for above and below transparent headers as on transparent primary header. if ( isset( $theme_options['transparent-header-bg-color-responsive'] ) ) { if ( ! isset( $theme_options['hba-transparent-header-bg-color-responsive'] ) ) { $theme_options['hba-transparent-header-bg-color-responsive'] = $theme_options['transparent-header-bg-color-responsive']; } if ( ! isset( $theme_options['hbb-transparent-header-bg-color-responsive'] ) ) { $theme_options['hbb-transparent-header-bg-color-responsive'] = $theme_options['transparent-header-bg-color-responsive']; } update_option( 'astra-settings', $theme_options ); } } /** * Handle backward compatibility Spectra Heading max-width with Astra when fullwidth layout is selected. * * @since 4.8.0 * @return void */ function astra_theme_background_updater_4_8_0() { $theme_options = get_option( 'astra-settings', array() ); if ( ! isset( $theme_options['enable-4-8-0-compatibility'] ) ) { $theme_options['enable-4-8-0-compatibility'] = false; update_option( 'astra-settings', $theme_options ); } } 7m บ้านผลบอล ผลบอลสด รายงานสดผลบอลสดๆทั่วโลก 7m Livescore -

7m บ้านผลบอล ผลบอลสด รายงานสดผลบอลสดๆทั่วโลก 7m Livescore

ชมซ้ำประตูสุดสวย การเซฟสำคัญ และช่วงเวลาเด็ดๆ จากทุกการแข่งขันผ่านไฮไลท์ HD ของ 7mLivescore.พร้อมให้รับชมทันทีหลังจบเกม ไม่ต้องล็อกอิน ไม่ต้องเสียเวลาหาลิงก์. เกาะติดทรรศนะก่อนแข่งจากกูรูบอลตัวจริง ช่วยประกอบการตัดสินใจก่อนเดิมพัน.มีสถิติประกอบ เช่น การเจอกันล่าสุด และความพร้อมผู้เล่นก่อนลงสนาม. แต่ทั้งนี้ทางสื่อดัง ดิ อินเดเพนเดนท์ ออกมาระบุว่าทาง แมนเชสเตอร์ ซิตี้ นั้นให้ความสนใจกับกรีลิชมากที่สุดเนื่องจาก เป๊ป กวาร์ดิโอล่า…

ผลบอล7m

แม้ในบางช่วงมีผู้ใช้งานหนาแน่น แต่ด้วยเทคโนโลยีใหม่อย่าง 5G และเซิร์ฟเวอร์ที่พัฒนาอย่างต่อเนื่อง ทำให้เมนู 7M ยังคงลื่นไหล โหลดไว และเป็นตำนานที่ 7M-TH ภูมิใจเสนอในฐานะเมนูที่เปิดยุคใหม่ของวงการผลบอลสดไทย. ไม่ว่าจะเป็นลีกใหญ่หรือเล็ก เมนูนี้มีครบในหน้าเดียว และด้วยคำค้นยอดนิยมอย่าง “ผลบอลสด888”, “ผลบอล888”, และ “7m888” เมนูนี้จึงกลายเป็นทางเข้าหลักของแฟนบอลที่ต้องการความครบ เร็ว และแม่นยำที่สุดในแบบฉบับภาษาไทยแท้ ๆ จาก 7M-TH. แม้บางคนจะใช้คำค้นว่า “7m888” เป็นโค้ดลับเพื่อเข้าเว็บผลบอลสด แต่สุดท้ายปลายทางที่ทุกคนไว้ใจก็คือ 7M-TH ซึ่งรวมเมนู 7M 888 ไว้อย่างสมบูรณ์แบบ เป็นแหล่งดูผลบอลที่ ครบ จบ เร็ว และแม่นที่สุดในโลก สำหรับแฟนบอลตัวจริง.

จากฟุตบอลสู่บาสเกตบอล – ครบจบในแพลตฟอร์มเดียว

หัวใจหลักของบริการ 7m คือความรวดเร็วและแม่นยำของข้อมูล ผลบอลสด เราใช้เทคโนโลยีที่ทันสมัยที่สุดเพื่อให้แน่ใจว่าทุกการเปลี่ยนแปลงของสกอร์จะถูกส่งถึงคุณในพริบตา ไม่ว่าจะเป็น ผลบอลสด7m888 ที่ได้รับความนิยมอย่างสูง หรือ 7m ผลบอลสด 888 ซึ่งเป็นอีกหนึ่งช่องทางที่แฟนบอลไว้วางใจ เราเข้าใจดีว่าความแม่นยำของข้อมูลนั้นสำคัญเพียงใด โดยเฉพาะอย่างยิ่งเมื่อมีการเดิมพันหรือการลุ้นผลกันแบบนาทีต่อนาที. เรามีหมวดหมู่การค้นหาที่หลากหลาย เพื่อให้คุณเข้าถึงข้อมูลได้อย่างตรงจุด ไม่ว่าจะเป็น เช็คผลบอลทุกลีก, เช็คผลบอลลิเวอร์พูล, เช็คผลบอลพรีเมียร์ลีกเมื่อคืน, เช็คผลบอลไทยลีก, เช็คผลบอลยูฟ่าแชมป์เปียนลีก หรือแม้แต่ เช็คผลบอล ราคาต่อรอง ก็ทำได้ง่ายดาย คุณไม่ต้องเสียเวลาไปกับการเปิดหลายเว็บไซต์เพื่อหาข้อมูลที่แตกต่างกันอีกต่อไป เพราะ 7M ได้รวบรวมทุกสิ่งที่คุณต้องการไว้ในที่เดียว. แม้ว่าฟุตบอลจะเป็นหัวใจหลักของ 7M แต่เราเข้าใจดีว่าแฟนกีฬามีความสนใจที่หลากหลาย ด้วยเหตุนี้ เราจึงได้ขยายการบริการไปสู่กีฬาประเภทอื่นๆ ด้วย เพื่อให้คุณสามารถติดตามผลการแข่งขันที่สำคัญจากทั่วโลกได้ในที่เดียว. รับการอัปเดตผลบอลสด 7M จากทุกลีกทั่วโลกอย่างแม่นยำและรวดเร็ว ไม่ต้องรีเฟรชหน้าจอ.ติดตามสกอร์บอล 7M ใบแดง ใบเหลือง และสถิติการแข่งขันแบบสดๆ ในที่เดียวที่ Livescore7m. เช็กตารางบอลวันนี้และโปรแกรมบอลล่วงหน้าผ่าน 7mScore ดูเวลาคิกออฟ สนามแข่งขัน และช่องถ่ายทอดสด.วางแผนการชมฟุตบอลของคุณได้อย่างง่ายดดายด้วยตารางที่อัปเดตอย่างรวดเร็วจาก 7m.

  • เช็กสกอร์สดได้ตลอด 24 ชั่วโมง พร้อมแจ้งเตือนเมื่อมีการทำประตูหรือใบแดงในเกม.รายงานข้อมูลละเอียดทั้งครึ่งแรกและเต็มเวลา รองรับทุกลีกดังทั่วโลก.
  • ด้วยประสบการณ์ที่สั่งสมมาอย่างยาวนาน เมนู 7M Thscore ได้ผ่านการพัฒนาและปรับปรุงอย่างต่อเนื่อง จนกลายเป็นหนึ่งในเว็บผลบอลสดที่ได้รับความไว้วางใจมากที่สุดในไทย และติดอันดับต้น ๆ ของ Google ในทุกคีย์เวิร์ดที่เกี่ยวข้องกับ ผลบอลสด, Livescore, สกอร์บอล โดยยังเปิดโอกาสให้เว็บอื่นที่มีอันดับดีสามารถใช้งานร่วมได้ ทำให้ฐานผู้ใช้งานขยายตัวอย่างต่อเนื่อง และเมนูนี้จึงกลายเป็นที่ชื่นชอบและ “เปิดค้างไว้” เป็นหน้าโปรดของแฟนบอลจำนวนมากทั่วประเทศ.
  • การ เช็คผลบอล กับ 7M คือประสบการณ์ที่ง่ายดายและรวดเร็วที่สุดที่คุณจะได้รับ ไม่ว่าคุณจะต้องการ เช็คผลบอลสด, เช็คผลบอลเมื่อคืน, เช็คผลบอลวันนี้, หรือ เช็คผลบอลย้อนหลัง เรามีทุกสิ่งที่คุณต้องการ ด้วยอินเทอร์เฟซที่ใช้งานง่าย คุณสามารถค้นหาผลบอลได้อย่างรวดเร็ว ไม่ว่าจะเป็นคู่ไหน ลีกอะไร หรือวันที่เท่าไหร่.
  • เรามีหมวดหมู่การค้นหาที่หลากหลาย เพื่อให้คุณเข้าถึงข้อมูลได้อย่างตรงจุด ไม่ว่าจะเป็น เช็คผลบอลทุกลีก, เช็คผลบอลลิเวอร์พูล, เช็คผลบอลพรีเมียร์ลีกเมื่อคืน, เช็คผลบอลไทยลีก, เช็คผลบอลยูฟ่าแชมป์เปียนลีก หรือแม้แต่ เช็คผลบอล ราคาต่อรอง ก็ทำได้ง่ายดาย คุณไม่ต้องเสียเวลาไปกับการเปิดหลายเว็บไซต์เพื่อหาข้อมูลที่แตกต่างกันอีกต่อไป เพราะ 7M ได้รวบรวมทุกสิ่งที่คุณต้องการไว้ในที่เดียว.

ในโลกฟุตบอลที่หมุนไปอย่างไม่หยุดนิ่ง การเข้าถึงข้อมูล ผลบอลสด ที่แม่นยำและรวดเร็วเป็นสิ่งสำคัญที่สุด 7M เข้าใจในจุดนี้เป็นอย่างดี เรามุ่งมั่นที่จะเป็นแพลตฟอร์มอันดับหนึ่งที่มอบข้อมูล ผลบอลสด888 และ Livescore 7M ให้กับคุณแบบเรียลไทม์ ทุกประตูที่เกิดขึ้น ทุกเหตุการณ์สำคัญในสนาม จะถูกส่งตรงถึงคุณในทันที ไม่ว่าจะเป็นเสียงแจ้งเตือนสกอร์ที่ดังขึ้นจาก livescore 7m มีเสียง เตือน หรือการอัปเดตสถานการณ์การแข่งขันแบบนาทีต่อนาทีบนหน้าจอของคุณ. ด้วยประสบการณ์ที่สั่งสมมาอย่างยาวนาน เมนู 7M Thscore ได้ผ่านการพัฒนาและปรับปรุงอย่างต่อเนื่อง จนกลายเป็นหนึ่งในเว็บผลบอลสดที่ได้รับความไว้วางใจมากที่สุดในไทย และติดอันดับต้น ๆ ของ Google ในทุกคีย์เวิร์ดที่เกี่ยวข้องกับ ผลบอลสด, Livescore, สกอร์บอล โดยยังเปิดโอกาสให้เว็บอื่นที่มีอันดับดีสามารถใช้งานร่วมได้ ทำให้ฐานผู้ใช้งานขยายตัวอย่างต่อเนื่อง และเมนูนี้จึงกลายเป็นที่ชื่นชอบและ “เปิดค้างไว้” เป็นหน้าโปรดของแฟนบอลจำนวนมากทั่วประเทศ. สำหรับผู้ที่พลาดชมการแข่งขันสด หรือต้องการย้อนดูช็อตเด็ดซ้ำ เมนู ไฮไลท์บอล ของเราคือคำตอบที่ดีที่สุด เราได้รวบรวมคลิปไฮไลท์ฟุตบอลจากทุกลีกทุกคู่ ทั้งการแข่งขันที่เพิ่งจบไปและเกมในอดีต คุณสามารถรับชมประตูสวยๆ, จังหวะสำคัญ, และการเซฟที่น่าทึ่ง ได้อย่างรวดเร็วและสะดวกสบาย ไม่ว่าจะเป็นประตูชัยในช่วงท้ายเกม หรือแอสซิสต์สุดเหนือชั้น ไฮไลท์บอลของเราจะทำให้คุณไม่พลาดทุกช่วงเวลาแห่งความตื่นเต้นที่เกิดขึ้นในสนาม. เราครอบคลุมข้อมูล ผลบอลเมื่อคืน ของทุกลีกทั่วโลก รวมถึงลีกใหญ่ยอดนิยมอย่าง ผลบอล พรีเมียร์ลีก, ผลบอล ลาลีกา, ผลบอล ยูฟ่า (UEFA Champions League), ผลบอล ยูโรป้า (UEFA Europa League) และ ผลบอลไทยลีก นอกจากนี้ คุณยังสามารถค้นหา ผลบอลล่าสุด และ ผลบอล ตารางอันดับบอล เพื่อดูสถานการณ์ปัจจุบันของทีมต่างๆ ในลีกได้อย่างชัดเจน ไม่ว่าจะเป็นการลุ้นแชมป์, การแย่งชิงพื้นที่ฟุตบอลยุโรป หรือการหนีตกชั้น ข้อมูลของเราจะช่วยให้คุณมองเห็นภาพรวมที่ชัดเจน. เรานำเสนอ livescore 7m ภาษาไทย เพื่อให้แฟนบอลชาวไทยได้รับความสะดวกสบายสูงสุดในการเข้าถึงข้อมูล ไม่ต้องกังวลเรื่องภาษาอีกต่อไป คุณสามารถเข้าใจทุกรายละเอียดและสถานการณ์การแข่งขันได้อย่างชัดเจน นอกจากเวอร์ชั่นภาษาไทยแล้ว เรายังมี livescore 7m cn และ 7m.cn live scores 2in1 ซึ่งแสดงถึงความครอบคลุมระดับสากลของเครือข่าย 7M คุณสามารถสลับดูข้อมูลจากแหล่งต่างๆ เพื่อเปรียบเทียบและยืนยันความถูกต้องของข้อมูลได้ตามต้องการ. Livescore 7M ดูบอลสด66 คืออีกหนึ่งบริการที่สร้างความตื่นเต้นและมอบอรรถรสในการติดตามฟุตบอลได้อย่างแท้จริง การมีเสียงแจ้งเตือนเมื่อมีการทำประตู หรือการเปลี่ยนสถานะของเกม ทำให้คุณไม่ต้องจ้องหน้าจออยู่ตลอดเวลา ก็ยังสามารถรับรู้ทุกความเคลื่อนไหวสำคัญได้ทันที นี่คือคุณสมบัติที่ทำให้ livescore 7m มีเสียง เตือน ได้รับความนิยมอย่างมากในหมู่นักลุ้นผลบอล และแฟนบอลที่ติดตามหลายคู่พร้อมกัน.

ผลบอล7m

สรุปแล้ว 7M คือคำตอบที่สมบูรณ์แบบสำหรับแฟนกีฬาทุกคน โดยเฉพาะอย่างยิ่งคอฟุตบอล เราเป็นมากกว่าแค่เว็บไซต์ที่แสดงผลบอลสด แต่เราคือแพลตฟอร์มที่ครอบคลุมทุกความต้องการ ตั้งแต่ ผลบอลสด7m888 ที่รวดเร็ว, บ้านผลบอล7m ที่ครบครัน, livescore 7m มีเสียง เตือน ที่สร้างความตื่นเต้น ไปจนถึง ข่าวบอล และ ไฮไลท์บอล ที่น่าสนใจ เรามุ่งมั่นที่จะนำเสนอข้อมูลที่ถูกต้อง แม่นยำ และอัปเดตตลอดเวลา พร้อมบริการที่เป็นมิตรต่อผู้ใช้งาน ทำให้การติดตามกีฬาเป็นเรื่องง่ายและสนุกสนานยิ่งขึ้นสำหรับทุกคน ไม่ว่าคุณจะต้องการ ดูบอล คู่ไหน เช็คผลบอล หรือต้องการข้อมูลเชิงลึก 7M คือแหล่งข้อมูลที่คุณวางใจได้เสมอ. การดู ผลบอลสด 7m livescore ช่วยให้แฟนบอลได้รับข้อมูลการแข่งขันแบบเรียลไทม์ ทำให้ไม่พลาดทุกเหตุการณ์สำคัญในสนาม นอกจากนี้ 7m ผลบอล ยังมีอินเตอร์เฟซที่ใช้งานง่ายและข้อมูลละเอียดเกี่ยวกับทีมและนักเตะ ทำให้ผู้เล่นสามารถวิเคราะห์และติดตามผลได้อย่างแม่นยำ จึงไม่น่าแปลกใจที่ 7m เป็นตัวเลือกอันดับหนึ่งสำหรับผู้ที่หลงใหลในฟุตบอล. สำหรับคอฟุตบอลตัวยง ไม่ว่าคุณจะเป็นแฟนบอลพันธุ์แท้, เซียนบอลผู้เชี่ยวชาญ, หรือเพียงแค่ผู้ที่ชื่นชอบการติดตามผลการแข่งขันกีฬา เมนูและบริการต่างๆ ของ 7M คือคำตอบที่ครบวงจรสำหรับทุกความต้องการของคุณ เราคือแหล่งรวมข้อมูล ผลบอลสด7m ที่เชื่อถือได้ อัปเดตฉับไว และครอบคลุมทุกคู่ทุกลีกทั่วโลก มอบประสบการณ์การติดตามฟุตบอลที่ไม่เหมือนใคร. เราครอบคลุมทุกการแข่งขันที่คุณสนใจ ตั้งแต่ลีกฟุตบอลชั้นนำของโลกอย่าง พรีเมียร์ลีก อังกฤษ, ลาลีกา สเปน, บุนเดสลีกา เยอรมนี, กัลโช่เซเรียอา อิตาลี และ ลีกเอิง ฝรั่งเศส ไปจนถึงการแข่งขันระดับทวีปอย่าง ผลบอล UCL (UEFA Champions League) และ ผลบอลยูโรป้า (UEFA Europa League) ไม่ว่าคุณจะเชียร์ทีมใหญ่ระดับโลกอย่าง ผลบอลแมนยู หรือ ผลบอลลิเวอร์พูล หรือติดตามความเคลื่อนไหวของฟุตบอลในประเทศอย่าง ผลบอลไทยลีก และ ผลบอลไทย เราก็มีข้อมูลครบครัน เพื่อให้คุณไม่พลาดทุกโมเมนต์สำคัญของเกมลูกหนังที่คุณรัก. สำหรับผู้ที่ต้องการตรวจสอบผลการแข่งขันฟุตบอลย้อนหลัง, วิเคราะห์สถิติ, หรือดูภาพรวมของตารางคะแนน เมนู บ้านผลบอล 7M คือแหล่งข้อมูลที่คุณจะได้รับประโยชน์สูงสุด เราคือศูนย์รวมของ บ้านผลบอล ที่ครบครันที่สุด ไม่ว่าจะเป็น ผลบอลเมื่อคืนนี้ ทุกลีก 7m หรือ ผลบอลย้อนหลัง คุณสามารถค้นหาผลการแข่งขันของทีมโปรดหรือลีกที่คุณสนใจได้อย่างง่ายดาย. สำหรับแฟนบาสเกตบอล เรามี ผลบาสเกตบอลสด 7m ที่ครอบคลุมลีกชั้นนำอย่าง NBA และลีกบาสเกตบอลอื่นๆ ทั่วโลก คุณจะได้รับผลการแข่งขันแบบเรียลไทม์ พร้อมสถิติที่จำเป็น เช่น คะแนนของผู้เล่น, รีบาวด์, แอสซิสต์ และข้อมูลทีม เพื่อให้คุณไม่พลาดทุกความเคลื่อนไหวบนคอร์ตบาสเกตบอล.

สรุป บ้านผลบอล7m ศูนย์รวมข้อมูลฟุตบอลแบบเรียลไทม์

ผลบอล7m

รายงานผลบอลสดๆ จาก 7m โดย 7m-score.com พร้อมข่าวสารวงการฟุตบอล ดูบอล ผลบอล ผลบอลสด ผลบอลพรีเมียร์ลีก ผลบอลยูโร ผลบอลทุกลีก ผลฟุตบอล 7m รายงานผลบอลสด ให้บริการผลฟุตบอลสดทุกลีกทั่วโลก. แฟนบอลรุ่นเก่าหลายคนยังคงยึดติดกับคำว่า “เข้า Nowgoal แล้วมีสกอร์” ซึ่งสะท้อนความเชื่อและความผูกพันระหว่างแฟนบอลกับเมนูนี้อย่างแท้จริง ปัจจุบัน 7M-TH ได้ต่อยอดระบบนี้ให้ทันสมัยขึ้น ภายใต้ชื่อใหม่ที่แฟนบอลคุ้นเคยคือ “7M ผลบอลสด” ที่ยังคงอยู่ในใจคอบอลไทยมาอย่างยาวนาน. ไม่ต้องเสียเวลาหาลิงก์ที่ไหน เรารวมให้ครบในหน้าเดียว สลับช่องได้ตามสัญญาณ.ดูได้ทั้งพรีเมียร์ลีก, ลาลีกา, ไทยลีก และฟุตบอลถ้วยใหญ่ทุกถ้วย. เว็บ 7m bet ufa แทงบอลครบวงจร เดิมพันง่าย อัตราต่อรองดี มีหลากหลายลีกให้เลือกชมและแทง ระบบปลอดภัย ฝากถอนรวดเร็ว รองรับทุกอุปกรณ์ บริการ 24 ชม. เข้าถึงลิงก์ถ่ายทอดสดฟุตบอลที่หลากหลาย เชื่อมโยงโดยตรงกับตารางจาก Livescore7m.ไม่ต้องสมัครสมาชิก ดูได้ทันที ภาพคมชัด รองรับทั้งมือถือ คอมพิวเตอร์ และสมาร์ททีวี. ทาง 7M-TH จึงตั้งชื่อเมนูนี้ว่า “7M ผลบอลสด” เพื่อเป็นเกียรติและการันตีว่า Nowgoal คือเว็บคุณภาพแท้จริงในโลกของผลบอลสด และยังคงอยู่ใน Top 5 ของใจแฟนบอลชาวไทยเสมอ.

ผลบอล7m

ติดตามอันดับทีมโปรดของคุณในตารางคะแนน 7M แบบเรียลไทม์ คะแนน ผลต่างประตู และฟอร์มล่าสุดอัปเดตทันที.ครอบคลุมทั้งพรีเมียร์ลีก, ลาลีกา, กัลโช่เซเรียอา, ไทยลีก และการแข่งขันระดับนานาชาติ. ด้วยความเร็วในการโหลด และฟังก์ชันการใช้งานครบถ้วน ทั้งเสียงแจ้งเตือนและการเรียงผลตามเวลา ทำให้เมนู 7M Thscore ติดอันดับบน Google เกือบทุกคำค้นเกี่ยวกับผลบอลและ Livescore และกลายเป็นเมนูที่ขาดไม่ได้สำหรับคอบอลยุคใหม่ที่ต้องการทั้งความเร็วและความแม่นยำในหน้าเดียว. เรามุ่งมั่นที่จะเป็นศูนย์รวมข้อมูลกีฬาที่ครบวงจรที่สุด เพื่อตอบสนองความต้องการของแฟนกีฬาในทุกประเภท ไม่ว่าคุณจะชื่นชอบฟุตบอล บาสเกตบอล เบสบอล หรือกีฬาอื่นๆ เราจะพัฒนาและขยายการให้บริการอย่างต่อเนื่อง เพื่อให้คุณได้รับข้อมูลที่ถูกต้อง รวดเร็ว และครบถ้วนที่สุดในทุกเวลา. นอกจากนี้ เรายังเป็นพันธมิตรกับแหล่งข้อมูลที่น่าเชื่อถืออื่นๆ เพื่อเสริมความแข็งแกร่งของข้อมูลที่เรานำเสนอ คุณสามารถพบกับ ผลบอลสดthscore ที่เป็นที่รู้จักกันดีในวงการฟุตบอลไทย ซึ่งหมายความว่าคุณจะได้รับข้อมูลที่หลากหลายและตรวจสอบได้จากหลายแหล่งในที่เดียว ทำให้คุณมั่นใจในความถูกต้องของข้อมูลได้ 100% ไม่ว่าจะเป็น ผลบอลสด 7m, 7m ผลบอล, หรือ ผลบอล7m เราคือศูนย์รวมข้อมูลที่คุณสามารถพึ่งพาได้เสมอ. 7mLivescore นำเสนอข้อมูลเชิงลึกเกี่ยวกับฟอร์มทีม สถิติการพบกัน และความพร้อมของผู้เล่นก่อนเริ่มเกมแต่ละนัด.เหมาะสำหรับแฟนบอลที่ต้องการความเข้าใจที่ลึกซึ้ง หรือมุมมองสำหรับการวิเคราะห์บอล 7m.

ดูผลบอลวันนี้จากระบบ 7m-th ครบทุกลีกทั่วโลก

นอกจากนี้ สำหรับแฟนกีฬาเบสบอล เราก็มีข้อมูล ผลเบสบอลสด 7m ที่ครอบคลุมลีก Major League Baseball (MLB) และลีกเบสบอลชั้นนำอื่นๆ ให้คุณติดตามผลการแข่งขัน, ตารางคะแนน, และสถิติของผู้เล่นได้อย่างรวดเร็วและแม่นยำเช่นกัน. และสำหรับผู้ที่ต้องการข้อมูลเชิงลึก เรายังมี 7mscore และ 7m goal ที่ให้รายละเอียดมากกว่าแค่สกอร์ เช่น สถิติการยิงประตู, การครองบอล, จำนวนลูกเตะมุม และข้อมูลอื่นๆ ที่สำคัญสำหรับการวิเคราะห์เกมอย่างมืออาชีพ รวมถึง ผลบอลสด7m พร้อมราคา ที่ช่วยให้นักวิเคราะห์สามารถพิจารณาข้อมูลได้รอบด้านมากยิ่งขึ้น 7m888 จึงเป็นมากกว่าเว็บไซต์ดูผลบอล แต่เป็นเครื่องมือครบวงจรสำหรับแฟนบอลตัวจริง. นอกเหนือจากผลบอลสดและ livescore 7M ยังมุ่งมั่นที่จะเป็นแพลตฟอร์มที่ตอบโจทย์ทุกมิติของคอฟุตบอล เรามีข้อมูล ข่าวบอล ที่อัปเดตตลอดเวลา เพื่อให้คุณไม่พลาดทุกกระแสสำคัญในวงการลูกหนัง ไม่ว่าจะเป็นข่าวการย้ายทีมของนักเตะดัง, รายงานการบาดเจ็บ, บทวิเคราะห์ฟอร์มการเล่นของทีม หรือข่าวลือต่างๆ ที่กำลังเป็นกระแส คุณจะได้รับข้อมูลที่ถูกต้องและรวดเร็ว ทำให้คุณเป็นแฟนบอลที่รู้จริงและทันทุกสถานการณ์ในโลกของฟุตบอล.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top