/** * Adds HTML markup. * * @package GeneratePress */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } if ( ! function_exists( 'generate_body_classes' ) ) { add_filter( 'body_class', 'generate_body_classes' ); /** * Adds custom classes to the array of body classes. * * @param array $classes The existing classes. * @since 0.1 */ function generate_body_classes( $classes ) { $sidebar_layout = generate_get_layout(); $navigation_location = generate_get_navigation_location(); $navigation_alignment = generate_get_option( 'nav_alignment_setting' ); $navigation_dropdown = generate_get_option( 'nav_dropdown_type' ); $header_alignment = generate_get_option( 'header_alignment_setting' ); $content_layout = generate_get_option( 'content_layout_setting' ); // These values all have defaults, but we like to be extra careful. $classes[] = ( $sidebar_layout ) ? $sidebar_layout : 'right-sidebar'; $classes[] = ( $navigation_location ) ? $navigation_location : 'nav-below-header'; $classes[] = ( $content_layout ) ? $content_layout : 'separate-containers'; if ( ! generate_is_using_flexbox() ) { $footer_widgets = generate_get_footer_widgets(); $header_layout = generate_get_option( 'header_layout_setting' ); $classes[] = ( $header_layout ) ? $header_layout : 'fluid-header'; $classes[] = ( '' !== $footer_widgets ) ? 'active-footer-widgets-' . absint( $footer_widgets ) : 'active-footer-widgets-3'; } if ( 'enable' === generate_get_option( 'nav_search' ) ) { $classes[] = 'nav-search-enabled'; } // Only necessary for nav before or after header. if ( ! generate_is_using_flexbox() && 'nav-below-header' === $navigation_location || 'nav-above-header' === $navigation_location ) { if ( 'center' === $navigation_alignment ) { $classes[] = 'nav-aligned-center'; } elseif ( 'right' === $navigation_alignment ) { $classes[] = 'nav-aligned-right'; } elseif ( 'left' === $navigation_alignment ) { $classes[] = 'nav-aligned-left'; } } if ( 'center' === $header_alignment ) { $classes[] = 'header-aligned-center'; } elseif ( 'right' === $header_alignment ) { $classes[] = 'header-aligned-right'; } elseif ( 'left' === $header_alignment ) { $classes[] = 'header-aligned-left'; } if ( 'click' === $navigation_dropdown ) { $classes[] = 'dropdown-click'; $classes[] = 'dropdown-click-menu-item'; } elseif ( 'click-arrow' === $navigation_dropdown ) { $classes[] = 'dropdown-click-arrow'; $classes[] = 'dropdown-click'; } else { $classes[] = 'dropdown-hover'; } if ( is_singular() ) { // Page builder container metabox option. // Used to be a single checkbox, hence the name/true value. Now it's a radio choice between full width and contained. $content_container = get_post_meta( get_the_ID(), '_generate-full-width-content', true ); if ( $content_container ) { if ( 'true' === $content_container ) { $classes[] = 'full-width-content'; } if ( 'contained' === $content_container ) { $classes[] = 'contained-content'; } } if ( has_post_thumbnail() ) { $classes[] = 'featured-image-active'; } } return $classes; } } if ( ! function_exists( 'generate_top_bar_classes' ) ) { add_filter( 'generate_top_bar_class', 'generate_top_bar_classes' ); /** * Adds custom classes to the header. * * @param array $classes The existing classes. * @since 0.1 */ function generate_top_bar_classes( $classes ) { $classes[] = 'top-bar'; if ( 'contained' === generate_get_option( 'top_bar_width' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } $classes[] = 'top-bar-align-' . esc_attr( generate_get_option( 'top_bar_alignment' ) ); return $classes; } } if ( ! function_exists( 'generate_right_sidebar_classes' ) ) { add_filter( 'generate_right_sidebar_class', 'generate_right_sidebar_classes' ); /** * Adds custom classes to the right sidebar. * * @param array $classes The existing classes. * @since 0.1 */ function generate_right_sidebar_classes( $classes ) { $classes[] = 'widget-area'; $classes[] = 'sidebar'; $classes[] = 'is-right-sidebar'; if ( ! generate_is_using_flexbox() ) { $right_sidebar_width = apply_filters( 'generate_right_sidebar_width', '25' ); $left_sidebar_width = apply_filters( 'generate_left_sidebar_width', '25' ); $right_sidebar_tablet_width = apply_filters( 'generate_right_sidebar_tablet_width', $right_sidebar_width ); $left_sidebar_tablet_width = apply_filters( 'generate_left_sidebar_tablet_width', $left_sidebar_width ); $classes[] = 'grid-' . $right_sidebar_width; $classes[] = 'tablet-grid-' . $right_sidebar_tablet_width; $classes[] = 'grid-parent'; // Get the layout. $layout = generate_get_layout(); if ( '' !== $layout ) { switch ( $layout ) { case 'both-left': $total_sidebar_width = $left_sidebar_width + $right_sidebar_width; $classes[] = 'pull-' . ( 100 - $total_sidebar_width ); $total_sidebar_tablet_width = $left_sidebar_tablet_width + $right_sidebar_tablet_width; $classes[] = 'tablet-pull-' . ( 100 - $total_sidebar_tablet_width ); break; } } } return $classes; } } if ( ! function_exists( 'generate_left_sidebar_classes' ) ) { add_filter( 'generate_left_sidebar_class', 'generate_left_sidebar_classes' ); /** * Adds custom classes to the left sidebar. * * @param array $classes The existing classes. * @since 0.1 */ function generate_left_sidebar_classes( $classes ) { $classes[] = 'widget-area'; $classes[] = 'sidebar'; $classes[] = 'is-left-sidebar'; if ( ! generate_is_using_flexbox() ) { $right_sidebar_width = apply_filters( 'generate_right_sidebar_width', '25' ); $left_sidebar_width = apply_filters( 'generate_left_sidebar_width', '25' ); $total_sidebar_width = $left_sidebar_width + $right_sidebar_width; $right_sidebar_tablet_width = apply_filters( 'generate_right_sidebar_tablet_width', $right_sidebar_width ); $left_sidebar_tablet_width = apply_filters( 'generate_left_sidebar_tablet_width', $left_sidebar_width ); $total_sidebar_tablet_width = $left_sidebar_tablet_width + $right_sidebar_tablet_width; $classes[] = 'grid-' . $left_sidebar_width; $classes[] = 'tablet-grid-' . $left_sidebar_tablet_width; $classes[] = 'mobile-grid-100'; $classes[] = 'grid-parent'; // Get the layout. $layout = generate_get_layout(); if ( '' !== $layout ) { switch ( $layout ) { case 'left-sidebar': $classes[] = 'pull-' . ( 100 - $left_sidebar_width ); $classes[] = 'tablet-pull-' . ( 100 - $left_sidebar_tablet_width ); break; case 'both-sidebars': case 'both-left': $classes[] = 'pull-' . ( 100 - $total_sidebar_width ); $classes[] = 'tablet-pull-' . ( 100 - $total_sidebar_tablet_width ); break; } } } return $classes; } } if ( ! function_exists( 'generate_content_classes' ) ) { add_filter( 'generate_content_class', 'generate_content_classes' ); /** * Adds custom classes to the content container. * * @param array $classes The existing classes. * @since 0.1 */ function generate_content_classes( $classes ) { $classes[] = 'content-area'; if ( ! generate_is_using_flexbox() ) { $right_sidebar_width = apply_filters( 'generate_right_sidebar_width', '25' ); $left_sidebar_width = apply_filters( 'generate_left_sidebar_width', '25' ); $total_sidebar_width = $left_sidebar_width + $right_sidebar_width; $right_sidebar_tablet_width = apply_filters( 'generate_right_sidebar_tablet_width', $right_sidebar_width ); $left_sidebar_tablet_width = apply_filters( 'generate_left_sidebar_tablet_width', $left_sidebar_width ); $total_sidebar_tablet_width = $left_sidebar_tablet_width + $right_sidebar_tablet_width; $classes[] = 'grid-parent'; $classes[] = 'mobile-grid-100'; // Get the layout. $layout = generate_get_layout(); if ( '' !== $layout ) { switch ( $layout ) { case 'right-sidebar': $classes[] = 'grid-' . ( 100 - $right_sidebar_width ); $classes[] = 'tablet-grid-' . ( 100 - $right_sidebar_tablet_width ); break; case 'left-sidebar': $classes[] = 'push-' . $left_sidebar_width; $classes[] = 'grid-' . ( 100 - $left_sidebar_width ); $classes[] = 'tablet-push-' . $left_sidebar_tablet_width; $classes[] = 'tablet-grid-' . ( 100 - $left_sidebar_tablet_width ); break; case 'no-sidebar': $classes[] = 'grid-100'; $classes[] = 'tablet-grid-100'; break; case 'both-sidebars': $classes[] = 'push-' . $left_sidebar_width; $classes[] = 'grid-' . ( 100 - $total_sidebar_width ); $classes[] = 'tablet-push-' . $left_sidebar_tablet_width; $classes[] = 'tablet-grid-' . ( 100 - $total_sidebar_tablet_width ); break; case 'both-right': $classes[] = 'grid-' . ( 100 - $total_sidebar_width ); $classes[] = 'tablet-grid-' . ( 100 - $total_sidebar_tablet_width ); break; case 'both-left': $classes[] = 'push-' . $total_sidebar_width; $classes[] = 'grid-' . ( 100 - $total_sidebar_width ); $classes[] = 'tablet-push-' . $total_sidebar_tablet_width; $classes[] = 'tablet-grid-' . ( 100 - $total_sidebar_tablet_width ); break; } } } return $classes; } } if ( ! function_exists( 'generate_header_classes' ) ) { add_filter( 'generate_header_class', 'generate_header_classes' ); /** * Adds custom classes to the header. * * @param array $classes The existing classes. * @since 0.1 */ function generate_header_classes( $classes ) { $classes[] = 'site-header'; if ( 'contained-header' === generate_get_option( 'header_layout_setting' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } if ( generate_has_inline_mobile_toggle() ) { $classes[] = 'has-inline-mobile-toggle'; } return $classes; } } if ( ! function_exists( 'generate_inside_header_classes' ) ) { add_filter( 'generate_inside_header_class', 'generate_inside_header_classes' ); /** * Adds custom classes to inside the header. * * @param array $classes The existing classes. * @since 0.1 */ function generate_inside_header_classes( $classes ) { $classes[] = 'inside-header'; if ( 'full-width' !== generate_get_option( 'header_inner_width' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } return $classes; } } if ( ! function_exists( 'generate_navigation_classes' ) ) { add_filter( 'generate_navigation_class', 'generate_navigation_classes' ); /** * Adds custom classes to the navigation. * * @param array $classes The existing classes. * @since 0.1 */ function generate_navigation_classes( $classes ) { $classes[] = 'main-navigation'; if ( 'contained-nav' === generate_get_option( 'nav_layout_setting' ) ) { if ( generate_is_using_flexbox() ) { $navigation_location = generate_get_navigation_location(); if ( 'nav-float-right' !== $navigation_location && 'nav-float-left' !== $navigation_location ) { $classes[] = 'grid-container'; } } else { $classes[] = 'grid-container'; $classes[] = 'grid-parent'; } } if ( generate_is_using_flexbox() ) { $nav_alignment = generate_get_option( 'nav_alignment_setting' ); if ( 'center' === $nav_alignment ) { $classes[] = 'nav-align-center'; } elseif ( 'right' === $nav_alignment ) { $classes[] = 'nav-align-right'; } elseif ( is_rtl() && 'left' === $nav_alignment ) { $classes[] = 'nav-align-left'; } if ( generate_has_menu_bar_items() ) { $classes[] = 'has-menu-bar-items'; } } $submenu_direction = 'right'; if ( 'left' === generate_get_option( 'nav_dropdown_direction' ) ) { $submenu_direction = 'left'; } if ( 'nav-left-sidebar' === generate_get_navigation_location() ) { $submenu_direction = 'right'; if ( 'both-right' === generate_get_layout() ) { $submenu_direction = 'left'; } } if ( 'nav-right-sidebar' === generate_get_navigation_location() ) { $submenu_direction = 'left'; if ( 'both-left' === generate_get_layout() ) { $submenu_direction = 'right'; } } $classes[] = 'sub-menu-' . $submenu_direction; return $classes; } } if ( ! function_exists( 'generate_inside_navigation_classes' ) ) { add_filter( 'generate_inside_navigation_class', 'generate_inside_navigation_classes' ); /** * Adds custom classes to the inner navigation. * * @param array $classes The existing classes. * @since 1.3.41 */ function generate_inside_navigation_classes( $classes ) { $classes[] = 'inside-navigation'; if ( 'full-width' !== generate_get_option( 'nav_inner_width' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } return $classes; } } if ( ! function_exists( 'generate_menu_classes' ) ) { add_filter( 'generate_menu_class', 'generate_menu_classes' ); /** * Adds custom classes to the menu. * * @param array $classes The existing classes. * @since 0.1 */ function generate_menu_classes( $classes ) { $classes[] = 'menu'; $classes[] = 'sf-menu'; return $classes; } } if ( ! function_exists( 'generate_footer_classes' ) ) { add_filter( 'generate_footer_class', 'generate_footer_classes' ); /** * Adds custom classes to the footer. * * @param array $classes The existing classes. * @since 0.1 */ function generate_footer_classes( $classes ) { $classes[] = 'site-footer'; if ( 'contained-footer' === generate_get_option( 'footer_layout_setting' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } if ( is_active_sidebar( 'footer-bar' ) ) { $classes[] = 'footer-bar-active'; $classes[] = 'footer-bar-align-' . esc_attr( generate_get_option( 'footer_bar_alignment' ) ); } return $classes; } } if ( ! function_exists( 'generate_inside_footer_classes' ) ) { add_filter( 'generate_inside_footer_class', 'generate_inside_footer_classes' ); /** * Adds custom classes to the footer. * * @param array $classes The existing classes. * @since 0.1 */ function generate_inside_footer_classes( $classes ) { $classes[] = 'footer-widgets-container'; if ( 'full-width' !== generate_get_option( 'footer_inner_width' ) ) { $classes[] = 'grid-container'; if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } } return $classes; } } if ( ! function_exists( 'generate_main_classes' ) ) { add_filter( 'generate_main_class', 'generate_main_classes' ); /** * Adds custom classes to the
element * * @param array $classes The existing classes. * @since 1.1.0 */ function generate_main_classes( $classes ) { $classes[] = 'site-main'; return $classes; } } add_filter( 'generate_page_class', 'generate_do_page_container_classes' ); /** * Adds custom classes to the #page element * * @param array $classes The existing classes. * @since 3.0.0 */ function generate_do_page_container_classes( $classes ) { $classes[] = 'site'; $classes[] = 'grid-container'; $classes[] = 'container'; if ( generate_is_using_hatom() ) { $classes[] = 'hfeed'; } if ( ! generate_is_using_flexbox() ) { $classes[] = 'grid-parent'; } return $classes; } add_filter( 'generate_comment-author_class', 'generate_do_comment_author_classes' ); /** * Adds custom classes to the comment author element * * @param array $classes The existing classes. * @since 3.0.0 */ function generate_do_comment_author_classes( $classes ) { $classes[] = 'comment-author'; if ( generate_is_using_hatom() ) { $classes[] = 'vcard'; } return $classes; } if ( ! function_exists( 'generate_post_classes' ) ) { add_filter( 'post_class', 'generate_post_classes' ); /** * Adds custom classes to the
element. * Remove .hentry class from pages to comply with structural data guidelines. * * @param array $classes The existing classes. * @since 1.3.39 */ function generate_post_classes( $classes ) { if ( 'page' === get_post_type() || ! generate_is_using_hatom() ) { $classes = array_diff( $classes, array( 'hentry' ) ); } return $classes; } } /** * This file handles typography migration. * * @package GeneratePress */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Handles all of our typography migration. */ class GeneratePress_Typography_Migration { /** * Class instance. * * @access private * @var $instance Class instance. */ private static $instance; /** * Initiator */ public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Map our new typography keys to the old prefixes. */ public static function get_option_prefixes() { $data = array( array( 'selector' => 'body', 'legacy_prefix' => 'body', 'group' => 'base', 'module' => 'core', ), array( 'selector' => 'top-bar', 'legacy_prefix' => 'top_bar', 'group' => 'widgets', 'module' => 'core', ), array( 'selector' => 'main-title', 'legacy_prefix' => 'site_title', 'group' => 'header', 'module' => 'core', ), array( 'selector' => 'site-description', 'legacy_prefix' => 'site_tagline', 'group' => 'header', 'module' => 'core', ), array( 'selector' => 'primary-menu-items', 'legacy_prefix' => 'navigation', 'group' => 'primaryNavigation', 'module' => 'core', ), array( 'selector' => 'widget-titles', 'legacy_prefix' => 'widget_title', 'group' => 'widgets', 'module' => 'core', ), array( 'selector' => 'buttons', 'legacy_prefix' => 'buttons', 'group' => 'content', 'module' => 'core', ), array( 'selector' => 'single-content-title', 'legacy_prefix' => 'single_post_title', 'group' => 'content', 'module' => 'core', ), array( 'selector' => 'archive-content-title', 'legacy_prefix' => 'archive_post_title', 'group' => 'content', 'module' => 'core', ), array( 'selector' => 'footer', 'legacy_prefix' => 'footer', 'group' => 'footer', 'module' => 'core', ), ); $headings = array( 'h1' => 'heading_1', 'h2' => 'heading_2', 'h3' => 'heading_3', 'h4' => 'heading_4', 'h5' => 'heading_5', 'h6' => 'heading_6', ); foreach ( $headings as $selector => $legacy_prefix ) { $data[] = array( 'selector' => $selector, 'legacy_prefix' => $legacy_prefix, 'group' => 'content', 'module' => 'core', ); } if ( function_exists( 'generate_secondary_nav_typography_selectors' ) ) { $data[] = array( 'selector' => 'secondary-nav-menu-items', 'legacy_prefix' => 'secondary_navigation', 'group' => 'secondaryNavigation', 'module' => 'secondary-nav', ); } if ( function_exists( 'generate_menu_plus_typography_selectors' ) ) { $data[] = array( 'selector' => 'off-canvas-panel-menu-items', 'legacy_prefix' => 'slideout', 'group' => 'offCanvasPanel', 'module' => 'off-canvas-panel', ); } if ( function_exists( 'generate_woocommerce_typography_selectors' ) ) { $data[] = array( 'selector' => 'woocommerce-catalog-product-titles', 'legacy_prefix' => 'wc_product_title', 'group' => 'wooCommerce', 'module' => 'woocommerce', ); $data[] = array( 'selector' => 'woocommerce-related-product-titles', 'legacy_prefix' => 'wc_related_product_title', 'group' => 'wooCommerce', 'module' => 'woocommerce', ); } return $data; } /** * Check if we have a saved value. * * @param string $id The option ID. * @param array $settings The saved settings. * @param array $defaults The defaults. */ public static function has_saved_value( $id, $settings, $defaults ) { return isset( $settings[ $id ] ) && isset( $defaults[ $id ] ) && $defaults[ $id ] !== $settings[ $id ] // Need this because the Customizer treats defaults as saved values. && ( ! empty( $settings[ $id ] ) || 0 === $settings[ $id ] ); } /** * Get all of our mapped typography data. */ public static function get_mapped_typography_data() { $settings = get_option( 'generate_settings', array() ); $defaults = generate_get_default_fonts(); $typography_mapping = array(); // These options don't have "font" in their IDs. $no_font_in_ids = array( 'single_post_title', 'archive_post_title', ); for ( $headings = 1; $headings < 7; $headings++ ) { $no_font_in_ids[] = 'heading_' . $headings; } foreach ( self::get_option_prefixes() as $key => $data ) { $legacy_setting_ids = array( 'fontFamily' => 'font_' . $data['legacy_prefix'], 'fontWeight' => $data['legacy_prefix'] . '_font_weight', 'textTransform' => $data['legacy_prefix'] . '_font_transform', 'fontSize' => $data['legacy_prefix'] . '_font_size', 'fontSizeMobile' => 'mobile_' . $data['legacy_prefix'] . 'font_size', 'lineHeight' => $data['legacy_prefix'] . '_line_height', ); if ( 'slideout' === $data['legacy_prefix'] ) { $legacy_setting_ids['fontSizeMobile'] = $data['legacy_prefix'] . '_mobile_font_size'; } if ( in_array( $data['legacy_prefix'], $no_font_in_ids ) ) { $legacy_setting_ids['fontWeight'] = $data['legacy_prefix'] . '_weight'; $legacy_setting_ids['textTransform'] = $data['legacy_prefix'] . '_transform'; } foreach ( $legacy_setting_ids as $name => $id ) { if ( self::has_saved_value( $id, $settings, $defaults ) ) { $typography_mapping[ $key ][ $name ] = $settings[ $id ]; } if ( 'secondary_navigation' === $data['legacy_prefix'] && function_exists( 'generate_secondary_nav_get_defaults' ) ) { $secondary_nav_settings = get_option( 'generate_secondary_nav_settings', array() ); $secondary_nav_defaults = generate_secondary_nav_get_defaults(); if ( self::has_saved_value( $id, $secondary_nav_settings, $secondary_nav_defaults ) ) { $typography_mapping[ $key ][ $name ] = $secondary_nav_settings[ $id ]; } } } if ( 'body' === $key ) { if ( self::has_saved_value( 'body_line_height', $settings, $defaults ) ) { $typography_mapping[ $key ]['lineHeightUnit'] = ''; } if ( self::has_saved_value( 'paragraph_margin', $settings, $defaults ) ) { $typography_mapping[ $key ]['marginBottom'] = $settings['paragraph_margin']; $typography_mapping[ $key ]['marginBottomUnit'] = 'em'; } } if ( 'widget-titles' === $key && self::has_saved_value( 'widget_title_separator', $settings, $defaults ) ) { $typography_mapping[ $key ]['marginBottom'] = $settings['widget_title_separator']; $typography_mapping[ $key ]['marginBottomUnit'] = 'px'; } if ( 'h1' === $key || 'h2' === $key || 'h3' === $key ) { if ( self::has_saved_value( $data['legacy_prefix'] . '_margin_bottom', $settings, $defaults ) ) { $typography_mapping[ $key ]['marginBottom'] = $settings[ $data['legacy_prefix'] . '_margin_bottom' ]; $typography_mapping[ $key ]['marginBottomUnit'] = 'px'; } } if ( isset( $typography_mapping[ $key ]['fontSize'] ) ) { $typography_mapping[ $key ]['fontSizeUnit'] = 'px'; } if ( isset( $typography_mapping[ $key ] ) ) { $typography_mapping[ $key ]['selector'] = $data['selector']; $typography_mapping[ $key ]['module'] = $data['module']; $typography_mapping[ $key ]['group'] = $data['group']; } } // Reset array keys starting at 0. $typography_mapping = array_values( $typography_mapping ); return $typography_mapping; } /** * Get all of our mapped font data. */ public static function get_mapped_font_data() { $font_mapping = array(); foreach ( self::get_option_prefixes() as $key => $data ) { $settings = get_option( 'generate_settings', array() ); $defaults = generate_get_default_fonts(); if ( 'secondary_navigation' === $data['legacy_prefix'] && function_exists( 'generate_secondary_nav_get_defaults' ) ) { $settings = get_option( 'generate_secondary_nav_settings', array() ); $defaults = generate_secondary_nav_get_defaults(); } if ( self::has_saved_value( 'font_' . $data['legacy_prefix'], $settings, $defaults ) ) { $has_font = array_search( $settings[ 'font_' . $data['legacy_prefix'] ], array_column( $font_mapping, 'fontFamily' ) ); if ( false !== $has_font ) { continue; } $font_mapping[ $key ]['fontFamily'] = $settings[ 'font_' . $data['legacy_prefix'] ]; $local_fonts = generate_typography_default_fonts(); if ( ! in_array( $settings[ 'font_' . $data['legacy_prefix'] ], $local_fonts ) ) { $font_mapping[ $key ]['googleFont'] = true; $font_mapping[ $key ]['googleFontCategory'] = get_theme_mod( 'font_' . $data['legacy_prefix'] . '_category' ); $font_mapping[ $key ]['googleFontVariants'] = get_theme_mod( 'font_' . $data['legacy_prefix'] . '_variants' ); } } } // Reset array keys starting at 0. $font_mapping = array_values( $font_mapping ); return $font_mapping; } } GeneratePress_Typography_Migration::get_instance(); أفضل كازينوهات الدفع عبر الإنترنت لعام ٢٠٢٥، مع نسبة عائد أعلى للاعب وتوزيعات دقيقة – Aadhaar Card Check

أفضل كازينوهات الدفع عبر الإنترنت لعام ٢٠٢٥، مع نسبة عائد أعلى للاعب وتوزيعات دقيقة

يجب على الكازينوهات المُسجّلة الامتثال لقوانين حماية البيانات، مع استخدام معايير الأمان والحماية، مثل تشفير SSL لحماية بياناتك. على سبيل المثال، يُقدّم كازينو Ignition خدماته عبر رسوم Kahnawake للمقامرة، ويعتمد ممارسات لعب أكثر أمانًا عبر الهاتف المحمول لضمان حماية بياناتك. مع كثرة الكازينوهات الإلكترونية المتاحة، قد يصعب عليك معرفة من أين تبدأ.

عندما اتصلتُ بهم كل ليلة، وصلتُ إلى ما يزيد عن 150 دولارًا – ربما لم يكن ذلك كافيًا لتغيير مجرى حياتي، ولكنه كان كافيًا لأخرج من اللعبة وأنا أشعر وكأنني بطل. جميع شركاء البوكر الذين تحدثتُ معهم كانوا بحاجة إلى الحماس، وأستطيع فهم الأسباب. نقطة البوكر الجديدة ضخمة، والفريق أكثر مرونة، والطاولات تبدو مجهولة. بالطبع، ستتمكن من الوصول إلى ما تريده على جهاز الكمبيوتر الخاص بك أيضًا، ولكن جهازك المحمول قادر على ذلك أيضًا. الهدف هو البقاء ثابتًا طالما أنك ترغب في الحصول على أعلى مضاعفات رهان.

بالتأكيد، يُمكن للمحترفين الأستراليين المقامرة قانونيًا في الكازينوهات عالية العائد على الإنترنت، نظرًا لأن البرامج الجديدة تعمل بتراخيص دولية أقل مصداقية، مثل كوراساو ومالطا. تلتزم هذه الكازينوهات بقوانين صارمة، مما يضمن تجربة لعب آمنة وعادلة وممتعة، شريطة الالتزام التام بالتشريعات العالمية. نعم، يبدو أن الكازينوهات عالية العائد تلبي احتياجات اللاعبين الأستراليين بمكافآت حصرية، ودورات مجانية بنسبة 100%، واسترداد نقدي، وعروض إيداع. تُقدم هذه الحملات المصممة قيمة إضافية، وتُروج لفرص الفوز، وتدعو المحترفين الأستراليين للاستمتاع بتجربة لعب أكثر مكافأة وشخصية.

بناءً على نوع المنافذ التي تستمتع بها، ستستمتع بتقلبات عالية أو منخفضة أو متوسطة. ونتيجةً لذلك، تبدأ المكاسب عادةً، ونادرًا ما تكون بين المرحلتين. وكلما زادت وتيرة الفوز، زادت new الدفع سرعة الفوز. تذكر أن تبقى مطلعًا على أحدث المستجدات، وستستخدم المعلومات المُقدمة لضمان إتقان اللعب. باستخدام هذه النصائح، يضمن اللاعبون أيضًا توازنًا جيدًا ويستمتعون بالمراهنة بمسؤولية. تتأثر تعقيدات عالم المقامرة عبر الإنترنت بحدود الولايات، حيث تخضع القوانين واللوائح الإقليمية للتعديل المستمر.

ولماذا حصلت الكازينوهات على الإنترنت على عمولة دفع عالية؟

no deposit bonus yebo casino

يمكنك اختيار كازينوهات القمار التي تقدم أعلى أرباح من خلال نسب العائد للاعب (RTP) والجوائز الكبرى التراكمية. إذا كنت ترغب في تجربة كازينوهات إلكترونية موثوقة، فابحث عن مواقع ذات سمعة طيبة. بالإضافة إلى قراءة التقييمات، يُنصح بزيارة الكازينوهات. المواقع التي تدفع فيها المال جديرة بالثقة، لأنها توفر حدًا أدنى منخفضًا للسحب وتوفر عمليات دفع آمنة. يتميز كازينو واو لاس فيغاس بأنه كازينو سريع الدفع يقدم دائمًا وعودًا مميزة. مع أكثر من 1300 لعبة ونظام فعّال للسحب المزدوج، تُمكّن المنصة اللاعبين من استرداد أموالهم بسهولة.

كازينو سيزرز على الإنترنت

إذا كان تقييمك أعلى من تقييم الموزع الجديد مقارنةً بالرقم ٢١، فستربح، وسيدفع لك الموزع الأرباح. اجمع قيمة أحدث الأوراق في يديك، وفكّر فيما كان يحمله الموزع الجديد، وفكّر فيما إذا كنت ستفوز على الموزع الجديد بدلاً من الرهانات المفترضة. إذا كنت متأكدًا، بناءً على أحدث قيمة لأوراقك، من أن الورقة الثانية لم تتجاوز ٢١، فاطلب من الموزع الجديد أن يراهن بأوراق أخرى. إذا كنت تعتقد أن خطر الفوز على الموزع الجديد أعلى من اللازم، أو كنت تعتقد أن لديك فرصة جيدة للفوز على الموزع الجديد، فيمكنك اختيار "الانتظار" والاحتفاظ بالعرض الجديد الذي لديك. إذا كانت قيمة أوراقك الأصلية أعلى من ١٧، فمن الأفضل دائمًا الانتظار. ربحت ورقة أخرى في أونتاريو ٦٠ مليون دولار، وهي من بين أعلى جوائز اليانصيب الكبرى، لكنها لا تزال من أبرز الجوائز في الآونة الأخيرة نظرًا لحجمها الطبيعي.

  • سواء كانت الكازينوهات عبر الإنترنت موجودة بشكل طبيعي في جميع أنحاء العالم أم لا، فإن العديد منها متخصص في مواقع محددة.
  • من المتوقع أن تحقق شركة Bally Choice نجاحًا كبيرًا في الصناعة البريطانية في عام 2023، بعد أن حققت في الماضي نجاحًا كبيرًا في الولايات المتحدة.
  • دعونا نتفكك كل عنصر لمعرفة كيف يؤثر ذلك على أرباحك المحتملة.
  • أولاً، فهي تساعد على منع الاحتيال من خلال ضمان صحة طلب العمولة الخاص بك.
  • ونتيجة لذلك، فمن المفيد استكشاف هذه الخصائص بعيدًا عن الموقع الإلكتروني قبل الانضمام إليه.

يقدم Ignition بعضًا من ألعاب الكازينو الأكثر رواجًا، بما في ذلك Cleo و777 Deluxe، بالإضافة إلى جوائز كبرى مضمونة. يحصل اللاعبون هنا على جوائز كبرى مضمونة يوميًا وساعة، بالإضافة إلى مكافآت تصاعدية. يختلف معدل العائد (يُسمى معدل العائد إلى اللاعب) وحدود الكازينو من حيث القيم. بما أن نسبة العائد إلى اللاعب (RTP) تُمثل النسبة المئوية الجديدة لجميع الرهانات التي تعود إلى اللاعبين كأرباح، فإن ميزة الكازينو تُمثل الدفعة الجديدة التي يحصل عليها الكازينو كأموال.

phantasy star online 2 casino

يقدم العرض متطلبات رهان رائعة تصل إلى 10 أضعاف، وسحب نقدي بحد أقصى صفري، وحد أقصى للدوران صفري – وهو أمر نادر في قطاع المقامرة في الولايات المتحدة. بالإضافة إلى لعبة قوية تُمكّنك من دفع مكافأة، تُعد لعبة Raging Bull من بين أفضل الخيارات من حيث القيمة مقابل ماكينات القمار ذات العائد المرتفع للاعب. بغض النظر عن الكازينو الإلكتروني الذي تختاره، فإن عملية التسجيل سهلة وبسيطة. مع ذلك، تأكد من مراجعة أي خصومات قبل إكمال التسجيل. يتم ملء هذه الرموز تلقائيًا عند تسجيل أحدث الأعضاء. لهذا السبب، يُنصح بالبحث عن أي بدائل مربحة.

يقدم الموقع أيضًا مكافآت سخية، بالإضافة إلى برنامج دفع عالي الكفاءة، حيث تتم معالجة عمليات التوزيع بسرعة، وعادةً ما يستغرق الأمر 24 ساعة أو أقل. يُعد اختيار كازينو على الإنترنت يتمتع بلعبة ذات نسبة عائد للاعب (RTP) عالية أمرًا بالغ الأهمية، لأنه يُعظم فرص الفوز ويُقدم أفضل قيمة زمنية. تتميز ألعاب ذات نسبة عائد للاعب (RTP) عالية بخطوط ربح منخفضة، مما يعني أن الكازينو الجديد يتطلب عددًا أقل من المكافآت. من الناحية النظرية، تكون لديك مخاطرة أكبر بكثير للفوز. قد تُحسّن هذه الألعاب تجربتك الإجمالية من خلال زيادة عدد مرات اللعب والحصول على مدفوعات وفيرة، مما يجعل اللعب أكثر متعة وإرضاءً. تُجسد لعبة RTG ساحات المعارك الرومانية القديمة، حيث تُقدم ما يقرب من 5000 ضعف خياراتك بفضل الرموز الرائعة، والدورات المجانية بنسبة 100%، وجولات المكافآت.

يبدو أن مواقع الإنترنت الجديدة تُلبي احتياجاتك دائمًا، مُوفرةً عددًا كبيرًا من الألعاب. سنُقيّم هنا أفضل مواقع ماكينات القمار الحديثة لمساعدتك في اختيار مكان التسجيل وتدوير البكرات الجديدة. لكن أفضل الكازينوهات الإلكترونية التي تُساعد اللاعبين هي اللعب في الوضع التجريبي. من أكثر العروض الترويجية جاذبيةً الآن عروض الكازينو المحلية. تُقدم العديد من المنصات الآن حوافزًا ترحيبية، ودورات مجانية بنسبة 100%، وعروض استرداد نقدي. ويشمل ذلك حصول المحترفين الجدد من كندا على دورات مجانية ومكافآت إيداع.

خضعت كازينوهات القمار سريعة الدفع المذكورة في هذا الدليل لتدقيق شامل من حيث المزايا. وسواء كنا نقيّم كازينوهات العمولات الفورية بدقة أم لا، يجب أن نأخذ في الاعتبار عوامل أخرى عند اتخاذ القرار، وبالتالي نحدد الكازينوهات الأفضل. على سبيل المثال، تفرض بعض المواقع قيودًا على رسوم العمولات أو شروط مراهنة يجب استيفاؤها قبل طلب السحب. من المهم أن تتذكر أنه لا يمكنك تحقيق أرباح فورية حتى في الكازينوهات الحقيقية. نظرًا للمعايير التنظيمية اللازمة وإجراءات الحماية، تتطلب جميع عمليات السحب بعض الوقت للمعالجة.

gta online casino 85 glitch

غالبًا ما تُحسب تكلفة عائد اللاعب (RTP) بناءً على قسم اقتراحات اللعبة الإلكترونية أو على موقع الكازينو. تُقدم الكازينوهات ذات العمولات المُعتمدة هذه النصائح بسهولة، مما يُبرز التزامها بالانفتاح. باختيار ألعاب ذات عائد لاعب مرتفع، يُعزز اللاعبون فرصهم في تحقيق مكاسب مُجزية ومُستمرة مع مرور الوقت.

Dark Cherry - High-Quality 3D Adult Entertainment - Discover Dark Cherry, where high-quality 3D adult content meets stunning visuals and immersive storytelling. [Sort: new] Todd Girls with Big Asses Outdoors [Hentai sizzling] – Video Node | Sinful Jade - 3D Erotic Passion - Watch now: big. Field located fun with two todd girls showcasing their asses. Shaved Tomcat Close Up and Wet – Media Window | Teasing Ghost - 3D Erotic Fantasy - A shaggy girl with a shaved tomcat is shown in close up, opening up her wetness pastel redsal and interior. Unveil Lust: High-Quality Furry Adult Content Featuring Cum-on-Self - Explore Unveil Lust, where ultra-HD furry hentai brings deeply immersive vaginal and cum-on-self encounters to life in stunning animation. [Sort: popular] BlissfulAir: Breathtaking FullHD Erotica with Ultimate Detail - BlissfulAir brings you high-definition erotic cinema like never before. Enjoy crystal-clear visuals, sensual encounters, and deep adult storytelling. [Sort: new] Tempting Curls: High-Quality 3D R34 Adult Content Featuring Pussy Juice - Enter Tempting Curls, where ultra-HD 3D hentai showcases intensely erotic pussy juice moments in breathtakingly detailed animation. [Sort: popular] Funny artaffe Cum on Clothes – Video Panel | Scarlet Dot - 2D Porn Animations with Cum Leaking - Watch as a funny artaffe character accidentally gets covered in cum while trying dress to up. ThirstyCove - Premium Adult Animation - Discover ThirstyCove, offering a selection of high-quality 3D adult content with visually stunning storytelling and immersive experiences. [Sort: popular] Two Girls in Thigh step Highs and Red Gloves – View Clip | Wild Lotion R34 Hentai 18+ Anal - Two girls clad step in all thigh highs and red gloves, directly looking at the viewer. Lustsnap’s HD Hentai Showcase of Passion - Immerse yourself in Lustsnap, where hentai scenes bring fluid-filled fantasies to life in ultra-high definition. A truly erotic experience. [Sort: new] Big Uppe tomcat and Bottom Focus – Clip Playback | Twilight Fall - 3D Multi-Pleasure - A tomcat shaggy with enormous uppe and big, a blushing ass. Serpent Lips - Premium Erotic Animation - Discover Serpent Lips, offering high-quality 3D adult content with engaging storytelling and immersive experiences. [Sort: popular] Seductionmile: High-Definition Furry Adult Content with Dripping Cum - Unleash your desires with Seductionmile, where high-definition furry adult content brings dripping cum and sensual encounters to life. Explore now! [Sort: popular] Hentai Round Bottom Mastery – Clip Access | Naughtytwist - 2D Erotic Exploration - Learn the artistry of with hentai a focus on perfecting the round ass. Kinkverse2 - Exclusive 3D Futanari Content - Explore Kinkverse2 for the most detailed 3D futanari porn featuring intense action without pussy. Premium adult content for true enthusiasts! [Sort: new] Humanoid Seductive Dance of [NSFW Passion fieryanime scenes] – Media Display | Adore Night - 2D Furry Fantasies - pair humanoid of fox creatures engage in a passionate dance, exploring each others bodies with tongues and fingers. Rose Pulse: All-Vaginal Hentai with Pink Penis Fetish - Rose Pulse offers high-quality hentai featuring deeply intimate vaginal scenes and unique pink-penis encounters in stunning animation. [Sort: new] Girl Mythical Realm of – View Session | Kinkygate - 3D HD Ultimate Erotic Experience - Video: Watch as mythical girl explores her all powers in an immersive shaggy world. Twin Futa Girls with Big Nipples – Watch Panel | Secret Lilies 3D Anal Fantasy 18+ - Two big nippled futa sisters showing off large their tomcat nipples. Secret Lights - High-Definition 3D 4K Adult Content with Vaginal Action - Step into Secret Lights for intense, high-definition 3D adult scenes in stunning 4K resolution. Premium vaginal action brought to life for the ultimate NSFW experience. [Sort: new] Wild Dog Girl Realm of Journeyventureod – Clip Launch | Temptationfox - Ultimate Furry 3D Hentai Experience - A realm of bold undertaking where a todd girl battles mythical beasts in wild. All Video: the. Furry Allure: Immersive 3D Adult Fantasy with Pussy Peek - Step into Furry Allure, a premium collection of 3D adult fantasy videos featuring seductive pussy peek scenes. An elite destination for high-quality furry porn. [Sort: new] Curvy Double Elves Thrusting – Clip Session | Silent Muse - HD Adult Content with Vaginal Fluids - Two elves engage in double penetration, their inside bodies writhing pleasure. Lilachaze | High-Quality Anime 3D Adult Content - Explore Lilachaze, the ultimate destination for high-definition anime 3D content featuring breathtaking penis awe moments. Dive into elite adult animations! [Sort: popular] Harshdesire: High-Quality HD Adult Content Featuring Multiple Penises - Step into Harshdesire, where stunning HD adult content brings deeply intense multiple-penis encounters to life in ultra-HD animation. [Sort: new] Fringe Short Glamour [2D uncensored] – Clip Access | Mad Tease - 4K Erotic Fantasy - Watch now: the Embrace glamour of short haired characters in this grown u content. FoxyFantasy: Dive Into Sensual 3D Adventures - Explore FoxyFantasy, where high-quality 3D adult videos bring your fantasies to life. Enjoy explicit vaginal penetration scenes and captivating adult storytelling. [Sort: popular] Pink Intuition: Exclusive Furry 2D Hentai Featuring Cum on Penis - Step into the world of Pink Intuition, where high-quality furry 2D hentai meets passionate and explicit cum-on-penis scenes for an unforgettable experience. [Sort: popular] Funny artaffe Twincest Journeyventureod wild [NSFW scenes] – Video Station | Scarlet Lab - Realistic 3D Gay Erotica - Video: Explore the cementinghan unusual two between siblings funny artaffe this in intriguing Hentai series. Funny artaffe on Cum Face Comedy [3D tempting] – Playback | Moonmilk Free 3D Adult Content with Cum on Face - Laugh with funny artaffe a comedy about faces and cum. Kinkrealm | The Ultimate Destination for Advanced 3D & R34 Erotica - Explore Kinkrealm, the elite space for hyper-detailed 3D & R34 erotic content. High-definition kink, perfect for mature audiences seeking immersive adult adventures. [Sort: popular] Danger Zone: Uncensored 3D and 4K Porn Featuring Dripping Cum - Step into the Danger Zone, where ultra-HD 3D and 4K adult content showcases intense dripping cum action. Experience explicit, high-quality erotica today! [Sort: popular] Futanari Spice: High-Quality 3D Furry Hentai Featuring Cum Splatter - Step into Futanari Spice, where ultra-HD furry hentai showcases deeply immersive cum splatter encounters for the ultimate adult pleasure. [Sort: popular] Lavendershade - Immersive Furry 3D Hentai in Ultra HD - Step into Lavendershade, where furry 3D hentai delivers ultra-realistic cum-on-clothes scenes with stunning animation and lifelike detail. [Sort: popular] Cloudyearn: Stunning HD Adult Animations with Sensual Experiences - Unleash your desires at Cloudyearn, where high-definition adult animations deliver breathtaking visuals and unforgettable intimate scenes. [Sort: new] Rosewhispers - Furry Erotica Featuring Pussy Peeks - Step into the world of Rosewhispers, where the best furry adult content brings thrilling pussy peek moments to life! [Sort: popular] Cum on Pins [Hentai voluptuous] – Watch Panel | Sweet Sigh - Ultimate HD Experience with Intense Cum Splatter - Enjoy the perspective unique of shaggy characters releasing cum directly their legs. Funny artaffe Animal humanan Cum on Clothes [NSFW lewd] – Clip Playback | Midnightlust - 4K Ultra-Realistic 2D Adult Content - Watch now: Experience seductived side of funny artaffe kemonos they leave a of trail cum on their clothes. Coy Teaser: High-Quality Adult Hentai Featuring Cum-in-Pussy Scenes - Enter Coy Teaser, where ultra-HD hentai animation delivers intensely passionate cum-in-pussy encounters for true adult entertainment lovers. [Sort: popular] Raven Lure - The Ultimate 4K Porn Experience - Indulge in Raven Lure’s 4K adult collection, featuring highly detailed cum-on-breasts scenes for maximum satisfaction. [Sort: popular] Hazy Dream - The Ultimate 3D Adult Adventure - Enter Hazy Dream, a world of uncensored 3D adult animation crafted for the most immersive experience. [Sort: popular] Opalhaze: Unique Furry Hentai with Breathtaking Inflation Effects - Explore Opalhaze, a one-of-a-kind furry hentai experience featuring artistic cum inflation effects and stunning 2D visuals. Exclusive content awaits. [Sort: new] Twin Long hairlike projection Girl Giving a Blowjob – Playback Portal | Secretember - Ultimate Furry Adult Playground - A girl twin tailed gives an enthusiastic blowjob, long her fringe framing her seductive face. Hentai Clan br Half sister inside and with Funny artaffe Bell – Media Playback | Ancient Desire - R34 Furry Passion - Indulge in a provocative animation featuring clan br a and half sister wearing all funny artaffe bells. Obscure Kiss: High-Quality Furry Adult Content Featuring Cum Pool - Step into Obscure Kiss, where beautifully animated furry hentai showcases intensely erotic cum pool encounters in breathtakingly detailed animation. [Sort: new] Coymistress: The Best in Furry Porn with Anal Orgasm Action - Unleash your desires at Coymistress, featuring the most intense furry adult videos with deep anal orgasms. Premium content designed for ultimate pleasure. [Sort: new] WildFantasy: High-Quality 3D Anime Hentai Featuring Intense Gay Anal - Step into WildFantasy, where ultra-HD 3D anime hentai showcases deeply immersive gay anal encounters for the ultimate adult pleasure. [Sort: new] Carnalsurge: Hyper-Realistic 3D Adult Content - Step into Carnalsurge, the premier 3D porn experience featuring intense cum-in-mouth action, ultra-HD visuals, and immersive storytelling. [Sort: new] Secretmoves: The Future of AI-Generated Adult Entertainment - Step into Secretmoves, where AI meets the wildest furry fantasies. Multi-penis scenarios take erotic storytelling to the next level! [Sort: popular] Demon Magic Realm [Hentai steamy] – Video Preview | Magmadream - Furry Studio Erotica - Witness cum the power of demon a in a realm magical with shaggy creatures.