/** * Plugin Name: Elementor * Description: The Elementor Website Builder has it all: drag and drop page builder, pixel perfect design, mobile responsive editing, and more. Get started now! * Plugin URI: https://elementor.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash * Author: Elementor.com * Version: 3.20.1 * Author URI: https://elementor.com/?utm_source=wp-plugins&utm_campaign=author-uri&utm_medium=wp-dash * * Text Domain: elementor * * @package Elementor * @category Core * * Elementor is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * Elementor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } define( 'ELEMENTOR_VERSION', '3.20.1' ); define( 'ELEMENTOR__FILE__', __FILE__ ); define( 'ELEMENTOR_PLUGIN_BASE', plugin_basename( ELEMENTOR__FILE__ ) ); define( 'ELEMENTOR_PATH', plugin_dir_path( ELEMENTOR__FILE__ ) ); if ( defined( 'ELEMENTOR_TESTS' ) && ELEMENTOR_TESTS ) { define( 'ELEMENTOR_URL', 'file://' . ELEMENTOR_PATH ); } else { define( 'ELEMENTOR_URL', plugins_url( '/', ELEMENTOR__FILE__ ) ); } define( 'ELEMENTOR_MODULES_PATH', plugin_dir_path( ELEMENTOR__FILE__ ) . '/modules' ); define( 'ELEMENTOR_ASSETS_PATH', ELEMENTOR_PATH . 'assets/' ); define( 'ELEMENTOR_ASSETS_URL', ELEMENTOR_URL . 'assets/' ); add_action( 'plugins_loaded', 'elementor_load_plugin_textdomain' ); if ( ! version_compare( PHP_VERSION, '7.4', '>=' ) ) { add_action( 'admin_notices', 'elementor_fail_php_version' ); } elseif ( ! version_compare( get_bloginfo( 'version' ), '6.0', '>=' ) ) { add_action( 'admin_notices', 'elementor_fail_wp_version' ); } else { require ELEMENTOR_PATH . 'includes/plugin.php'; } /** * Load Elementor textdomain. * * Load gettext translate for Elementor text domain. * * @since 1.0.0 * * @return void */ function elementor_load_plugin_textdomain() { load_plugin_textdomain( 'elementor' ); } /** * Elementor admin notice for minimum PHP version. * * Warning when the site doesn't have the minimum required PHP version. * * @since 1.0.0 * * @return void */ function elementor_fail_php_version() { $message = sprintf( /* translators: 1: `

` opening tag, 2: `

` closing tag, 3: PHP version. 4: Link opening tag, 5: Link closing tag. */ esc_html__( '%1$sElementor isn’t running because PHP is outdated.%2$s Update to PHP version %3$s and get back to creating! %4$sShow me how%5$s', 'elementor' ), '

', '

', '7.4', '', '' ); $html_message = sprintf( '
%s
', wpautop( $message ) ); echo wp_kses_post( $html_message ); } /** * Elementor admin notice for minimum WordPress version. * * Warning when the site doesn't have the minimum required WordPress version. * * @since 1.5.0 * * @return void */ function elementor_fail_wp_version() { $message = sprintf( /* translators: 1: `

` opening tag, 2: `

` closing tag, 3: WP version. 4: Link opening tag, 5: Link closing tag. */ esc_html__( '%1$sElementor isn’t running because WordPress is outdated.%2$s Update to version %3$s and get back to creating! %4$sShow me how%5$s', 'elementor' ), '

', '

', '6.0', '', '' ); $html_message = sprintf( '
%s
', wpautop( $message ) ); echo wp_kses_post( $html_message ); }/** * Exit if accessed directly. */ if ( ! defined( 'ABSPATH' ) ) { exit; } #[AllowDynamicProperties] class Wpzoom_Instagram_Widget_API { /** * @var Wpzoom_Instagram_Widget_API The reference to *Singleton* instance of this class */ private static $instance; /** * Request headers. * * @var array */ public $headers = array(); /** * Errors collector. * * @var array|WP_Error */ public $errors = array(); /** * Instagram Settings * * @var array */ public $settings; /** * Instagram Access Token * * @var string */ protected $access_token; /** * Feed ID * * @var string */ protected $feed_id; /** * Class constructor */ protected function __construct() { $this->is_forced_timeout = (bool) WPZOOM_Instagram_Widget_Settings::get_feed_setting_value( get_the_ID(), 'enable-request-timeout' ); $this->request_timeout_value = 15; if ( $this->is_forced_timeout && ! empty( $this->request_timeout_value ) ) { $this->headers['timeout'] = $this->request_timeout_value; } $this->image_uploader = WPZOOM_Instagram_Image_Uploader::getInstance(); $this->errors = new WP_Error(); } public function init() { add_action( 'init', array( $this, 'set_schedule' ) ); add_action( 'wpzoom_instagram_widget_cron_hook', array( $this, 'execute_cron' ) ); add_filter( 'cron_schedules', array( $this, 'add_cron_interval' ) ); } /** * Returns the *Singleton* instance of this class. * * @return Wpzoom_Instagram_Widget_API The *Singleton* instance. */ public static function getInstance() { if ( null === self::$instance ) { self::$instance = new self(); self::$instance->init(); } return self::$instance; } /** * Manually set the access token. * * @since 2.0.0 * * @param string $token The access token to set. * @return void */ public function set_access_token( $token ) { $this->access_token = $token; } /** * Manually set the access token. * * @since 2.0.0 * * @param string $token The access token to set. * @return void */ public function set_feed_id( $id ) { $this->feed_id = $id; } /** * Fetches a remote URL either safely or not, depending on a setting. * * @since 2.0.6 * * @param string $url URL to retrieve. * @param array $args Optional. Request arguments. Default empty array. * @return array|WP_Error The response or WP_Error on failure. */ public static function remote_get( $url, $args = array() ) { $settings = get_option( 'wpzoom-instagram-general-settings' ); $enable_unsafe_requests = ! empty( $settings['enable-unsafe-requests'] ) ? wp_validate_boolean( $settings['enable-unsafe-requests'] ) : false; return $enable_unsafe_requests ? wp_remote_get( $url, $args ) : wp_safe_remote_get( $url, $args ); } /** * Register custom cron intervals * * @since 1.8.0 * * @param array $schedules Registered schedules array. * @return array */ public function add_cron_interval( $schedules ) { $schedules['before_access_token_expires'] = array( 'interval' => 5097600, // 59 days. 'display' => esc_attr__( 'Before Access Token Expires', 'instagram-widget-by-wpzoom' ), ); return $schedules; } /** * Register schedule event * * @return void */ public function set_schedule() { if ( ! wp_next_scheduled( 'wpzoom_instagram_widget_cron_hook' ) ) { wp_schedule_event( time(), 'before_access_token_expires', 'wpzoom_instagram_widget_cron_hook' ); } } /** * Execute cron event * * @return boolean */ public function execute_cron() { $all_users = get_posts( array( 'numberposts' => -1, 'post_type' => 'wpz-insta_user', ) ); if ( ! empty( $all_users ) && is_array( $all_users ) ) { foreach ( $all_users as $user ) { if ( $user instanceof WP_Post ) { $user_name = get_the_title( $user ); $user_display = sprintf( '@%s', $user_name ); $token = get_post_meta( $user->ID, '_wpz-insta_token', true ); if ( false !== $token && ! empty( $token ) ) { $request_url = add_query_arg( array( 'grant_type' => 'ig_refresh_token', 'access_token' => $token, ), 'https://graph.instagram.com/refresh_access_token' ); $response = self::remote_get( $request_url, $this->headers ); $response_code = wp_remote_retrieve_response_code( $response ); if ( ! is_wp_error( $response ) ) { $body = wp_remote_retrieve_body( $response ); $data = json_decode( $body ); } if ( 200 === $response_code ) { $date_format = get_option( 'date_format' ); $time_format = get_option( 'time_format' ); $notice_status = 'success'; $notice_message = sprintf( __( 'WPZOOM Instagram Widget: The Instagram Access Token was refreshed automatically on %1$s at %2$s for the account %3$s.', 'instagram-widget-by-wpzoom' ), date( $date_format ), date( $time_format ), esc_html( $user_display ) ); update_post_meta( $user->ID, '_wpz-insta_token', $data->access_token ); update_post_meta( $user->ID, '_wpz-insta_token_expire', strtotime( '+60 days' ) ); } else { if ( ! isset( $data->error ) ) { error_log( __( 'Something wrong! Doesn\'t isset $data->error.', 'instagram-widget-by-wpzoom' ) ); return false; } else { error_log( $data->error->error_user_msg ); } $notice_status = 'error'; $notice_message = ''; $settings_url = admin_url( 'edit.php?post_type=wpz-insta_user' ); if ( 190 === $data->error->code ) { // Error validating access token: Session has expired. $notice_message = wp_kses_post( __( 'WPZOOM Instagram Widget: ', 'instagram-widget-by-wpzoom' ) ) . $data->error->message; } elseif ( 10 === $data->error->code && ! self::is_access_token_valid( $token ) ) { // Application does not have permission for this action. // User need to generate new Access Token manually. $notice_message = sprintf( __( 'WPZOOM Instagram Widget: The Access Token for the account %1$s has expired!
', 'instagram-widget-by-wpzoom' ), $user_display ); $notice_message .= sprintf( __( 'We cannot update access tokens automatically for Instagram private accounts. You need to manually generate a new access token, reauthorize here: %1$s', 'instagram-widget-by-wpzoom' ), '' . __( 'Instagram Widget Settings', 'instagram-widget-by-wpzoom' ) . '' ); } } update_option( '_wpz-insta_cron-result', array( $user->ID => array( 'status' => $notice_status, 'message' => $notice_message ) ) + (array) get_option( '_wpz-insta_cron-result', array() ) ); } } } } } public static function reset_cache( $sanitized_data ) { delete_transient( 'zoom_instagram_is_configured' ); delete_transient( 'zoom_instagram_user_info' ); // Remove schedule hook `wpzoom_instagram_widget_cron_hook`. if ( empty( $sanitized_data['basic-access-token'] ) ) { wp_clear_scheduled_hook( 'wpzoom_instagram_widget_cron_hook' ); } } /** * @param $screen_name string Instagram username * @param $image_limit int Number of images to retrieve * @param $image_width int Desired image width to retrieve * * @return array|bool Array of tweets or false if method fails */ public function get_items( $instance ) { $sliced = wp_array_slice_assoc( $instance, array( 'image-limit', 'image-width', 'image-resolution', 'username', 'disable-video-thumbs', 'include-pagination', 'bypass-transient', ) ); $image_limit = $sliced['image-limit']; $image_width = $sliced['image-width']; $image_resolution = ! empty( $sliced['image-resolution'] ) ? $sliced['image-resolution'] : 'low_resolution'; $injected_username = ! empty( $sliced['username'] ) ? $sliced['username'] : ''; $disable_video_thumbs = ! empty( $sliced['disable-video-thumbs'] ); $include_pagination = ! empty( $sliced['include-pagination'] ); $bypass_transient = ! empty( $sliced['bypass-transient'] ); if( isset( $instance['widget-id'] ) ) { $transient = 'zoom_instagram_is_configured_' . $instance['widget-id']; } else { $transient = 'zoom_instagram_is_configured'; } if ( ! empty( $this->access_token ) ) { $transient = $transient . '_' . substr( $this->access_token, 0, 20 ); } $injected_username = trim( $injected_username ); if ( ! $bypass_transient ) { $data = json_decode( get_transient( $transient ) ); if ( false !== $data && is_object( $data ) && ! empty( $data->data ) ) { return self::processing_response_data( $data, $image_width, $image_resolution, $image_limit, $disable_video_thumbs, $include_pagination ); } } if ( ! empty( $this->access_token ) ) { $request_url = add_query_arg( array( 'fields' => 'media_url,media_type,caption,username,permalink,thumbnail_url,timestamp,children{media_url,media_type,thumbnail_url}', 'access_token' => $this->access_token, 'limit' => $image_limit, ), 'https://graph.instagram.com/me/media' ); $response = self::remote_get( $request_url, $this->headers ); if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) { if ( ! $bypass_transient ) { set_transient( $transient, wp_json_encode( false ), MINUTE_IN_SECONDS ); } $error_data = $this->get_error( 'items-with-token-invalid-response' ); $this->errors->add( $error_data['code'], $error_data['message'] ); return false; } $raw_data = json_decode( wp_remote_retrieve_body( $response ) ); $data = self::convert_items_to_old_structure( $raw_data, $bypass_transient ); if ( $include_pagination && property_exists( $raw_data, 'paging' ) ) { $data->paging = $raw_data->paging; } } if ( ! empty( $data->data ) ) { if ( ! $bypass_transient ) { set_transient( $transient, wp_json_encode( $data ), $this->get_transient_lifetime( $this->feed_id ) ); } } else { if ( ! $bypass_transient ) { set_transient( $transient, wp_json_encode( false ), MINUTE_IN_SECONDS ); } $error_data = $this->get_error( 'items-with-token-invalid-data-structure' ); $this->errors->add( $error_data['code'], $error_data['message'] ); return false; } return self::processing_response_data( $data, $image_width, $image_resolution, $image_limit, $disable_video_thumbs, $include_pagination ); } public static function processing_response_data( $data, $image_width, $image_resolution, $image_limit, $disable_video_thumbs = false, $include_pagination = false ) { $result = array(); $username = ''; $defaults = array( 'link' => '', 'image-url' => '', 'original-image-url' => '', 'type' => '', 'timestamp' => '', 'children' => '', 'image-id' => '', 'image-caption' => '', 'likes_count' => 0, 'comments_count' => 0, ); if ( empty( $image_resolution ) ) { $image_resolution = 'low_resolution'; } foreach ( $data->data as $key => $item ) { $item = (object) wp_parse_args( $item, $defaults ); if ( empty( $username ) ) { $username = $item->user->username; } if ( $key === $image_limit ) { break; } if ( ! empty( $disable_video_thumbs ) && isset( $item->type ) && 'VIDEO' == $item->type ) { $image_limit ++; continue; } $best_size = self::get_best_size( $image_width, $image_resolution ); $image_url = $item->images->{$best_size}->url; $regexPattern = '/-\d+[Xx]\d+\./'; $subst = '.'; $local_image_url = preg_replace( $regexPattern, $subst, $image_url, 1 ); $result[] = array( 'link' => $item->link, 'image-url' => $image_url, 'local-image-url' => $local_image_url, 'original-image-url' => property_exists( $item, 'media_url' ) && ! empty( $item->media_url ) ? $item->media_url : '', 'type' => $item->type, 'timestamp' => property_exists( $item, 'timestamp' ) && ! empty( $item->timestamp ) ? $item->timestamp : '', 'children' => property_exists( $item, 'children' ) && ! empty( $item->children ) ? $item->children : '', 'image-id' => ! empty( $item->id ) ? esc_attr( $item->id ) : '', 'image-caption' => ! empty( $item->caption->text ) ? esc_attr( $item->caption->text ) : '', 'likes_count' => ! empty( $item->likes->count ) ? esc_attr( $item->likes->count ) : 0, 'comments_count' => ! empty( $item->comments->count ) ? esc_attr( $item->comments->count ) : 0, ); } $result = array( 'items' => $result, 'username' => $username, ); if ( $include_pagination && property_exists( $data, 'paging' ) ) { $result['paging'] = $data->paging; } return $result; } /** * @param $desired_width int Desired image width in pixels * * @return string Image size for Instagram API */ public static function get_best_size( $desired_width, $image_resolution = 'low_resolution' ) { $size = 'thumbnail'; $sizes = array( 'thumbnail' => 150, 'low_resolution' => 306, 'standard_resolution' => 640, 'full_resolution' => 9999, ); $diff = PHP_INT_MAX; if ( array_key_exists( $image_resolution, $sizes ) ) { return $image_resolution; } foreach ( $sizes as $key => $value ) { if ( abs( $desired_width - $value ) < $diff ) { $size = $key; $diff = abs( $desired_width - $value ); } } return $size; } /** * Retrieve error message by key. * * @param $key * * @return bool|mixed */ public function get_error( $key ) { $errors = $this->get_errors(); return array_key_exists( $key, $errors ) ? $errors[ $key ] : false; } /** * Get error messages collection. * * @return array */ public function get_errors() { return array( 'user-info-without-token' => array( 'code' => 'user-info-without-token', 'message' => esc_html__( 'Empty json user info from Public Feed.', 'instagram-widget-by-wpzoom' ), ), 'response-data-without-token-from-json-invalid-response' => array( 'code' => 'response-data-without-token-from-json-invalid-response', 'message' => esc_html__( 'The request from the Public Feed failed. Invalid server response from Public JSON API url.', 'instagram-widget-by-wpzoom' ), ), 'response-data-without-token-from-json-invalid-json-format' => array( 'code' => 'response-data-without-token-from-json-invalid-json-format', 'message' => esc_html__( 'The request from the Public Feed failed. Invalid JSON format from Public JSON API url.', 'instagram-widget-by-wpzoom' ), ), 'response-data-without-token-from-html-invalid-response' => array( 'code' => 'response-data-without-token-from-html-invalid-response', 'message' => esc_html__( 'The request from the Public Feed failed. Check username.', 'instagram-widget-by-wpzoom' ), ), 'response-data-without-token-from-html-invalid-json-format' => array( 'code' => 'response-data-without-token-from-html-invalid-json-format', 'message' => esc_html__( 'The request from the Public Feed failed. Invalid JSON format from parsed html body.', 'instagram-widget-by-wpzoom' ), ), 'items-without-token-invalid-response' => array( 'code' => 'items-without-token-invalid-response', 'message' => esc_html__( 'Get items from the Public Feed failed. Invalid response.', 'instagram-widget-by-wpzoom' ), ), 'items-without-token-invalid-json-structure' => array( 'code' => 'items-without-token-invalid-json-structure', 'message' => esc_html__( 'Get items from the Public Feed failed. Malformed data structure.', 'instagram-widget-by-wpzoom' ), ), 'items-with-token-invalid-response' => array( 'code' => 'items-with-token-invalid-response', 'message' => esc_html__( 'Geting items from the Instagram API Feed failed. Invalid response.', 'instagram-widget-by-wpzoom' ), ), 'items-with-token-invalid-data-structure' => array( 'code' => 'items-with-token-invalid-data-structure', 'message' => esc_html__( 'Get items from the Instagram API Feed failed. Malformed data structure.', 'instagram-widget-by-wpzoom' ), ), 'user-with-token-invalid-response' => array( 'code' => 'user-with-token-invalid-response', 'message' => esc_html__( 'Get user data from the Instagram API Feed failed. Invalid response.', 'instagram-widget-by-wpzoom' ), ), 'user-with-token-invalid-data-structure' => array( 'code' => 'user-with-token-invalid-data-structure', 'message' => esc_html__( 'Get user data from the Instagram API Feed failed. Malformed data structure.', 'instagram-widget-by-wpzoom' ), ), ); } public static function convert_items_to_old_structure( $data, $preview = false ) { $converted = new stdClass(); $converted->data = array(); $image_uploader = WPZOOM_Instagram_Image_Uploader::getInstance(); foreach ( $data->data as $key => $item ) { $is_video = property_exists( $item, 'media_type' ) && 'VIDEO' === $item->media_type; $media_url = $is_video && property_exists( $item, 'thumbnail_url' ) && ! empty( $item->thumbnail_url ) ? $item->thumbnail_url : $item->media_url; $converted->data[] = (object) array( 'id' => $item->id, 'media_url' => ( $is_video ? $item->media_url : $media_url ), 'user' => (object) array( 'id' => null, 'fullname' => null, 'profile_picture' => null, 'username' => $item->username, ), 'images' => (object) array( 'thumbnail' => (object) array( 'url' => $preview ? $media_url : $image_uploader->get_image( 'thumbnail', $media_url, $item->id ), 'width' => 150, 'height' => 150, ), 'low_resolution' => (object) array( 'url' => $preview ? $media_url : $image_uploader->get_image( 'low_resolution', $media_url, $item->id ), 'width' => 320, 'height' => 320, ), 'standard_resolution' => (object) array( 'url' => $preview ? $media_url : $image_uploader->get_image( 'standard_resolution', $media_url, $item->id ), 'width' => 640, 'height' => 640, ), 'full_resolution' => (object) array( 'url' => $preview ? $media_url : $image_uploader->get_image( 'full_resolution', $media_url, $item->id ), 'width' => 9999, 'height' => 9999, ), ), 'type' => $item->media_type, 'likes' => null, 'comments' => null, 'created_time' => null, 'timestamp' => $item->timestamp, 'children' => ( isset( $item->children ) ? $item->children : null ), 'link' => $item->permalink, 'caption' => (object) array( 'text' => isset( $item->caption ) ? $item->caption : '', ), ); } return $converted; } function get_transient_lifetime( $id ) { $feed_id = isset( $id ) ? $id : 0; $interval = (int) WPZOOM_Instagram_Widget_Settings::get_feed_setting_value( $feed_id, 'check-new-posts-interval-number' ); $interval_suffix = (int) WPZOOM_Instagram_Widget_Settings::get_feed_setting_value( $feed_id, 'check-new-posts-interval-suffix' ); $values = array( MINUTE_IN_SECONDS, HOUR_IN_SECONDS, DAY_IN_SECONDS, WEEK_IN_SECONDS, MONTH_IN_SECONDS, ); $keys = array_keys( $values ); $type = in_array( $interval_suffix, $keys ) ? $values[ $interval_suffix ] : $values[2]; return intval( $type * $interval ) ; } public function get_user_info( $injected_username = '' ) { $transient = 'zoom_instagram_user_info'; $injected_username = rtrim( $injected_username ); if ( false !== ( $data = json_decode( get_transient( $transient ) ) ) && is_object( $data ) && ! empty( $data->data ) ) { return $data; } if ( ! empty( $this->access_token ) ) { $request_url = add_query_arg( array( 'access_token' => $this->access_token, 'fields' => 'account_type,id,media_count,username', ), 'https://graph.instagram.com/me' ); $response = self::remote_get( $request_url, $this->headers ); if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) { set_transient( $transient, wp_json_encode( false ), MINUTE_IN_SECONDS ); $error_data = $this->get_error( 'user-with-token-invalid-response' ); $this->errors->add( $error_data['code'], $error_data['message'] ); return false; } $data = json_decode( wp_remote_retrieve_body( $response ) ); $data = $this->convert_user_info_to_old_structure( $data ); } if ( ! empty( $data->data ) ) { set_transient( $transient, wp_json_encode( $data ), $this->get_transient_lifetime( $this->feed_id ) ); } else { set_transient( $transient, wp_json_encode( false ), MINUTE_IN_SECONDS ); $error_data = $this->get_error( 'user-with-token-invalid-data-structure' ); $this->errors->add( $error_data['code'], $error_data['message'] ); return false; } return $data; } public static function get_basic_user_info_from_token( $access_token ) { $output = false; if ( ! empty( $access_token ) ) { $request_url = add_query_arg( array( 'access_token' => $access_token, 'fields' => 'account_type,username', ), 'https://graph.instagram.com/me' ); $response = self::remote_get( $request_url ); if ( ! is_wp_error( $response ) && 200 == wp_remote_retrieve_response_code( $response ) ) { $output = json_decode( wp_remote_retrieve_body( $response ) ); } } return $output; } function convert_user_info_to_old_structure( $user_info ) { $converted = new stdClass(); $user_info_from_settings = WPZOOM_Instagram_Widget_Settings::get_instance()->get_settings(); $avatar = property_exists( $user_info, 'profile_picture' ) ? $user_info->profile_picture : null; if ( ! empty( $user_info_from_settings['user-info-avatar'] ) ) { $img_src = wp_get_attachment_image_src( $user_info_from_settings['user-info-avatar'] ); if ( ! empty( $img_src ) && is_array( $img_src ) ) { $avatar = $img_src[0]; } } $fullname = ! empty( $user_info->username ) ? $user_info->username : null; if ( ! empty( $user_info_from_settings['user-info-fullname'] ) ) { $fullname = $user_info_from_settings['user-info-fullname']; } $converted->data = (object) array( 'bio' => ! empty( $user_info_from_settings['user-info-biography'] ) ? $user_info_from_settings['user-info-biography'] : null, 'counts' => (object) array( 'followed_by' => null, 'follows' => null, 'media' => null, ), 'full_name' => $fullname, 'id' => ! empty( $user_info->id ) ? $user_info->id : '', 'is_business' => null, 'profile_picture' => $avatar, 'username' => ! empty( $user_info->username ) ? $user_info->username : '', 'website' => null, ); return $converted; } public function is_configured() { $transient = 'zoom_instagram_is_configured'; if ( false !== ( $result = json_decode( get_transient( $transient ) ) ) ) { if ( 'yes' === $result ) { return true; } if ( 'no' === $result ) { return false; } if ( ! empty( $result ) ) { return true; } } $condition = $this->is_access_token_valid( $this->access_token ); if ( true === $condition ) { set_transient( $transient, wp_json_encode( 'yes' ), DAY_IN_SECONDS ); return true; } set_transient( $transient, wp_json_encode( 'no' ), DAY_IN_SECONDS ); return false; } /** * Check if given access token is valid for Instagram Api. */ public static function is_access_token_valid( $access_token ) { if ( empty( $access_token ) ) { return false; } $request_url = add_query_arg( array( 'fields' => 'username', 'access_token' => $access_token, ), 'https://graph.instagram.com/me' ); $response = self::remote_get( $request_url ); if ( is_wp_error( $response ) ) { return $response; } if ( 200 != wp_remote_retrieve_response_code( $response ) ) { return false; } return true; } } Wpzoom_Instagram_Widget_API::getInstance(); /** * * Enqueue CSS/JS of the plugin. * * @since 2.0.2 * @package WPZOOM_Instagram_Widget */ // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! class_exists( 'WPZOOM_Instagram_Widget_Assets ' ) ) { /** * Main WPZOOM_Instagram_Widget_Assets Class. * * @since 2.0.2 */ class WPZOOM_Instagram_Widget_Assets { /** * This plugin's instance. * * @var WPZOOM_Instagram_Widget_Assets * @since 2.0.2 */ private static $instance; /** * Provides singleton instance. * * @since 2.0.2 * @return self instance */ public static function instance() { if ( null === self::$instance ) { self::$instance = new WPZOOM_Instagram_Widget_Assets(); } return self::$instance; } /** * The base directory path. * * @var string $_dir */ private $_dir; /** * The base URL path. * * @var string $_url */ private $_url; /** * The Constructor. */ public function __construct() { add_action( 'enqueue_block_assets', array( $this, 'frontend_register_scripts' ), 5 ); add_action( 'enqueue_block_assets', array( $this, 'widget_styles' ), 5 ); add_action( 'enqueue_block_editor_assets', array( $this, 'register_block_assets' ) ); add_action( 'enqueue_block_editor_assets', array( $this, 'widget_styles' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'widget_styles' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'register_widget_scripts' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_widget_scripts' ) ); /** * Enqueue styles and scripts for SiteOrigin Page Builder. */ add_action( 'siteorigin_panel_enqueue_admin_scripts', array( $this, 'widget_styles' ) ); add_action( 'siteorigin_panel_enqueue_admin_scripts', array( $this, 'register_widget_scripts' ) ); add_action( 'siteorigin_panel_enqueue_admin_scripts', array( $this, 'enqueue_widget_scripts' ) ); } public function frontend_register_scripts() { global $post; $general_options = get_option( 'wpzoom-instagram-general-settings' ); $should_enqueue = has_block( 'wpzoom/instagram-block' ); $has_reusable_block = self::has_reusable_block( 'wpzoom/instagram-block' ); $is_active_widget = is_active_widget( false, false, 'wpzoom_instagram_widget', false ); $has_shortcode = ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'instagram' ) ); $has_widget_block = self::is_active_block_widget( 'wpzoom/instagram-block' ); $load_css_js = isset( $general_options['load-css-js'] ) ? true : false; $script_asset_file = include( plugin_dir_path( __FILE__ ) . 'dist/scripts/backend/block.asset.php' ); $style_asset_file = include( plugin_dir_path( __FILE__ ) . 'dist/styles/frontend/index.asset.php' ); if( is_admin() || $load_css_js || $should_enqueue || $has_reusable_block || $is_active_widget || $has_shortcode || $has_widget_block || isset( $_GET['wpz-insta-widget-preview'] ) ) { wp_register_script( 'magnific-popup', plugins_url( 'dist/scripts/library/magnific-popup.js', __FILE__ ), array( 'jquery', 'underscore', 'wp-util' ), filemtime( plugin_dir_path( __FILE__ ) . 'dist/scripts/library/magnific-popup.js' ), true ); wp_register_script( 'swiper-js', plugins_url( 'dist/scripts/library/swiper.js', __FILE__ ), array(), '7.4.1' ); wp_register_script( 'wpz-insta_block-frontend-script', plugins_url( 'dist/scripts/frontend/block.js', __FILE__ ), array( 'jquery', 'underscore', 'magnific-popup', 'swiper-js' ), $script_asset_file['version'] ); wp_register_style( 'magnific-popup', plugins_url( 'dist/styles/library/magnific-popup.css', __FILE__ ), array( 'dashicons' ), WPZOOM_INSTAGRAM_VERSION ); wp_register_style( 'wpz-insta_block-frontend-style', plugins_url( 'dist/styles/frontend/index.css', __FILE__ ), array( 'magnific-popup', 'swiper-css' ), $style_asset_file['version'] ); } } public function register_block_assets() { $script_asset_file = include( plugin_dir_path( __FILE__ ) . 'dist/scripts/backend/block.asset.php' ); $style_asset_file = include( plugin_dir_path( __FILE__ ) . 'dist/styles/frontend/index.asset.php' ); wp_register_script( 'wpz-insta_block-backend-script', plugins_url( 'dist/scripts/backend/block.js', __FILE__ ), $script_asset_file['dependencies'], $script_asset_file['version'] ); } /** * Load widget specific styles. */ public function widget_styles() { global $post; $general_options = get_option( 'wpzoom-instagram-general-settings' ); $should_enqueue = has_block( 'wpzoom/instagram-block' ); $has_reusable_block = self::has_reusable_block( 'wpzoom/instagram-block' ); $is_active_widget = is_active_widget( false, false, 'wpzoom_instagram_widget', false ); $has_shortcode = ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'instagram' ) ); $has_widget_block = self::is_active_block_widget( 'wpzoom/instagram-block' ); $load_css_js = isset( $general_options['load-css-js'] ) ? true : false; if( is_admin() || $load_css_js || $should_enqueue || $has_reusable_block || $is_active_widget || $has_shortcode || $has_widget_block || isset( $_GET['wpz-insta-widget-preview'] ) ) { wp_enqueue_style( 'swiper-css', plugin_dir_url( __FILE__ ) . 'dist/styles/library/swiper.css', array(), '7.4.1' ); wp_enqueue_style( 'wpz-insta_block-frontend-style', plugin_dir_url( __FILE__ ) . 'dist/styles/frontend/index.css', array( 'dashicons' ), WPZOOM_INSTAGRAM_VERSION ); wp_enqueue_style( 'magnific-popup', plugin_dir_url( __FILE__ ) . 'dist/styles/library/magnific-popup.css', array( 'dashicons' ), WPZOOM_INSTAGRAM_VERSION ); } } /** * Register widget specific scripts. */ public function register_widget_scripts() { wp_register_script( 'zoom-instagram-widget-lazy-load', plugin_dir_url( __FILE__ ) . 'dist/scripts/library/lazy.js', array( 'jquery' ), filemtime( plugin_dir_path( __FILE__ ) . 'dist/scripts/library/lazy.js' ), true ); wp_register_script( 'magnific-popup', plugin_dir_url( __FILE__ ) . 'dist/scripts/library/magnific-popup.js', array( 'jquery', 'underscore', 'wp-util' ), filemtime( plugin_dir_path( __FILE__ ) . 'dist/scripts/library/magnific-popup.js' ), true ); wp_register_script( 'swiper-js', plugin_dir_url( __FILE__ ) . 'dist/scripts/library/swiper.js', array(), '7.0.0-alpha.21', true ); wp_register_script( 'zoom-instagram-widget', plugin_dir_url( __FILE__ ) . 'dist/scripts/frontend/index.js', array( 'jquery', 'underscore', 'wp-util', 'magnific-popup', 'swiper-js' ), WPZOOM_INSTAGRAM_VERSION, true ); } /** * Load widget specific scripts. */ public function enqueue_widget_scripts() { global $post; $general_options = get_option( 'wpzoom-instagram-general-settings' ); $should_enqueue = has_block( 'wpzoom/instagram-block' ); $has_reusable_block = self::has_reusable_block( 'wpzoom/instagram-block' ); $is_active_widget = is_active_widget( false, false, 'wpzoom_instagram_widget', false ); $has_shortcode = ( is_a( $post, 'WP_Post' ) && has_shortcode( $post->post_content, 'instagram' ) ); $has_widget_block = self::is_active_block_widget( 'wpzoom/instagram-block' ); $load_css_js = isset( $general_options['load-css-js'] ) ? true : false; if( is_admin() || $load_css_js || $should_enqueue || $has_reusable_block || $is_active_widget || $has_shortcode || $has_widget_block || isset( $_GET['wpz-insta-widget-preview'] ) ) { wp_enqueue_script( 'zoom-instagram-widget-lazy-load' ); wp_enqueue_script( 'magnific-popup' ); wp_enqueue_script( 'swiper-js' ); wp_enqueue_script( 'zoom-instagram-widget' ); wp_enqueue_script( 'wpz-insta_block-frontend-script' ); } } /** * Check the widget block based area has the block * * @since 2.0.2 * @param string $block_name The block name. * @return boolean Return true if post content has provided block name as reusable block, else return false. */ public static function is_active_block_widget( $blockname ) { $allwidgets = []; $widget_blocks = get_option( 'widget_block' ); $sidebars_widgets = get_option('sidebars_widgets'); if( is_array( $sidebars_widgets ) ) { foreach ( $sidebars_widgets as $key => $value ) { if( is_array( $value ) ) { foreach ($value as $widget_id) { $pieces = explode( '-', $widget_id ); $multi_number = array_pop( $pieces ); $id_base = implode( '-', $pieces ); $widget_data = get_option( 'widget_' . $id_base ); // Remove inactive widgets if( $key != 'wp_inactive_widgets' ) { unset( $widget_data['_multiwidget'] ); $allwidgets[ $key ] = $widget_data; } } } } } foreach( (array) $allwidgets as $widget ) { foreach( (array) $widget as $widget_element ) { foreach( (array)$widget_element as $value ) { if( is_string( $value ) && has_shortcode( $value, 'instagram' ) ) { return true; } } } } foreach( (array) $widget_blocks as $widget_block ) { if ( ! empty( $widget_block['content'] ) && ( has_block( $blockname, $widget_block['content'] ) || has_shortcode( $widget_block['content'], 'instagram' ) ) ) { return true; } } return false; } /** * Check the post content has reusable block * * @since 2.0.2 * @param string $block_name The block name. * @param int $post_id The post ID. * @param int $reusable_block_id The reusable block post ID. * @param boolean|int $content The post content. * @return boolean Return true if post content has provided block name as reusable block, else return false. */ public static function has_reusable_block( $block_name, $post_id = 0, $reusable_block_id = 0, $content = '' ) { $has_reusable_block = false; $post_id = $post_id > 0 ? $post_id : get_the_ID(); /** * Loop reusable blocks to get needed block * * @since 2.0.2 */ if ( ! empty( self::get_reusable_block( absint( $reusable_block_id ) ) ) ) { $args = array( 'post_type' => 'wp_block', 'posts_per_page' => -1, 'post_status' => 'publish', ); $query = new WP_Query( $args ); while ( $query->have_posts() ) { $query->the_post(); if ( absint( $reusable_block_id ) === get_the_ID() ) { $content = get_post_field( 'post_content', get_the_ID() ); if ( has_block( $block_name, $content ) ) { $has_reusable_block = true; return $has_reusable_block; } } } // Reset global post variable. After this point, we are back to the Main Query object. wp_reset_postdata(); } // Early return if $has_reusable_block is true. if ( true === $has_reusable_block ) { return; } if ( empty( $content ) ) { $content = get_post_field( 'post_content', $post_id ); } if ( $content ) { if ( has_block( 'block', $content ) ) { // Check reusable blocks. $blocks = parse_blocks( $content ); if ( ! is_array( $blocks ) || empty( $blocks ) ) { return false; } foreach ( $blocks as $block ) { if ( $block['blockName'] === 'core/block' && ! empty( $block['attrs']['ref'] ) ) { $reusable_block_id = absint( $block['attrs']['ref'] ); if ( has_block( $block_name, $reusable_block_id ) ) { return true; } elseif ( ! empty( self::get_reusable_block( $reusable_block_id ) ) ) { return true; } } } } elseif ( has_block( $block_name, $content ) ) { return true; } elseif ( has_shortcode( $content, 'reblex' ) ) { return true; } else { return false; } } return false; } /** * Get reusable block. * * @since 2.0.2 * @param int $id Reusable block id. * @return string Reusable block post content. */ public static function get_reusable_block( $id ) { $post = ''; if ( ! is_string( $id ) && $id > 0 ) { $wp_post = get_post( $id ); if ( $wp_post instanceof WP_Post ) { $post = $wp_post->post_content; } } return $post; } } } WPZOOM_Instagram_Widget_Assets::instance(); /** * WPZOOM Portfolio * * @package WPZOOM_Portfolio * @author WPZOOM * @copyright 2022 WPZOOM * @license GPL-2.0-or-later * * @wordpress-plugin * Plugin Name: WPZOOM Portfolio * Plugin URI: https://www.wpzoom.com/plugins/wpzoom-portfolio/ * Description: The ultimate solution for creatives, designers, photographers, and businesses looking to showcase their work in an elegant, professional, and fully customizable way. * Author: WPZOOM * Author URI: https://www.wpzoom.com * Text Domain: wpzoom-portfolio * Version: 1.4.2 * License: GPL2+ * License URI: http://www.gnu.org/licenses/gpl-2.0.txt */ // Exit if accessed directly defined( 'ABSPATH' ) || exit; if ( ! defined( 'WPZOOM_PORTFOLIO_VERSION' ) ) { define( 'WPZOOM_PORTFOLIO_VERSION', get_file_data( __FILE__, [ 'Version' ] )[0] ); // phpcs:ignore } // settings page url attribute define( 'WPZOOM_PORTFOLIO_SETTINGS_PAGE', 'wpzoom-portfolio-settings' ); define( 'WPZOOM_PORTFOLIO__FILE__', __FILE__ ); define( 'WPZOOM_PORTFOLIO_PLUGIN_BASE', plugin_basename( WPZOOM_PORTFOLIO__FILE__ ) ); define( 'WPZOOM_PORTFOLIO_PLUGIN_DIR', dirname( WPZOOM_PORTFOLIO_PLUGIN_BASE ) ); define( 'WPZOOM_PORTFOLIO_PATH', plugin_dir_path( WPZOOM_PORTFOLIO__FILE__ ) ); define( 'WPZOOM_PORTFOLIO_URL', plugin_dir_url( WPZOOM_PORTFOLIO__FILE__ ) ); // Instance the plugin $wpzoom_blocks = new WPZOOM_Blocks(); // Register plugin activation hook register_activation_hook( __FILE__, array( $wpzoom_blocks, 'activate' ) ); // Hook the plugin into WordPress add_action( 'init', array( $wpzoom_blocks, 'init' ) ); /** * Class WPZOOM_Blocks * * Main container class of the WPZOOM Blocks WordPress plugin. * * @since 1.0.0 */ class WPZOOM_Blocks { /** * Whether the plugin has been initialized. * * @var boolean * @access public * @since 1.0.0 */ public $initialized = false; /** * The path to this plugin's root directory. * * @var string * @access public * @since 1.0.0 */ public $plugin_dir_path; /** * The URL to this plugin's root directory. * * @var string * @access public * @since 1.0.0 */ public $plugin_dir_url; /** * The path to this plugin's "main" directory. * * @var string * @access public * @since 1.0.0 */ public $main_dir_path; /** * The URL to this plugin's "main" directory. * * @var string * @access public * @since 1.0.0 */ public $main_dir_url; /** * The path to this plugin's "blocks" directory. * * @var string * @access public * @since 1.0.0 */ public $blocks_dir_path; /** * The URL to this plugin's "blocks" directory. * * @var string * @access public * @since 1.0.0 */ public $blocks_dir_url; /** * Initializes the plugin and sets up needed hooks and features. * * @access public * @return void * @since 1.0.0 * @see WPZOOM_Blocks::load_assets() */ public function init() { // If the plugin has not already been initialized... if ( false === $this->initialized ) { // Assign the values for the plugins 'root' dir/url $this->plugin_dir_path = plugin_dir_path( __FILE__ ); $this->plugin_dir_url = plugin_dir_url( __FILE__ ); // Assign the values for the plugins 'main' dir/url $this->main_dir_path = trailingslashit( $this->plugin_dir_path . 'build' ); $this->main_dir_url = trailingslashit( $this->plugin_dir_url . 'build' ); // Assign the values for the plugins 'blocks' dir/url $this->blocks_dir_path = trailingslashit( $this->main_dir_path . 'blocks' ); $this->blocks_dir_url = trailingslashit( $this->main_dir_url . 'blocks' ); // Load the correct translation files for the plugin load_plugin_textdomain( 'wpzoom-portfolio', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); // Filter the Gutenberg block categories to add our custom 'WPZOOM Blocks' category if needed add_filter( 'block_categories_all', array( $this, 'filter_block_categories' ), 10, 2 ); // Load in all needed assets for the plugin $this->load_assets(); // Enqueue the main/root scripts and styles in the Gutenberg editor add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_portfolio_block_editor_assets' ) ); add_action( 'enqueue_block_assets', array( $this, 'enqueue_portfolio_block_assets' ) ); // Hook into the REST API in order to add some custom things add_action( 'rest_api_init', array( $this, 'rest_api_routes' ) ); // Add some extra needed styles on the frontend add_action( 'wp_enqueue_scripts', function() { wp_enqueue_script( 'jquery' ); wp_enqueue_style( 'dashicons' ); } ); // Mark the plugin as initialized $this->initialized = true; } } /** * Runs once during the activation of the plugin to run some one-time setup functions. * * @access public * @return void * @since 1.0.0 */ public function enqueue_portfolio_block_editor_assets() { wp_enqueue_script( 'masonry' ); $options = get_option( 'wpzoom-portfolio-settings' ); wp_enqueue_script( 'wpzoom-blocks-js-index-main' ); wp_localize_script( 'wpzoom-blocks-js-index-main', 'wpzoomPortfolioBlock', array( 'setting_options' => ( !empty( $options ) ? $options : array() ) ) ); wp_enqueue_style( 'wpzoom-blocks-css-editor-main' ); } /** * Runs once during the activation of the plugin to run some one-time setup functions. * * @access public * @return void * @since 1.0.0 */ public function enqueue_portfolio_block_assets() { $should_enqueue = has_block( 'wpzoom-blocks/portfolio' ) || has_block( 'wpzoom-blocks/portfolio-layouts' ) || WPZOOM_Portfolio_Assets_Manager::has_wpzoom_portfolio_shortcode(); if( ! $should_enqueue ) { return; } wp_enqueue_script( 'masonry' ); wp_enqueue_script( 'wpzoom-blocks-js-script-main' ); wp_enqueue_style( 'wpzoom-blocks-css-style-main' ); } /** * Runs once during the activation of the plugin to run some one-time setup functions. * * @access public * @return void * @since 1.0.0 * @see WPZOOM_Blocks::init() */ public function activate() { // Make sure the plugin is initialized $this->init(); // Flush the rewrite rules so any custom post types work correctly flush_rewrite_rules(); } /** * Loads in all the needed assets for the plugin. * * @access public * @return void * @since 1.0.0 * @see register_block_type() */ public function load_assets() { // Set a fallback for files with no version/dependency info $no_asset = array( 'dependencies' => array( 'wp-blocks', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill' ), 'version' => '-1' ); // Go through the main directory and each sub-directory in the blocks directory... foreach ( array_merge( array( $this->main_dir_path ), glob( $this->blocks_dir_path . '*', GLOB_ONLYDIR | GLOB_NOSORT ) ) as $path ) { // Get the slug for the directory in the current iteration $slug = 0 === substr_compare( $path, 'build/', -strlen( 'build/' ) ) ? 'main' : str_replace( $this->blocks_dir_path, '', $path ); // Get a version of the slug with dashes replaced by underscores $slug_ = str_replace( '-', '_', $slug ); // Consistent slashing $path = trailingslashit( $path ); // Go through every possible script/style there could be in the directory from the current iteration... foreach ( array( 'index' => 'js', 'script' => 'js', 'editor' => 'css', 'style' => 'css' ) as $name => $ext ) { // If a script/style with the given name exists in the directory from the current iteration... if ( file_exists( "$path$name.$ext" ) ) { // Get the version/dependency info $asset_file = "$path$name.asset.php"; $asset = file_exists( $asset_file ) ? require_once( $asset_file ) : $no_asset; // Register the script/style so it can be enqueued later $func = 'js' == $ext ? 'wp_register_script' : 'wp_register_style'; $url = trailingslashit( 'main' == $slug_ ? $this->main_dir_url : $this->blocks_dir_url . $slug ) . "$name.$ext"; $depends = 'js' == $ext ? $asset[ 'dependencies' ] : array(); $func( "wpzoom-blocks-$ext-$name-$slug_", $url, $depends, $asset[ 'version' ], ( 'main' != $slug_ && 'js' == $ext ) ); // If the file in the current iteration is a script... if ( 'js' == $ext && function_exists( 'wp_set_script_translations' ) ) { // Setup the translations for it wp_set_script_translations( "wpzoom-blocks-js-$name-$slug_", 'wpzoom-portfolio', plugin_dir_path( __FILE__ ) . 'languages' ); } } } // If the file in the current iteration is in a block... if ( 'main' != $slug_ ) { // Include the index.php file if the block has one if ( file_exists( $path . 'index.php' ) ) { require_once( $path . 'index.php' ); } // Construct the arguments array $args = array( 'editor_script' => "wpzoom-blocks-js-index-$slug_", 'editor_style' => "wpzoom-blocks-css-editor-$slug_", 'script' => "wpzoom-blocks-js-script-$slug_", 'style' => "wpzoom-blocks-css-style-$slug_" ); // Construct the class name to use below $class_name = 'WPZOOM_Blocks_' . ucwords( $slug_, '_' ); // If a class with the given name exists... if ( class_exists( $class_name ) ) { // Instantiate the class $class = new $class_name(); // Add attributes if they have been declared in the class if ( property_exists( $class, 'attributes' ) ) { $args[ 'attributes' ] = $class->attributes; } // Add a render callback if one is specified in the class if ( method_exists( $class, 'render' ) ) { $args[ 'render_callback' ] = array( $class, 'render' ); } } // Register the block with Gutenberg using the given arguments register_block_type( "wpzoom-blocks/$slug", $args ); } } } /** * Adds the WPZOOM category to the Gutenberg block categories, if not already present. * * @access public * @param array $categories Array containing all registered Gutenberg block categories. * @param WP_Post $post A WP_Post object representing the post being loaded. * @return array * @since 1.0.0 */ public function filter_block_categories( $categories, $post ) { // Get a list of all the block category slugs $category_slugs = wp_list_pluck( $categories, 'slug' ); // Return the list of categories with our custom category included return in_array( 'wpzoom-blocks', $category_slugs, true ) ? $categories : array_merge( $categories, array( array( 'slug' => 'wpzoom-blocks', 'title' => esc_html__( 'WPZOOM - Blocks', 'wpzoom-portfolio' ) ) ) ); } /** * Adds extra needed routes in the WordPress REST API. * * @access public * @return void * @since 1.0.0 * @see register_rest_route() * @see register_rest_field() * @see WPZOOM_Blocks::get_rest_image_sizes() * @see WPZOOM_Blocks::get_featured_media_urls() */ public function rest_api_routes() { // Register the 'image-sizes' REST API route register_rest_route( 'wpzoom-blocks/v1', '/image-sizes', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_rest_image_sizes' ), 'permission_callback' => function() { return current_user_can( 'edit_posts' ); } ) ); // Register the 'featured_media_urls' REST API field on all post types register_rest_field( get_post_types(), 'featured_media_urls', array( 'get_callback' => array( $this, 'get_featured_media_urls' ), 'update_callback' => null, 'schema' => array( 'description' => esc_html__( 'Different sized featured images', 'wpzoom-portfolio' ), 'type' => 'array' ) ) ); } /** * Returns a REST response containing all available media library image sizes. * * @access public * @return array * @since 1.0.0 * @see get_intermediate_image_sizes() */ public function get_rest_image_sizes() { // Call the built-in get_intermediate_image_sizes() WordPress function to get an array of sizes $raw_sizes = get_intermediate_image_sizes(); // Build an array with sizes and their labels $sizes = array(); foreach ( $raw_sizes as $raw_size ) { $sizes[] = array( 'label' => ucwords( preg_replace( '/[_-]/', ' ', $raw_size ) ), 'value' => $raw_size ); } // Return the sizes array properly formatted for a rest response return rest_ensure_response( $sizes ); } /** * Returns an array of all the available image size URLs for the featured media from the given post object. * * @access public * @param WP_Post|Object $object The object that is the context to get the featured media ID from. * @return array * @since 1.0.0 * @see get_intermediate_image_sizes() * @see wp_get_attachment_image_src() */ function get_featured_media_urls( $object ) { // Initialize the array that will be returned $featured_media_urls = array(); // If the given object has attached featured media... if ( isset( $object[ 'featured_media' ] ) ) { // Keep track of the featured media ID $featured_media_id = $object[ 'featured_media' ]; // Call wp_get_attachment_image_src() with the default options for the best chance to get a fallback $thumb = wp_get_attachment_image_src( $featured_media_id ); // If the size above was found... if ( is_array( $thumb ) ) { // Set it so it will be present as a fallback if no other sizes can be found $featured_media_urls[ 'thumbnail' ] = $thumb; } // Go through every available image size... foreach ( get_intermediate_image_sizes() as $size ) { // Get the featured media source attached to the given object in the size from the current iteration $src = wp_get_attachment_image_src( $featured_media_id, $size, false ); // If the size was found... if ( is_array( $src ) ) { // Add it to the array of size URLs $featured_media_urls[ $size ] = $src; } } } // Return the array return $featured_media_urls; } } function wpzoom_theme_has_portfolio() { $wpzoom_themes = array( 'angle', 'inspiro', 'wpzoom-inspiro-pro', 'wpzoom-reel', 'wpzoom-rezzo' ); $current_theme = get_option( 'stylesheet' ); if( ! in_array( $current_theme, $wpzoom_themes ) ) { return false; } else { if( 'inspiro' == $current_theme ) { $theme = wp_get_theme(); if( 'https://www.wpzoom.com/free-wordpress-themes/inspiro-lite/' == $theme->get( 'ThemeURI' ) ) { return false; } } } return true; } if( ! function_exists( 'wpzoom_portfolio_load_files' ) ) { function wpzoom_portfolio_load_files() { //Add Portfolio Shortcode require_once 'classes/class-wpzoom-portfolio-shortcode.php'; require_once 'classes/class-wpzoom-portfolio-admin-menu.php'; require_once 'classes/class-wpzoom-portfolio-custom-posts.php'; require_once 'classes/class-wpzoom-portfolio-assets-manager.php'; require_once 'classes/class-wpzoom-wptt-webfont-loader.php'; //Load Settings Panel require_once 'classes/class-wpzoom-settings-fields.php'; require_once 'classes/class-wpzoom-portfolio-settings-page.php'; if( ! wpzoom_theme_has_portfolio() ) { //Load Archive template require_once 'classes/class-wpzoom-portfolio-template.php'; } if( ! wpzoom_theme_has_portfolio() ) { //Load Archive template require_once 'classes/class-wpzoom-portfolio-template.php'; } if( ! class_exists( 'WPZOOM_Portfolio_Pro' ) && ! wpzoom_theme_has_portfolio() ) { require_once 'classes/class-wpzoom-portfolio-metaboxes-upsell.php'; } } add_action( 'plugin_loaded', 'wpzoom_portfolio_load_files' ); } function load_reorder_portfolio_items() { if( ! current_user_can( 'edit_posts' ) || current_theme_supports( 'zoom-portfolio' ) ) { return; } //Load Re-Order feature require_once 'classes/featured-posts/class-wpzoom-portfolio-featured-posts.php'; $wpzoom_portfrolio_reorder_settings = array( //Unique Id that is used to add the new column in posts list table. 'id' => 'wpzoom_is_featured_id', //Label that appears in the submenu of post types 'menu_title' => __( 'Re-order', 'wpzoom-portfolio' ), //Post type in which this feature will be added. 'post_type' => 'portfolio_item', ); $featured_posts_plugin_uri = WPZOOM_PORTFOLIO_URL . '/classes/featured-posts/'; $list_table_checkbox_directory_uri = WPZOOM_PORTFOLIO_URL . '/classes/featured-posts/list-table-checkbox'; new WPZOOM_Featured_Posts( $wpzoom_portfrolio_reorder_settings, $featured_posts_plugin_uri ); } add_action( 'init', 'load_reorder_portfolio_items' ); add_action( 'init', 'WPZOOM_Blocks_Portfolio_Shortcode::instance' );/** * Plugin Name: Video Popup Block by WPZOOM * Plugin URI: https://wordpress.org/plugins/wpzoom-video-popup-block/ * Description: Quickly add a button displaying a YouTube, Vimeo or Self-Hosted (MP4) video in a popup when clicked. * Version: 1.1.1 * Author: WPZOOM * Author URI: https://www.wpzoom.com/ * Text Domain: wpzoom-video-popup-block * Domain Path: /languages * License: GPLv2 or later * License URI: https://www.gnu.org/licenses/gpl-2.0.html * Requires at least: 6.0 * Requires PHP: 7.2 * Tested up to: 6.4 * * @package Wpzoom_Video_Popup_Block */ namespace WPZOOM\Video_Popup_Block; // Exit if accessed directly. defined( 'ABSPATH' ) || exit; // Intitalize the plugin. new Plugin(); /** * Main WPZOOM Video Popup Block class. * * The entry point into WordPress for this plugin. * * @since 1.0.0 */ class Plugin { /** * The version of this plugin. * * @since 1.0.0 * @var int */ public const VERSION = '1.1.1'; /** * Path to the plugin directory. * * @since 1.0.0 * @var string */ public $plugin_path; /** * URL to the plugin directory. * * @since 1.0.0 * @var string */ public $plugin_url; /** * Main directory name of the plugin. * * @since 1.0.0 * @var string */ public $plugin_dirname; /** * Main file name of the plugin. * * @since 1.0.0 * @var string */ public $plugin_filename; /** * The name of the block this plugin adds. * * @since 1.0.0 * @var string */ public $block_name; /** * Plugin class constructor. * * @since 1.0.0 * @return void */ public function __construct() { $this->plugin_path = plugin_dir_path( __FILE__ ); $this->plugin_url = plugin_dir_url( __FILE__ ); $this->plugin_dirname = trailingslashit( wp_basename( __DIR__ ) ); $this->plugin_filename = wp_basename( __FILE__ ); $this->block_name = 'wpzoom-video-popup-block/block'; // Do some initial setup on the WordPress `init` hook. add_action( 'init', array( $this, 'init' ) ); // Add the WPZOOM block category, if needed. add_filter( 'block_categories_all', array( $this, 'block_categories' ), 10, 2 ); // Add some useful CSS classes. add_filter( 'body_class', array( $this, 'body_class' ) ); add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) ); } /** * Initializes the plugin and hooks into WordPress. * * @since 1.0.0 * @return void */ public function init() { // Load the translations for the plugin. load_plugin_textdomain( 'wpzoom-video-popup-block', false, $this->plugin_dirname . 'languages/' ); // Register the main block in Gutenberg. register_block_type( $this->plugin_path . 'block.json' ); // Setup translations for the main block. wp_set_script_translations( 'wpzoom-video-popup-block-block-editor-script-js', 'wpzoom-video-popup-block', $this->plugin_path . 'languages/' ); } /** * Adds the WPZOOM block category if needed. * * @since 1.0.0 * @param array $categories The list of existing block categories. * @return array The modified list of block categories. */ public function block_categories( $categories ) { if ( empty( $categories ) || ( ! empty( $categories ) && is_array( $categories ) && ! in_array( 'wpzoom-blocks', wp_list_pluck( $categories, 'slug' ), true ) ) ) { $categories = array_merge( $categories, array( array( 'slug' => 'wpzoom-blocks', 'title' => esc_html__( 'WPZOOM - Blocks', 'wpzoom-video-popup-block' ), ), ) ); } return $categories; } /** * Returns whether the plugin is in "PRO" mode. * * @since 1.0.1 * @return bool Boolean indicating whether the plugin is in "PRO" mode. */ public function is_pro() { return boolval( apply_filters( 'wpzoom_video_popup_block_is_pro', false ) ); } /** * Adds some classes for the plugin to the `` tag of the page. * * @since 1.0.1 * @param array $classes Array of existing classes. * @return array The modified classes array. */ public function body_class( $classes ) { if ( has_block( 'wpzoom-video-popup-block/block' ) ) { $classes[] = 'wpzoom-video-popup_enabled'; if ( is_admin() ) { $classes[] = 'wpzoom-video-popup_admin'; } if ( $this->is_pro() ) { $classes[] = 'wpzoom-video-popup_is-pro'; } } return $classes; } /** * Adds some classes for the plugin to the `` tag of the WordPress admin. * * @since 1.0.1 * @param string $classes Space-separated string of existing classes. * @return string The modified classes string. */ public function admin_body_class( $classes ) { if ( has_block( 'wpzoom-video-popup-block/block' ) ) { $classes .= ' wpzoom-video-popup_enabled '; if ( is_admin() ) { $classes .= ' wpzoom-video-popup_admin '; } if ( $this->is_pro() ) { $classes .= ' wpzoom-video-popup_is-pro '; } } return $classes; } } /** * Inspiro functions and definitions * * @link https://developer.wordpress.org/themes/basics/theme-functions/ * * @package Inspiro * @since Inspiro 1.0.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } /** * Define Constants */ define( 'INSPIRO_THEME_VERSION', '2.1.3' ); define( 'INSPIRO_THEME_DIR', trailingslashit( get_template_directory() ) ); define( 'INSPIRO_THEME_URI', trailingslashit( esc_url( get_template_directory_uri() ) ) ); define( 'INSPIRO_THEME_ASSETS_URI', INSPIRO_THEME_URI . 'dist' ); // Marketing define( 'INSPIRO_MARKETING_UTM_CODE_STARTER_SITE', '?utm_source=wpadmin&utm_medium=starter-sites&utm_campaign=upgrade-premium' ); define( 'INSPIRO_MARKETING_UTM_CODE_FOOTER_MENU', '?utm_source=wpadmin&utm_medium=footer-menu&utm_campaign=upgrade-premium' ); // This theme requires WordPress 5.3 or later. if ( version_compare( $GLOBALS['wp_version'], '5.3', '<' ) ) { require INSPIRO_THEME_DIR . 'inc/back-compat.php'; } /** * Recommended Plugins */ require INSPIRO_THEME_DIR . 'inc/classes/class-tgm-plugin-activation.php'; /** * Setup helper functions. */ require INSPIRO_THEME_DIR . 'inc/common-functions.php'; /** * Setup theme media. */ require INSPIRO_THEME_DIR . 'inc/theme-media.php'; /** * Enqueues scripts and styles */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-enqueue-scripts.php'; /** * Starter Content Notice */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-starter-content-notice.php'; /** * Setup custom wp-admin options pages */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-custom-wp-admin-menu.php'; /** * Additional features to include custom WP pointer function */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-wp-admin-menu-pointer.php'; /** * Functions and definitions. */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-after-setup-theme.php'; /** * Handle SVG icons. */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-svg-icons.php'; /** * Implement the Custom Header feature. */ require INSPIRO_THEME_DIR . 'inc/custom-header.php'; /** * Custom template tags for this theme. */ require INSPIRO_THEME_DIR . 'inc/template-tags.php'; /** * Additional features to allow styling of the templates. */ require INSPIRO_THEME_DIR . 'inc/template-functions.php'; /** * Custom Template WC functions */ require INSPIRO_THEME_DIR . 'inc/wc-custom-functions.php'; /** * Editor Fonts */ require INSPIRO_THEME_DIR . 'inc/editor-fonts.php'; /** * Custom template shortcode tags for this theme */ // require INSPIRO_THEME_DIR . 'inc/shortcodes.php'; /** * Customizer additions. */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-font-family-manager.php'; require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-fonts-manager.php'; // Include Customizer Guided Tour if ( is_admin() ) { // && is_customize_preview(), AJAX don't work with is_customize_preview() included require INSPIRO_THEME_DIR . 'inc/classes/inspiro-customizer-guided-tour.php'; } require INSPIRO_THEME_DIR . 'inc/customizer-functions.php'; require INSPIRO_THEME_DIR . 'inc/customizer/class-inspiro-customizer-control-base.php'; require INSPIRO_THEME_DIR . 'inc/customizer/class-inspiro-customizer.php'; /** * SVG icons functions and filters. */ require INSPIRO_THEME_DIR . 'inc/icon-functions.php'; /** * Theme admin notices and info page */ if ( is_admin() ) { require INSPIRO_THEME_DIR . 'inc/admin-notice.php'; require INSPIRO_THEME_DIR . 'inc/admin/admin-api.php'; // temporary marketing black friday functionality require INSPIRO_THEME_DIR . 'inc/marketing-functions.php'; if ( current_user_can( 'manage_options' ) ) { require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-notices.php'; require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-notice-review.php'; require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-theme-deactivation.php'; } } /** * Theme Upgrader */ require INSPIRO_THEME_DIR . 'inc/classes/class-inspiro-theme-upgrader.php'; /** * Inline theme css generated dynamically */ require INSPIRO_THEME_DIR . 'inc/dynamic-css/body.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/logo.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/headings.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/h1.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/page-title.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/h1-content.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/content-headings.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/hero-header-title.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/hero-header-desc.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/hero-header-button.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/main-menu.php'; require INSPIRO_THEME_DIR . 'inc/dynamic-css/mobile-menu.php'; /** * Container Width Functions */ /** * Filter theme.json to make contentSize dynamic based on customizer container width */ if ( ! function_exists( 'inspiro_filter_theme_json_data' ) ) : function inspiro_filter_theme_json_data( $theme_json_data ) { $container_width = get_theme_mod( 'container_width', 1200 ); $container_width_narrow = get_theme_mod( 'container_width_narrow', 950 ); // Get the data array from the WP_Theme_JSON_Data object $theme_json = $theme_json_data->get_data(); // Determine which width to use based on context // Pages use default container width, single posts use narrow width $content_size = $container_width; // Default to full width for pages if ( is_single() || is_home() || is_archive() || is_category() || is_tag() || is_author() || is_date() ) { $content_size = $container_width_narrow; // Use narrow width for blog contexts } // Update the contentSize in theme.json if ( isset( $theme_json['settings']['layout']['contentSize'] ) ) { $theme_json['settings']['layout']['contentSize'] = $content_size . 'px'; } // Set wideSize to be content width + 250px to match CSS .alignwide styles if ( isset( $theme_json['settings']['layout']['wideSize'] ) ) { $wide_size = $content_size + 250; $theme_json['settings']['layout']['wideSize'] = $wide_size . 'px'; } // Update the data in the object and return it $theme_json_data->update_with( $theme_json ); return $theme_json_data; } endif; add_filter( 'wp_theme_json_data_user', 'inspiro_filter_theme_json_data' ); /** * Also apply the container width to block editor */ if ( ! function_exists( 'inspiro_filter_theme_json_theme' ) ) : function inspiro_filter_theme_json_theme( $theme_json_data ) { return inspiro_filter_theme_json_data( $theme_json_data ); } endif; add_filter( 'wp_theme_json_data_theme', 'inspiro_filter_theme_json_theme' ); /** * Update editor styles to reflect container width changes */ if ( ! function_exists( 'inspiro_add_editor_container_width_styles' ) ) : function inspiro_add_editor_container_width_styles() { $container_width = get_theme_mod( 'container_width', 1200 ); $container_width_narrow = get_theme_mod( 'container_width_narrow', 950 ); // Determine which width to use based on context // Pages use default container width, single posts use narrow width $content_size = $container_width; // Default to full width for pages if ( is_single() || is_home() || is_archive() || is_category() || is_tag() || is_author() || is_date() ) { $content_size = $container_width_narrow; // Use narrow width for blog contexts } $wide_size = $content_size + 250; $editor_styles = " .editor-styles-wrapper .wp-block { max-width: {$content_size}px; } .editor-styles-wrapper .wp-block[data-align='wide'] { max-width: {$wide_size}px; } "; wp_add_inline_style( 'wp-edit-blocks', $editor_styles ); } endif; add_action( 'enqueue_block_editor_assets', 'inspiro_add_editor_container_width_styles' ); /** * Add dynamic CSS variables for container widths */ if ( ! function_exists( 'inspiro_add_container_width_css_variables' ) ) : function inspiro_add_container_width_css_variables() { $container_width = get_theme_mod( 'container_width', 1200 ); $container_width_narrow = get_theme_mod( 'container_width_narrow', 950 ); $container_width_elementor = get_theme_mod( 'container_width_elementor', false ); // Calculate responsive padding breakpoints $container_padding = 30; // 30px padding $container_width_breakpoint = $container_width + 60; // container width + 60px buffer $container_width_narrow_breakpoint = $container_width_narrow + 60; // narrow container width + 60px buffer $css = " :root { --container-width: {$container_width}px; --container-width-narrow: {$container_width_narrow}px; --container-padding: {$container_padding}px; } /* Dynamic responsive padding media queries */ @media (max-width: {$container_width_breakpoint}px) { .wrap, .inner-wrap, .page .entry-content, .page:not(.inspiro-front-page) .entry-footer, .single .entry-wrapper, .single.has-sidebar.page-layout-sidebar-right .entry-header .inner-wrap, .wp-block-group > .wp-block-group__inner-container { padding-left: {$container_padding}px; padding-right: {$container_padding}px; } } @media (max-width: {$container_width_narrow_breakpoint}px) { .single .entry-header .inner-wrap, .single .entry-content, .single .entry-footer, #comments { padding-left: {$container_padding}px; padding-right: {$container_padding}px; } } "; // Add Elementor container width override if enabled if ( $container_width_elementor ) { $css .= " .elementor-container { max-width: {$container_width}px !important; } "; } wp_add_inline_style( 'inspiro-style', $css ); } endif; add_action( 'wp_enqueue_scripts', 'inspiro_add_container_width_css_variables' ); 1xbet Morocco – Bragi Trade | Tradition & Quality https://bragitrade.com Sat, 03 May 2025 13:41:15 +0000 en-US hourly 1 https://wordpress.org/?v=6.6.5 https://bragitrade.com/wp-content/uploads/2024/03/elementor/thumbs/Ativo-8Logotipos-semnome-ql80be2bdeojxqid3zvoaxhf7yr9npf3cw524plqi6.png 1xbet Morocco – Bragi Trade | Tradition & Quality https://bragitrade.com 32 32 تطبيق 1xbet: أفضل منصة للمراهنات الرياضية والكازينو في الشرق الأوسط https://bragitrade.com/index.php/2025/05/02/ttbyq-1xbet-fdl-mns-llmrhnt-lrydy-wlkzynw-fy-lshrq-lwst/ Fri, 02 May 2025 21:27:50 +0000 https://bragitrade.com/?p=8342

تنزيل تطبيق 1xbet قم بتثبيت تطبيق 1xbet للهاتف المحمول

Content

يعرض التّطبيق للمستخدمين تشكيلة كبيرة من البثّ عبر كاميرا الويب من كافّة أصقاع العالم. بإمكان المستخدمين رؤية المعالم السياحيّة والمناظر الطّبيعيّة والمدائن إلى آخره. البثّ المباشر لتطبيق 1xbet واسع جدًا ويقدّم رهانات على أكثر من 50 رياضة. تشمل القائمة كرة القدم والتنس والهوكي وكرة السلة وكرة اليد والبيسبول والكريكيت والمزيد.

  • محبو موقع الرهان 1xbet في مصر يمكنهم الوصول إلى محتوى اللعب عبر منصات مختلفة.
  • لإنّه تطبيق أساسي لمحبّي الدّراما والمسلسلات والأفلام التّركيّة.
  • لا تحتوي البلدان المختلفة على تطبيقات مختلفة؛ فالتخطيط و طريقه العمل هي نفسها.
  • النسخة المحمولة من موقع المراهنات هي نسخة مُعدّة للعمل على الأجهزة المحمولة من الموقع الرسمي، محافظةً على كل الوظائف المتاحة على الموقع للرهان والألعاب القمارية.

بعدما تقوم بتشغيل تطبيق 1xbet يمكنك مباشرة, وضع أنواع مختلفة من المراهانات. سوف تجد هنا جميع الأحداث الرياضية و كذلك الأحداث العالمية التي يمكن وضع رهاناتك عليها و هذاما يطلق عليه تحميل لعبه 1xbet. كما يوجد أيضا فرصة للمراهنة علي بطولات الرياضات الالكترونية و تتميز القائمة بسهولة استخدامها و يمكن فرز القائمة حسب الشعبية. قبل أن تصبح مؤهلاً لتلقي “”المكافأة الترحيبية”” من 1xbet، يجب عليك أولاً أن تكون عضوًا مسجلاً تم التحقق منه حديثًا في 1xbet. يرجى التأكد من التحقق من حسابك من رسالة التحقق من الحساب التي سترسلها وان اكس بت إلى عنوان البريد الإلكتروني الذي أدخلته أثناء التسجيل. بمجرد تحميل تطبيق 1xbet المجاني وتثبيته بنجاح على جهاز Android أو iOS، فإن الخطوة التالية هي التسجيل.

الرهان المالي في لعبه 1xbet

يمكن للاعبين بسهولة رؤية وفرز الألعاب الرياضية التي يمكنهم المراهنة عليها. يتميز تطبيق الهاتف المحمول وان اكس بت بواجهة مستخدم بديهية للاعبين. يعد دعم البث المباشر ميزة إضافية، حيث يمكن للمستخدمين متابعة الأحداث التي توقعوها مسبقًا. كما أن إصدار الويب يوفر تجربة ثابتة ومألوفة للمستخدمين المعتادين على الوصول إلى موقع الويب عبر متصفحاتهم. فهو يوفر جميع الميزات والوظائف المتاحة على الموقع الرئيسي، بما في ذلك مراهنات الرياضة وألعاب الكازينو والبث” “المباشر، كل ذلك عبر واجهة سهلة الاستخدام و تناسب الهاتف المحمول 1xbet maroc.

  • انتقل إلى علامة التبويب الخاصة بالإعدادات – اختر اللغة المتاحة، والوضع الليلي/النهاري، وغيرها.
  • أولاً، هل” “يتم تنزيل تطبيق 1xbet بسرعة؟ ولسوء الحظ، سيكون تنزيله أبطأ من العديد من التطبيقات الأخرى لأنه غير متوفر على Google Play.
  • يمكنك اختيار أو انشاء مجلد “قائمة ابدأ” لتثبيت التطبيق.
  • في الجزء الأول هتلاقي الأحداث الرياضية اللي جاية، وفي الجزء التاني هتشوف الماتشات اللي شغالة دلوقتي لايف.

يجب أن تحتوي الرهانات التراكمية على احتمالات تبلغ 1, 40 (2/5) أو قيمة فردية أعلى. واجهة التطبيق ديناميكية جدًا، وبتعرض كل الأحداث الرياضية في نفس الوقت. من خلال التطبيق ده، تقدر تتابع عدد كبير من البطولات والمباريات على موبايلك iOS.

هل النسخة المحدثة من 1xbet 2025 متوفرة علي الكمبيوتر اللوحي؟ و ما هي متطلبات النظام

ونتيجة لذلك، يمكننا القول أن التطبيق لديه إيجابيات أكثر من السلبيات. هل هناك أي بلدان لا” “يمكنك فيها فتح حساب باستخدام تطبيق 1xBet لنظام Android أو IOS؟ لسوء الحظ، هناك بعض البلدان التي لا يمكنك فيها استخدام التطبيق. ففي نهاية المطاف، تشعر الحكومات بالقلق إزاء كل الأشياء السلبية التي تصاحب إدمان القمار. استخدم 1xbet الأصلي لتحصل على الأداء الأفضل دون القلق بشأن النسخ المهكرة أو غير الرسمية. تذكّر أن تحميل برنامج 1xbet مهكر قد يكون خطيراً على جهازك.

  • الميزة الرئيسية للنسخة المحمولة هي توفرها للاعبين على أجهزة مختلفة.
  • استمتع بتجربة مستخدم فريدة تتيح لك متابعة المباريات الحية والمراهنة في الوقت الفعلي، بالإضافة إلى عروض حصرية ومكافآت ترحيبية عند التسجيل.
  • 1xbet الأصلي فقط، بدون نسخ مهكرة. تنزيل النسخة الرسمية من موقعنا يضمن الأمان الكامل والتحديث المستمر للميزات.
  • يمكنك تحميل 1xBet بالعربية والاستمتاع بجميع مزايا الوصول عبر الهاتف المحمول.
  • يمكنك فقط تحميل وتثبيت ملف APK 1xbet من موقع 1xbet الرسمي أو مواقع المراهنات التابعة له.

لو معاك iPhone أو أي جهاز بيشتغل بنظام iOS، تقدر بسهولة تحمّل تطبيق 1xbet مجانًا وتستمتع بكل المميزات زي المراهنات، الكازينو، وسحب وإيداع الفلوس من غير أي قيود. يسمح تطبيق 1xBet لملايين اللاعبين من جميع أنحاء العالم بوضع رهانات سريعة على الرياضات من أي مكان على هذا الكوكب! يشجّع تطبيق 1xbet المستخدمين الجدد والنشطين بمكافآت وعروض ترويجية خاصّة. على سبيل المثال، في عيد ميلادك تحصل على رهان مجاني. علاوة على ذلك، تقوم الشركة بشكل دوري بسحب جوائز نقدية كبيرة وهواتف ذكية وهدايا أخرى. للمراهنة، تحتاج إلى إنشاء حساب بعنوان بريدك الإلكتروني وكلمة المرور.

Bet: وصول مضمون إلى المراهنات وسحب الأرباح بأمان

تنزيل 1xbet Apk يمنحك تحكماً كاملاً في كل مزايا الموقع — من الألعاب الحية، إلى الكازينو المباشر، إلى الرهانات السريعة. هل تبحث عن أفضل تجربة مراهنات رياضية أو ألعاب كازينو؟ تطبيق 1xbet هو خيارك الأمثل. من خلال تنزيل 1xbet عبر الرابط الرسمي، ستحصل على وصول آمن وسريع إلى أحدث العروض والألعاب الأكثر شهرة وإثارة. يسمح تطبيق 1xBet لملايين اللاعبين من جميع أنحاء العالم بوضع رهانات سريعة على الألعاب الرياضية من أي مكان في العالم! لن يستغرق تنزيل وتثبيت برنامج الهاتف المحمول من One X على الأندرويد الكثير من الوقت.

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

يقدم موقع 1xbet” “مكافآت مثيرة أخرى للمستخدمين المسجلين. قد تساعد عروض المكافآت هذه اللاعبين على كسب المزيد وتمنحهم أيضًا الفرصة للعب أحداث مختارة مجانًا. تأكد من تسليم رصيد المكافأة مع الرهانات التراكمية خمس مرات، عن طريق تحديد ثلاثة أحداث أو أعلى.

برنامج خاصّ

ومع ذلك، هناك أيضًا بعض العيوب عند تنزيل هذا التطبيق على جهاز الكمبيوتر الخاص بك. وأكبرها هو أنه يمكن أن يشكل ضغطًا على أجهزة الكمبيوتر ذات الأداء المنخفض. عليك أيضًا أن تخصص وقتًا لتحميل 1xBet اخر إصدار، حيث تظهر التحديثات في كثير من الأحيان. ومع ذلك، يعتقد العديد من اللاعبين أن الوصول غير المحدود للمراهنة الذي يقدمه البرنامج يفوق هذه العيوب. قبل أن” “تتمكن من تثبيت تطبيق الهاتف المحمول 1xbet على جهاز iOS أو iPhone الخاص بك، يجب عليك أولاً السماح بتثبيت التطبيق على جهازك من الإعدادات.

من المهم استخدام وسيلة الدفع التي أنت مالكها شخصيًا فقط. على سبيل المثال، قامت العديد من الدول بحظر مواقع المقامرة في جميع أنحاء الاتحاد الأوروبي ما لم تكن مسجلة على وجه التحديد لدى الحكومة المختصة. نظرًا لأن موقع 1xBet لديه ترخيص كوراكاو، فإن هذه الدول لا تسمح بذلك. لا يهم إذا كان لديك تطبيق 1xBet أو تركيا أو حتى 1xBet المغرب. مش لازم تلف وتدور على مواقع شغالة أو تقلق من الحجب، مع تطبيق أندرويد هتقدر تدخل على حسابك في أي وقت ومن أي مكان بدون مشاكل. الدليل ده فيه كل الخطوات المطلوبة لتغيير إعدادات App Shop حسب بلدك، علشان تقدر تنزل التطبيق حتى لو كان في حظر في بلدك العربي.”

قم بتنزيل ملف Apk

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

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

من أين يمكن الحصول على ملفات تثبيت 1xbet Android Apk (على الموقع أو موقع الرهان)

إذا كنت تستخدم أجهزة من الجيل السابق، فقد لا يتم تشغيل التطبيقات ببساطة. و حقيقة الامر هو أن تطبيق المراهنة 1xBet له معايير محددة تمثلها متطلبات النظام. إذا كان جهازك جديدًا، فيمكن تثبت 1xbet دون أي مشاكل، وسيعمل بسلاسة. إذا كان لديك جهاز قديم، فمن الأفضل اختيار إصدار الهاتف المحمول 1xBet. عندما ظهر الإصدار 16. 3، كان أحد التحسينات الأكثر وضوحًا هو أن العرض أصبح أجمل بكثير.

  • هذا التطبيق المحمول يسمح  للاّعب بالمراهنة من أيّ مكان.
  • يرجى التأكد من التحقق من حسابك من رسالة التحقق من الحساب التي سترسلها وان اكس بت إلى عنوان البريد الإلكتروني الذي أدخلته أثناء التسجيل.
  • إنه مثل امتلاك أداة سريعة ومضمونة تضمن لك عدم تفويت أي فرص للمراهنة.
  • و الذي يكون مطلوب لفتح الوصول إلى العمليات المالية.
  • كل ما عليك فعله هو تجميع فريقين افتراضيين مع الأخذ في الاعتبار إحصائيات اللاعبين الحقيقيين.

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

تحميل Apk 1xbet على أندرويد: خطوات سريعة

بمجرد تحميل نسخة الهاتف المحمول من وان اكس بت بنجاح، يمكنك متابعة الرهان وإجراء المعاملات المالية من حسابك. يوجد قسم كامل لأولئك الذين يرغبون في المشاركة الكاملة في المراهنة على الرهان المشترك عبر الإنترنت. إذن، أنت لاعب نشط في 1xbet وتحرص على تحميل نسخة الهاتف المحمول وتثبيتها على جهازك الذكي، يرجى العلم أنه لا يمكنك تنزيل 1xbet apk من Google participate in.

  • فهو يجعل تجربة الرهان الخاصة بك أكثر سلاسة و كفاءة على جهازك الخاص PC و يمكنك من الوصول بسهولة إلى جميع الميزات التي يقدمها موقع 1xBet دون أي عقبات.
  • بالإضافة إلى ذلك، يتم تحديث التطبيق بانتظام ليعمل بشكل مثالي ويحافظ على أمان بيناتك.
  • ولهذا السبب قمنا بمراجعة جميع طرق التنزيل المتاحة وقمنا بتطوير التعليمات الخاصة بتثبيت البرنامج.
  • لن يستغرق تنزيل وتثبيت برنامج الهاتف المحمول من One X على الأندرويد الكثير من الوقت.
  • اولا قم بـ تحميل 1xbet اخر اصداريتيح” “لك التطبيق المراهنة مباشرة وقبل المباراة؛ هناك عمليات بث الفيديو.

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

التسجيل في تطبيق جوال 1xbet

بشكل عام، يعتبر التنقل في الموقع بديهيًا للغاية ويسهل على اللاعبين المشاركة فيه. إذا قمت بتنفيذ كافة الإجراءات التي ذكرناها أعلاه، فسوف تستنتج أن شركة المراهنة 1xbet لديها أساس تشغيلي متين. تمتلك شركة المراهنة فريقًا تقنيًا متطورًا يشرف على الوظائف التشغيلية للموقع. قبل أن تتمكن من تفعيل المكافأة الترحيبية، يجب أن تكون قد قمت بالإيداع الأول. عند الانتهاء من إيداعك الأول، سيتم تحويل المكافأة الترحيبية” “الخاصة بك إلى حساب المكافأة الخاص بك.

في حالة iPhone وiPad، يكون الأمر أكثر تعقيدًا بعض الشيء، حيث لا يمكنك تنزيل التطبيق إلا باستخدام خدمة الألعاب في App Shop. الزر الذي يحمل شعار العلامة التجارية في قسم برامج الهاتف المحمول على الموقع الرسمي لشركة المراهنات سيعيد توجيهك إلى هناك. كما أن توفر تحميل تطبيق الهاتف المحمول 1xbet لأجهزة Google android وiOS يجعل اللعب سلسًا للاعبين. يمكن للاعبين التواجد في أي مكان في العالم وإجراء المعاملات المالية والتنبؤ والمراهنة على الأحداث أو الألعاب الرياضية المفضلة لديهم. لا يحتاجون إلى الوصول إلى جهاز كمبيوتر للعب الألعاب على موقع 1xbet الرسمي.

تحميل 1xbet نسخة الجوال

إذا كان لديك جهاز يعمل بنظام الاندرويد وترغب في تنزيل تطبيق لنظام اندرويد، فلن تتمكن من العثور عليه في متجر جوجل بلاي. لسوء الحظ، نظرًا للقيود التي يفرضها متجر جوجل بلاي ، لا تتوفر جميع تطبيقات المقامرة. لا يزال بإمكانك الاستمتاع بالمراهنة على 1xBet على جهازك المحمول الذي يعمل بنظام الاندرويد. يرجى الذهاب إلى الموقع الإلكتروني أو متجر التطبيقات لتحميل تطبيق الجوال. أدخل اسم تطبيق xbet للجوال 1xbet في مربع البحث في متجر التطبيقات، حدده ثم انقر فوق الزر ”تنزيل“. لقد كانت شركة المراهنات 1xBet رائدة في تصنيف أفضل موارد المراهنات على الإنترنت مع المراهنات الرياضية وغيرها من وسائل الترفيه في القمار لسنوات عديدة.

يقوم وان اكس بت بشكل متكرر بترقية برامجه لإصلاح الأخطاء في تطبيقات الهاتف المحمول الخاصة به، لمنع التطبيق من التعطل. تعتبر الترقيات جيدة لأنها توفر طبقة إضافية من الأمان من المتسللين. ميزة أخرى مثيرة للاهتمام لاستخدام منصة المراهنة 1xbet هي أنك لا تحتاج إلى امتلاك هاتف ذكي يعمل بنظام Android أو جهاز يعمل بنظام iOS لاستخدام موقع 1xbet. من خلال إصدار موقع ويب مخصص للهواتف المحمولة، تكون قد أجريت أي معاملة مراهنة على الموقع. تشبه الميزات الموقع الرئيسي، لذا فهذه ميزة للاعبي 1xbet المخلصين. ولو بتحب تراهن على ألعاب الكازينو، التطبيق بيديك فرصة تلعب مع موزعين لايف في ألعاب زي الروليت الروسي، البلاك جاك 21، Wheel of Fortune، وغيرهم كتير.

كيفية تثبيت تطبيق الـ Android

و بدلا من ذلك يمكنك تسجيل الدخول إلي ملفك الشخصي 1xbet iPhone عبر بياناتك الشخصية و التي استخدمتها من قبل أثناء التسجيل. كما يمكنك تسجيل إجراء تسجيل الهاتف المحمول 1xbet mobile registration. أصدرت شركة المراهنات برنامجًا مجانيًا للهاتف المحمول لنظام Android ويمكن تنزيل التطبيق من مصادر رسمية. تحتوي هذه المقالة على معلومات حول كيفية تنزيل التطبيق بأمان وتجنب أخطاء التثبيت. في هذا الدليل الشامل، سوف تستكشف تطبيقات 1xBet لآجهزة الاندرويد و الايفون و الويندوز.

كما يمكن العثور على روابط للتطبيق في القائمة السفلية للموقع لراحة المستخدمين. النسخة المحمولة من 1xbet تمنح اللاعبين واجهة تنقل سلسة لإجراء المعاملات المالية. إن تثبيت تطبيق 1xBet ، والذي يطلق عليه 1xWin، على جهاز الكمبيوتر الخاص بك الذي يعمل بنظام ويندوز يشبه الحصول على بدلة مصممة خصيصًا لتناسب احتياجات الرهان الخاصة بك. فهو يجعل تجربة الرهان الخاصة بك أكثر سلاسة و كفاءة على جهازك الخاص PC و يمكنك من الوصول بسهولة إلى جميع الميزات التي يقدمها موقع 1xBet دون أي عقبات. إنه مثل امتلاك أداة سريعة ومضمونة تضمن لك عدم تفويت أي فرص للمراهنة. بالإضافة إلى ذلك، يتم تحديث التطبيق بانتظام ليعمل بشكل مثالي ويحافظ على أمان بيناتك.

ازاي احمل 1xbet في مصر؟

الموقع الرسمي للمراهن يظل المصدر الرئيسي للألعاب، لكن هناك أيضًا إمكانية لوضع الرهانات على الأحداث الرياضية ولعب الألعاب القمارية من الأجهزة المحمولة. لهذا، من الضروري تنزيل وتثبيت التطبيق الخاص بـ1xbet على جهاز يعمل بنظام التشغيل أندرويد. يمكن العثور على التطبيق الرسمي المحمول لـ1xBet وتحميله مجانًا. لتحميل التطبيق المحمول 1xbet على أجهزة تعمل بنظام التشغيل أندرويد للمستخدمين في مصر، يجب الانتقال إلى الموقع الرسمي لشركة المراهنات. ملف التثبيت متاح على الصفحة” “الرئيسية، حيث يمكن تحميله وتثبيته على الهاتف الذكي أو الجهاز اللوحي. الرابط إلى التطبيق المحمول موضوع في قسم خاص بالموقع، معلم بالأيقونة المناسبة.

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

مكان تنزيل 1x على Android

وسوف تتعرف على كيفية تنزيلها وتثبيتها في مصر، مع التركيز على مزاياها. بالإضافة إلى ذلك، ستتعرف على نسخة الهاتف المحمول من موقع 1xBet وفوائدها و سيعطيك معلومات عن برنامج 1xBet. أولاً، هل” “يتم تنزيل تطبيق 1xbet بسرعة؟ ولسوء الحظ، سيكون تنزيله أبطأ من العديد من التطبيقات الأخرى لأنه غير متوفر على Google Play. وبالتالي، سوف تحتاج إلى تغيير إعدادات هاتفك، مما يستغرق المزيد من الوقت. ثانيا هل التطبيق نفسه سريع؟ بشكل عام، هذا ما تتوقعه من تطبيق الرهان. ومع ذلك، تعتمد سرعة التطبيق على العديد من العوامل، بما في ذلك قوة الإنترنت ومساحة التخزين وجودة الهاتف.

  • تشبه الميزات الموقع الرئيسي، لذا فهذه ميزة للاعبي 1xbet المخلصين.
  • التطبيق يعمل بكفاءة على أجهزة Android، ويوفر تجربة استخدام مستقرة وسريعة.
  • مش لازم تلف وتدور على مواقع شغالة أو تقلق من الحجب، مع تطبيق أندرويد هتقدر تدخل على حسابك في أي وقت ومن أي مكان بدون مشاكل.
  • يمكن تنزيل البرنامج على الجهاز المحمول بتحميله من الصفحة الرسمية لشركة المراهنات.
  • من خلال التطبيق ده، تقدر تتابع عدد كبير من البطولات والمباريات على موبايلك iOS.
  • تعتبر الترقيات جيدة لأنها توفر طبقة إضافية من الأمان من المتسللين.

عادةً ما يأتي هؤلاء اللاعبون من خلال رابط إحالة يقدمه لهم مروجو البرنامج التابع لشركة 1xbet. يكسب مروجو البرامج التابعة الأموال من العمولات الناتجة عندما تسجل إحالاتهم باستخدام الرابط المباشر أو الرمز الترويجي الخاص بهم. تحتاج إلى العثور على زر للانتقال إلى القسم الذي يحتوي على تطبيق الهاتف المحمول. اولا قم بـ تحميل 1xbet اخر اصداريتيح” “لك التطبيق المراهنة مباشرة وقبل المباراة؛ هناك عمليات بث الفيديو. الألعاب السيبرانية؛ إحصاءات عن الأحداث الرياضية؛ حساب شخصي كامل مع حساب والمزيد.

البحث عن ملف Apk على صفحة المراهن

في هذه الحالة، تحتاج إلى زيارة إعدادات الجهاز، وبالتحديد القسم المخصص لأمان النظام. بتثبيت الكازينو المحمول، ستتاح لك جميع مزايا المنصة. يمكنك إنشاء حساب في ثوانٍ، اللعب من المكان الذي يريحك، الحصول على مكافآت شخصية، والمزيد. ما هو البث المباشر في1xbet ؟ انه موجود في التطبيق حيث يتم توفير فرصة استخدام ميزة 1xZone و الذي يجعل من الممكن مراقبة جميع المباريات و عرض تلك النتائج او غيرها.

  • إذا قمت بتنفيذ كافة الإجراءات التي ذكرناها أعلاه، فسوف تستنتج أن شركة المراهنة 1xbet لديها أساس تشغيلي متين.
  • يرجى الذهاب إلى الموقع الإلكتروني أو متجر التطبيقات لتحميل تطبيق الجوال.
  • تمامًا كما هو الحال مع تطبيق Android، إذا كان لديك جهاز iOS، فيمكنك الانتقال إلى إصدار الجوال من الموقع الإلكتروني 1xBet والتمرير لأسفل الشاشة وتحديد “تطبيقات الجوال”.

الجدول الموضح ادناه يبين نوع الهاتف المحمول الذي تحتاجه للحصول علي التطبيق. يرجي ملاحظه أن تنزيل 1xbet علي نظام iPhone يتطلب تنزيل 1xbet علي نظام iOS. بمعني آخر تحميل تطبيق 1xbet للآيفون. يدعم وان اكس بت عروض البرامج التابعة للاعبين الجدد.

توصيف الشاشة الرئيسية لتطبيق 1xbet لنظام Android و تنزيل 1xbet للاندرويد

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

  • هل تبحث عن أفضل تجربة مراهنات رياضية أو ألعاب كازينو؟ تطبيق 1xbet هو خيارك الأمثل.
  • عليك فتح هذا المتجر الإلكتروني، البحث عن اسم التطبيق والانتقال إلى صفحة تحميل البرنامج.
  • إنّ هذا التّطبيق خاصّ بمشاهدة الأفلام والمسلسلات من هاتفك الذّكيّ ومن دون إعلانات.
  • يمكن للاعبين الجدد المطالبة بما يصل إلى جنيه مصري (للمراهنات الرياضية) وما يصل إلى و210 دورة مجانية (للمراهنات في الكازينو).
  • و حقيقة الامر هو أن تطبيق المراهنة 1xBet له معايير محددة تمثلها متطلبات النظام.
  • عند الانتهاء من إيداعك الأول، سيتم تحويل المكافأة الترحيبية” “الخاصة بك إلى حساب المكافأة الخاص بك.

سيمنح هذا للمستخدم الفرصة لزيادة مبلغ الحد الأقصى إلى 520 دولارًا (25000 جنيه مصري). سيتم تحويل الأموال إلى الحساب خلال 24 ساعة بعد إيداع الإيداع. انتقل إلى المنصة الرسمية لـتحميل 1xBet اخر إصدار للأجهزة التي تعمل بنظام Android وiOS. يمكنك اختيار أو انشاء مجلد “قائمة ابدأ” لتثبيت التطبيق.

]]>
تسجيل دخول 1xbet 󾓝 التسجيل في 1xbet: تعليمات مفصلة https://bragitrade.com/index.php/2025/05/02/tsjyl-dkhwl-1xbet-ltsjyl-fy-1xbet-tlymt-mfsl/ Fri, 02 May 2025 00:57:40 +0000 https://bragitrade.com/?p=8340

تسجيل دخول 1xbet كيفية تسجيل الدخول في 1xbet بسهولة وسرعة”

Content

من المهم ملاحظة أن اختيار العملة يتم أثناء عملية التسجيل; سيكون من المستحيل تغيير العملة لاحقًا. شركة المراهنات 1xbet هي شركة نشطة لا تهدف فقط إلى جذب لاعبين جدد, ولكن أيضًا للاحتفاظ بالمستخدمين ذوي الخبرة. إذا كنت لا تزال غير متأكد من أي من العروض الترويجية اثنين تفضل, النظام سوف يعطيك فرصة للتسجيل ومن ثم تحديد الترقية التي تريدها.

يوجد في قسم البث المباشر العديد من الأحداث من عالم الرياضة, ويمكن للعملاء المراهنة على الفور. الجانب الأيمن هو منطقة عمل المستخدم, حيث تتوفر معلومات حول الحساب. في حالة نسيان كلمة المرور الخاصة بك، يوفر 1XBET طرقًا سهلة لاستعادتها. يجب عليك اتباع بعض الخطوات البسيطة لإعادة تعيين كلمة المرور واستعادة الوصول إلى حسابك. يوفر التفويض الوصول إلى تبادل الرهان ، وهو قسم به ماكينات القمار وفتحات حديثة.

الأفكار النهائية حول التسجيل في 1xbet

كل ما عليك فعله هو اختيار عملتك المفضلة, تحديد بلدك وإدخال الرمز الترويجي إذا كان لديك واحد. الآن بعد أن تعرفت على سبب أهمية إكمال تسجيل حساب 1xBet الخاص بك، دعنا نستكشف كل طريقة من طرق التسجيل ونقدم لك دليلًا خطوة بخطوة حول كيفية إعداد حسابك. على سبيل المثال، يمكن للاعبين الحصول على أموال إضافية للمراهنة النشطة أو المشاركة في اليانصيب بجوائز قيمة. هناك أيضًا أكواد ترويجية يمكن استخدامها لتفعيل العروض الخاصة. بفضل هذه التعليمات المفصلة وشرح المصطلحات الأساسية والنصائح المهمة، ستتمكن من معرفة 1xBetكيفية إنشاء حساب جديد للمبتدئين في غضون دقائق قليلة. يقبل المراهن استلام القسائم مع الرهانات المباشرة في ثوانٍ معدودة.

  • يمكنك التسجيل من خلال أي شبكة اجتماعية بالضغط على الزر المناسب.
  • من المهم ملاحظة أن مالكي الحساب هم فقط المستخدمين الذين قاموا بالتسجيل في النظام.” “[newline]إذا قام المستخدم بتسجيل الدخول لأول مرة, وقت الوصول إلى الحساب سيكون محدودًا, بالإضافة إلى قائمة الوظائف التي يمكن استخدامها.
  • للسحب إلى بطاقتك المصرفية, يجب أن تلعب المبلغ الكامل للنقاط خمس مرات عن طريق سريع.
  • بعد إكمال هذه الخطوات، يتمكن المستخدم من الوصول إلى حسابه.
  • تأكد من إدخال البريد الإلكتروني وكلمة المرور بشكل صحيح لتجنب أي مشكلات في تسجيل الدخول.

للحفاظ على أمان حساب 1xbet، من المهم أن تتبع بعض النصائح والإرشادات الأساسية. أولاً، يجب أن تستخدم كلمات مرور قوية وغير متوقعة، والتي لا يمكن لأي شخص آخر معرفتها. يجب أن ت包含 كلمات المرور على الأقل 6 أحرف، وتشمل أحرف كبيرة وصغيرة وأرقام ورموز خاصة. بالإضافة إلى ذلك، يجب أن تغير كلمات المرور كل فترة زمنية معينة، مثل كل 3 أشهر، لمنع أي محاولة للاختراق 1xbet maroc.

كيفية تسجيل دخول1xbet ؟

1xBet تسجيل الدخول يتيح لكم التسجيل في البطولات، تحقيق المراكز الأولى والحصول على مكافآت قيمة. تسجيل الدخول 1xBet متوفر للمشتركين من أي بلد في العالم بما في ذلك الدول العربية. يتمتع العملاء بإمكانية اختيار اللغة الأفضل لهم من بين 37 لغة متاحة على صفحة الموقع. توفر هذه الميزة للمراهنين فرصة للاطلاع على التحديثات وأحدث الأخبار في مجال المراهنة بلغتهم المحلية والاستفادة من جميع العروض الترويجية. يمكن للمستخدمين الوصول إلى تطبيق الاندرويد مباشرة من عنوان الموقع الرسمي ل 1xBet أو العثور على تطبيق iOS على متجر التطبيقات.

  • البرنامج القابل للتحميل يتيح توفير طاقة البطارية وتفعيل الوضع الداكن للواجهة.
  • ميزة أخرى هي أن الشركة توفر لك عدة طرق للتسجيل في 1xBet, وحتى يكون لديك خيار استخدام حسابك على شبكة اجتماعية لتوفير نفسك من المتاعب من ملء المعلومات.
  • كما تلاحظ, قبل أن تتمكن من التسجيل, النظام الأساسي نفسه سيطلب منك قراءة المزيد عن اللوائح.
  • يمكن لكل لاعب أن يجد ما يستمتع به، بدءاً من ماكينات السلوتس الكلاسيكية وحتى الألعاب الحية المثيرة.

بالإضافة إلى ذلك، قناة Telegram الخاصة بهم توفر معلومات قيمة حول النتائج والاحتمالات، بالإضافة إلى عروض المكافآت والترقيات. هناك عدة طرق لتسجيل الدخول، كلها آمنة وسهلة الاستخدام، وسنقوم بشرح كل طريقة على حدة. أو, إذا كنت تريد, يمكنك إدخال بياناتك الشخصية في حسابك بعد التسجيل نفسه.

تسجيل الدخول 1xbet

يمكن للمراهنين من جميع أنحاء العالم تسجيل الدخول في المغرب 1xBet من خلال جميع أنواع الأجهزة. فيمكنهم تشغيل أي تطبيق احترافي من الهاتف الهاتف المحمول والأجهزة اللوحية. يمكن للمراهنين الذين يستخدمون هواتف iOS استخدام ت 1xBet app لأجهزة IOS. كما يمكنهم أيضًا استخدام نظام أندرويد وويندوز بدون أي مشكلة. توفير معلومات الاتصال بفريق دعم عملاء 1xbet هو أمر ضروري لجميع المستخدمين الذين يواجهون مشاكل أو لديهم أسئلة حول الخدمات المقدمة.

  • يمكنك مشاهدة مباريات الفرق المفضلة لديك ووضع الرهانات على المفضلين لديك مباشرة في دفتر الرهانات الرياضية للمراهن.
  • يعتمد حجم مكافأة الإيداع على مبلغ إيداعك الأولي، ولكن الحد الأقصى للمبلغ الذي يمكنك الحصول عليه بموجب عرض الترحيب هو جنيه مصري.
  • شعبية دائما استخدام البطاقات المصرفية, أنظمة الدفع الإلكتروني,” “إعادة الشحن من خلال مشغل الهاتف المحمول, تحويل مصرفي مباشر.
  • في النسخة الكاملة من الموقع, تقع لوحة الاختيار على يسار حقول التسجيل.
  • إذا كنت” “ترغب في التسجيل بسرعة ، فمن الأفضل إعطاء الأفضلية للطرق الأخرى.

هنا مرة أخرى هو اسم المستخدم في شكل رمز رقمي وكلمة مرور تتكون من أرقام وأحرف. يقدم قسم ماكينات السلوتس العديد من ماكينات السلوتس ذات السمات والآليات المختلفة. يمكن للاعبين الاستمتاع بماكينات سلوتس كلاسيكية ثلاثية البكرات بالإضافة إلى ماكينات سلوتس فيديو حديثة ذات رسومات نابضة بالحياة وجولات إضافية مثيرة.

فوائد التسجيل بنقرة واحدة في 1xbet

يقوم اللاعبون بوضع توقعاتهم الخاصة على نتائج المباراة ويقومون برهان مربح لأنفسهم. تحتل شركة 1xBet المركز الأول في تصنيف أفضل شركات المراهنات. احفظ اسمي، بريدي الإلكتروني، والموقع الإلكتروني في هذا المتصفح لاستخدامها المرة المقبلة في تعليقي.

  • في عالم المراهنات الرياضية، تحتل شركة المراهنات 1xBet مكانة خاصة، حيث تقدم لمستخدميها مجموعة واسعة من الفرص والظروف الجذابة.
  • ال “نقرة واحدة” يتيح لك الخيار إجراء تسجيل 1xbet حرفيًا بنقرة واحدة على الفأرة أو لوحة اللمس.
  • لدى اللاعبين العديد من الخيارات للاختيار بين شركات المراهنات.
  • توفر المنصة مجموعة واسعة من خيارات وضع رهان، مما يسمح للمستخدمين بتصميم استراتيجياتهم حسب تفضيلاتهم.
  • سيتم إرسال رابط إلى عنوان البريد الإلكتروني المحدد حيث يجب أن تذهب لإنهاء التسجيل والتحقق من المستخدم.

وهو مثالي للمستخدمين الذين يرغبون في البدء فورًا دون تقديم الكثير من المعلومات. نحن نقدم للمستخدمين مجموعة واسعة من فرص المراهنات الرياضية. تشتهر المنصة بتنوع أحداثها الرياضية وأنواع الرهانات التي تقدمها، مما يجعلها خياراً مثالياً لكل من اللاعبين المبتدئين وذوي الخبرة. أحد العروض الأكثر شعبية هي مكافأة الترحيب، المتاحة للاعبين الجدد عند التسجيل.

عملية التسجيل في 1xbet وتسجيل الحساب وتسجيل الدخول إلى 1xbet

إلى جانب تقديم الخدمة على موقعها الرسمي على الإنترنت، تقدم 1xBet أيضًا نسخة الويب المحمولة وتطبيق Android وتطبيق iOS وتطبيق Windows PC. بالنسبة لأولئك الذين يتوقون إلى تجربة كازينو أصيلة وهم مرتاحون في منازلهم، فإن كازينو 1xBet المباشر سيغير قواعد اللعبة. فهو يجلب أجواء الكازينو الواقعية إلى شاشتك بشكل كامل مع موزعين مباشرين يستضيفون ألعابًا مثل الروليت والبوكر والبلاك جاك.” “[newline]ما يجعل التفاعل المباشر يضيف طبقة إضافية من الإثارة، فتصبح كل جلسة لعبة مغامرة غامرة للحواس. الرهان قبل المباراة، كما يوحي اسمها، يشير إلى الطريقة التقليدية للمراهنة حيث تتنبأ ا عادةً بالنتيجة قبل إجراء المباراة.

“إذا نسيت كلمة المرور الخاصة بك، فيمكنك دائمًا استعادتها باستخدام خاصية “نسيت كلمة المرور”. تتيح خاصية “نسيت كلمة المرور” على موقع 1xBet للمستخدمين إعادة تعيين كلمة المرور الخاصة بهم في حالة نسيانها. عندما يضغط المستخدم على هذه الوظيفة، تتم مطالبته بإدخال عنوان بريده الإلكتروني أو رقم الهاتف المرتبط بحسابه. يقوم موقع 1xBet بعد ذلك بإرسال رابط أو 1xBet رمز التسجيل إعادة تعيين كلمة المرور إلى البريد الإلكتروني أو رقم الهاتف. يمكن للمستخدمين الضغط على الرابط أو الرمز لإنشاء كلمة مرور جديدة.

تسجيل دخول 1xbet بسهولة إلى موقع المراهنات

سواء كنت مهتمًا بالمراهنات الرياضية أو ألعاب الكازينو أو ألعاب البث المباشر، فإن موقع الويب المخصص للهاتف المحمول يوفر لك كل ما تحتاجه. لن يفوتك أي شيء، ويمكنك الوصول إلى 1xBet بسهولة مباشرة من متصفح هاتفك المحمول. إنها طريقة خالية من المتاعب للاستمتاع بكل الإثارة والميزات التي يقدمها موقع 1xBet دون الحاجة إلى تنزيل أي تطبيقات. يقتصر التسجيل في 1xbet أو عبر بوابة الويب على حساب واحد فقط. بمعنى آخر، يمكن تسجيل حساب واحد فقط من عنوان IP واحد أيضًا. و يُسمح لكل مراهن بإتمام عملية تسجيل واحدة فقط.

  • ولكن إذا قمنا بتحليل الادعاءات في هذا الاتجاه، يصبح من الواضح أن “لاعبين الشركات المنافسة” وأصحاب الحسابات المتعددة فقط هم الذين يعبرون عن عدم الرضا.
  • إنه مُحسّن بشكل لا يصدق، مما يضمن حصولك على نفس الوظائف والراحة التي يوفرها التطبيق.
  • يوفر التفويض الوصول إلى تبادل الرهان ، وهو قسم به ماكينات القمار وفتحات حديثة.
  • شركة المراهنات 1xbet هي شركة نشطة لا تهدف فقط إلى جذب لاعبين جدد, ولكن أيضًا للاحتفاظ بالمستخدمين ذوي الخبرة.

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

كيف يمكنني التسجيل في 1xbet؟

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

  • بنقرة واحدة؛باستخدام البريد الإلكتروني؛عن طريق رقم الهاتفمن خلال الشبكات الاجتماعية.
  • نحن نوفر للمستخدمين تجربة متنوعة وجذابة في قسم الكازينو.
  • فهو يقدم أنواعًا مختلفة من الأساليب لجعل تجربة المستخدمين سلسة قدر الإمكان.
  • 1xBet، الاسم المرادف لعالم المراهنة والألعاب عبر الإنترنت، يمثل قوة ديناميكية ومبتكرة في هذه الصناعة.

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

الوصول إلى مجموعة واسعة من الألعاب والمراهنات”

وسوف تسمح لك لتحديد اسم المستخدم وكلمة المرور المطلوبة بحيث لم يكن لديك لتذكر تركيبات ولدت تلقائيا. إذا كنت تفضل ربط حساب 1xBet الخاص بك بملفاتك الشخصية على وسائل التواصل الاجتماعي، فيمكنك اختيار خيار التسجيل في 1xBet عبر شبكات التواصل الاجتماعي. غالبًا ما يستخدم اللاعبون النسخة المحمولة لـتسجيل الدخول 1xBet. بهذه الطريقة، يمكنك إجراء الرهانات أو اللعب على الفتحات من هاتفك الذكي أو جهازك اللوحي. ارتقوا إلى مستويات جديدة واحصلوا على دورات مجانية، استرداد” “نقدي، ومزايا أخرى ممتعة.

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

كيفية سحب الأرباح من 1xbet ؟

يمكن أن تصبح عميلاً لهذه المنصة الترفيهية فقط بعد بلوغ سن الرشد (18 عامًا). من المهم عدم نسيان كلمة المرور وأفضل حل هو حفظ المجموعة في عدة أماكن يصعب الوصول إليها. سيؤدي ذلك إلى الحد من تأثير المحتالين وحفظ البيانات للترخيص.

  • عندما يتعلق الأمر بتسجيل الدخول إلى حسابك عبر البريد الإلكتروني، فإنه من المهم أن تتبع الخطوات الأمنية الصحيحة لضمان حماية حسابك من أي مخاطر محتملة.
  • تساعد التحديثات المنتظمة للتطبيق في القضاء على الثغرات الأمنية وتعزيز الأمن.
  • يمكنك تنزيل التطبيق لأجهزة Android و iPhone من المصدر الرسمي لـ 1xbet.
  • سيعرض النظام حفظ الرقم ورمز الوصول على جهازك بتنسيق ملف أو صورة أو إرسال هذه المعلومات إلى بريد إلكتروني.

بالإضافة” “إلى المفرد المعتاد أو السريع, من الممكن عمل رهان متعدد أو مضاد سريع. في كثير من الأحيان قد تطلب خدمة الأمن 1xbet من المستخدم تقديم جوازات سفر إلكترونية مكررة مع صورة. في وقت التحقق, يجب تلبية متطلبات الصورة, والتي يجب أن تكون مماثلة لتلك الموجودة في البنوك عند إصدار البطاقات. اليوم، توفر شركة 1xbet دخولاً مبسطًا إلى الحساب الشخصي. نحن نقدم إصدارات مختلفة من هذه اللعبة الشهيرة، بما في ذلك الروليت الأوروبية والأمريكية والفرنسية.

Bet التسجيل السريع بنقرة واحدة

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

  • تتيح خاصية “نسيت كلمة المرور” على موقع 1xBet للمستخدمين إعادة تعيين كلمة المرور الخاصة بهم في حالة نسيانها.
  • في هذه الحالة, النظام الأساسي تلقائيا بإنشاء اسم مستخدم لك في شكل رمز من ثمانية أرقام وكلمة مرور ثمانية أحرف.
  • هناك أيضًا أكواد ترويجية يمكن استخدامها لتفعيل العروض الخاصة.
  • في النهاية، يعتبر إنشاء حساب على موقع 1xBet في مصر عملية مباشرة تتضمن عدة خطوات، بدءًا من التسجيل وحتى التحقق وتمويل حسابك.
  • من احتمالات الرهانات مكان الزائدة/الأقل إلى الهانديكاب والمزيد، يضمن تنوع أنواع الرهانات وجود دائما أسلوب رهان يناسب الجميع.
  • تتميز الشعبية بوجود مجموعة كبيرة من المراهنات الرياضية, معاملات عالية وواجهة مريحة وسهلة الفهم لمورد الويب الرسمي.

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

قم بتسجيل الدخول بنفسك: أصبحت عمليات تسجيل الدخول إلى 1xbet بسيطة

في نفس الوقت, لديه كل الخيارات والميزات اللازمة لإدارة النتيجة, الرهانات والحساب. يحتوي موقع الشركة الرئيسي على جميع المعلومات الضرورية التي يحتاجها المستخدم وقت اللعبة. ينصح فريقنا دائما القراء بقراءة شروط وأحكام جميع العروض بالتفصيل. كما تلاحظ, قبل أن تتمكن من التسجيل, النظام الأساسي نفسه سيطلب منك قراءة المزيد عن اللوائح. هناك ستجد قواعدك والتزاماتك كمستخدم ومعرفة المزيد عن التزامات وكيل المراهنات تجاهك.

من المهم ملاحظة أن مالكي الحساب هم فقط المستخدمين الذين قاموا بالتسجيل في النظام.” “[newline]إذا قام المستخدم بتسجيل الدخول لأول مرة, وقت الوصول إلى الحساب سيكون محدودًا, بالإضافة إلى قائمة الوظائف التي يمكن استخدامها. إذا كان العميل قد سجل مسبقا, الشيء الوحيد المتبقي هو إدخال اسم المستخدم وكلمة المرور وتسجيل الدخول إلى الموقع. يؤدي إنشاء حساب في 1xBet أيضًا إلى الحفاظ على أمن بياناتك. تتم حماية معلوماتك الشخصية والمالية عن طريق التشفير وإجراءات الأمان الأخرى، مما يقلل من مخاطر الوصول غير المصرح به أو الاحتيال. علاوة على ذلك، فإن وجود1xBet حساب جديد يسمح لك بإدارة رهاناتك ومعاملاتك بكفاءة.

قبل التسجيل مع 1xbet

توفر المنصة مجموعة واسعة من خيارات وضع رهان، مما يسمح للمستخدمين بتصميم استراتيجياتهم حسب تفضيلاتهم. من احتمالات الرهانات مكان الزائدة/الأقل إلى الهانديكاب والمزيد، يضمن تنوع أنواع الرهانات وجود دائما أسلوب رهان يناسب الجميع. لدى اللاعبين العديد من الخيارات للاختيار بين شركات المراهنات. ولكن إذا كنت ترغب في المراهنة بأعلى الاحتمالات في أكثر شركة آمنة، فمن الأفضل التسجيل في 1xBet. هذا هو bookmaker شهير وآمن يقبل اللاعبين من مصر والدول العربية الأخرى. إن التسجيل بنقرة واحدة في 1xBet هو أسرع طريقة لإنشاء حساب 1xBet.

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

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

استمتع بمكافأة تسجيل الدخول في المغرب 1xbet

عند نسيت كلمة المرور، يمكن أن يصبح الأمر محيراً خاصةً إذا كنت لا تملك وصولاً إلى حسابك. ولكن لا داعي للقلق، فمعظم منصات التواصل الإجتماعي والبرامج تتيح لك إمكانية استعادة كلمة المرور عن طريق البريد الإلكتروني أو رقم الهاتف. ولهذا، من المهم أن تتأكد من توفير معلومات صحيحة عند التسجيل في أي منصة أو برنامج، وذلك لتجنب أي مشاكل في المستقبل. من أجل فتح حساب شخصي, سوف تحتاج إلى الذهاب إلى الموقع الرسمي للمكتب.

  • يمكن للمراهنين الذين يستخدمون هواتف iOS استخدام ت 1xBet app لأجهزة IOS.
  • ستحتاج إلى هذه الخطوة إذا كنت ترغب في سحب الأموال من حسابك أو المشاركة في أي من” “العروض الترويجية للمراهنات.
  • هنا مرة أخرى هو اسم المستخدم في شكل رمز رقمي وكلمة مرور تتكون من أرقام وأحرف.
  • التثبيت بسيط ومباشر، وتضمن الواجهة سهلة الاستخدام تجربة خالية من المتاعب.

بمجرد النقر عليه, سترى بعض الخيارات الممكنة اعتمادا على طريقة التسجيل التي تختارها. يتيح قسم 1xBet Live Casino للاعبين الانغماس في أجواء الكازينو الحقيقي دون مغادرة المنزل. يمكن للاعبين المشاركة في ألعاب مثل البلاك جاك والباكارات والروليت أثناء التفاعل مع الموزعين والمشاركين الآخرين عبر الدردشة. بعد إكمال هذه الخطوات، يتمكن المستخدم من الوصول إلى حسابه. فهو يقدم أنواعًا مختلفة من الأساليب لجعل تجربة المستخدمين سلسة قدر الإمكان. لحسن الحظ، لديك طريقة للتغلب على هذه المشكلة عند تشغيل 1xbet.

جميع المكافآت والعروض الترويجية

اتبع الخطوات القليلة التالية وفي النهاية سيكون لديك حساب محمول تم إنشاؤه. للدخول إلى الحساب الشخصي، يجب عليك القيام بإجراءات تسجيل سريعة وبسيطة، ثم إدخال اسم المستخدم وكلمة المرور الخاصة بك. بعد إكمال عملية التسجيل في 1xBet، يمكنك تسجيل الدخول إلى حسابك باستخدام عملية تسجيل الدخول إلى 1xBet.

  • بعد التحقق الناجح، يمكن للمستخدمين الوصول إلى جميع خدمات 1xBet ، مع العلم أن بياناتهم محمية.
  • – من هناك قم بالبحث عن أيقونة التسجيل في 1xbet ثم قم بالضغط عليها.
  • تتيح هذه الطريقة للمستخدمين الذين سجلوا باستخدام بريدهم الإلكتروني الوصول بسرعة إلى حساباتهم.
  • دعونا نلقي نظرة على كيفية التسجيل في 1xbet عبر الهاتف المحمول.

ومع ذلك ، لاستخدام التطبيق ، يجب أولاً تنزيله على هاتفك أو جهازك اللوحي. الآن لدى شركة المراهنات برنامج محمول لمنصتي برنامج – Android و iOS. يتم تنزيل التطبيق الأول من موقع شركة المراهنات، والثاني – من App Store. عملية تسجيل الحساب بسيطة للغاية ، وحتى الشخص الذي لم يسبق له زيارة بوابة اللعبة سيكون قادرًا على التعامل مع الإجراء دون مشاكل. لتنفيذ العملية” “، يمكنك استخدامها تسجيل الدخول للجوال 1xBet إصدار سطح المكتب أو البوابة الرسمية المألوفة للكثيرين.

]]>