/** * WooCommerce Customer Functions * * Functions for customers. * * @package WooCommerce\Functions * @version 2.2.0 */ use Automattic\WooCommerce\Enums\OrderInternalStatus; use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore; use Automattic\WooCommerce\Internal\Utilities\Users; use Automattic\WooCommerce\Utilities\OrderUtil; defined( 'ABSPATH' ) || exit; /** * Prevent any user who cannot 'edit_posts' (subscribers, customers etc) from seeing the admin bar. * * Note: get_option( 'woocommerce_lock_down_admin', true ) is a deprecated option here for backwards compatibility. Defaults to true. * * @param bool $show_admin_bar If should display admin bar. * @return bool */ function wc_disable_admin_bar( $show_admin_bar ) { /** * Controls whether the WooCommerce admin bar should be disabled. * * @since 3.0.0 * * @param bool $enabled */ if ( apply_filters( 'woocommerce_disable_admin_bar', true ) && ! ( current_user_can( 'edit_posts' ) || current_user_can( 'manage_woocommerce' ) ) ) { $show_admin_bar = false; } return $show_admin_bar; } add_filter( 'show_admin_bar', 'wc_disable_admin_bar', 10, 1 ); // phpcs:ignore WordPress.VIP.AdminBarRemoval.RemovalDetected if ( ! function_exists( 'wc_create_new_customer' ) ) { /** * Create a new customer. * * @since 9.4.0 Moved woocommerce_registration_error_email_exists filter to the shortcode checkout class. * @since 9.4.0 Removed handling for generating username/password based on settings--this is consumed at form level. Here, if data is missing it will be generated. * * @param string $email Customer email. * @param string $username Customer username. * @param string $password Customer password. * @param array $args List of arguments to pass to `wp_insert_user()`. * @return int|WP_Error Returns WP_Error on failure, Int (user ID) on success. */ function wc_create_new_customer( $email, $username = '', $password = '', $args = array() ) { if ( empty( $email ) || ! is_email( $email ) ) { return new WP_Error( 'registration-error-invalid-email', __( 'Please provide a valid email address.', 'woocommerce' ) ); } if ( email_exists( $email ) ) { return new WP_Error( 'registration-error-email-exists', sprintf( // Translators: %s Email address. esc_html__( 'An account is already registered with %s. Please log in or use a different email address.', 'woocommerce' ), esc_html( $email ) ) ); } if ( empty( $username ) ) { $username = wc_create_new_customer_username( $email, $args ); } $username = sanitize_user( $username ); if ( empty( $username ) || ! validate_username( $username ) ) { return new WP_Error( 'registration-error-invalid-username', __( 'Please provide a valid account username.', 'woocommerce' ) ); } if ( username_exists( $username ) ) { return new WP_Error( 'registration-error-username-exists', __( 'An account is already registered with that username. Please choose another.', 'woocommerce' ) ); } // Handle password creation. $password_generated = false; if ( empty( $password ) ) { $password = wp_generate_password(); $password_generated = true; } if ( empty( $password ) ) { return new WP_Error( 'registration-error-missing-password', __( 'Please create a password for your account.', 'woocommerce' ) ); } // Use WP_Error to handle registration errors. $errors = new WP_Error(); /** * Fires before a customer account is registered. * * This hook fires before customer accounts are created and passes the form data (username, email) and an array * of errors. * * This could be used to add extra validation logic and append errors to the array. * * @since 7.2.0 * * @internal Matches filter name in WooCommerce core. * * @param string $username Customer username. * @param string $user_email Customer email address. * @param \WP_Error $errors Error object. */ do_action( 'woocommerce_register_post', $username, $email, $errors ); /** * Filters registration errors before a customer account is registered. * * This hook filters registration errors. This can be used to manipulate the array of errors before * they are displayed. * * @since 7.2.0 * * @internal Matches filter name in WooCommerce core. * * @param \WP_Error $errors Error object. * @param string $username Customer username. * @param string $user_email Customer email address. * @return \WP_Error */ $errors = apply_filters( 'woocommerce_registration_errors', $errors, $username, $email ); if ( is_wp_error( $errors ) && $errors->get_error_code() ) { return $errors; } // Merged passed args with sanitized username, email, and password. $customer_data = array_merge( $args, array( 'user_login' => $username, 'user_pass' => $password, 'user_email' => $email, 'role' => 'customer', ) ); /** * Filters customer data before a customer account is registered. * * This hook filters customer data. It allows user data to be changed, for example, username, password, email, * first name, last name, and role. * * @since 7.2.0 * * @param array $customer_data An array of customer (user) data. * @return array */ $new_customer_data = apply_filters( 'woocommerce_new_customer_data', wp_parse_args( $customer_data, array( 'first_name' => '', 'last_name' => '', 'source' => 'unknown', ) ) ); $customer_id = wp_insert_user( $new_customer_data ); if ( is_wp_error( $customer_id ) ) { return $customer_id; } // Set account flag to remind customer to update generated password. if ( $password_generated ) { update_user_option( $customer_id, 'default_password_nag', true, true ); } /** * Fires after a customer account has been registered. * * This hook fires after customer accounts are created and passes the customer data. * * @since 7.2.0 * * @internal Matches filter name in WooCommerce core. * * @param integer $customer_id New customer (user) ID. * @param array $new_customer_data Array of customer (user) data. * @param string $password_generated The generated password for the account. */ do_action( 'woocommerce_created_customer', $customer_id, $new_customer_data, $password_generated ); return $customer_id; } } /** * Create a unique username for a new customer. * * @since 3.6.0 * @param string $email New customer email address. * @param array $new_user_args Array of new user args, maybe including first and last names. * @param string $suffix Append string to username to make it unique. * @return string Generated username. */ function wc_create_new_customer_username( $email, $new_user_args = array(), $suffix = '' ) { $username_parts = array(); if ( isset( $new_user_args['first_name'] ) ) { $username_parts[] = sanitize_user( $new_user_args['first_name'], true ); } if ( isset( $new_user_args['last_name'] ) ) { $username_parts[] = sanitize_user( $new_user_args['last_name'], true ); } // Remove empty parts. $username_parts = array_filter( $username_parts ); // If there are no parts, e.g. name had unicode chars, or was not provided, fallback to email. if ( empty( $username_parts ) ) { $email_parts = explode( '@', $email ); $email_username = $email_parts[0]; // Exclude common prefixes. if ( in_array( $email_username, array( 'sales', 'hello', 'mail', 'contact', 'info', ), true ) ) { // Get the domain part. $email_username = $email_parts[1]; } $username_parts[] = sanitize_user( $email_username, true ); } $username = wc_strtolower( implode( '.', $username_parts ) ); if ( $suffix ) { $username .= $suffix; } /** * WordPress 4.4 - filters the list of blocked usernames. * * @since 3.7.0 * @param array $usernames Array of blocked usernames. */ $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); // Stop illegal logins and generate a new random username. if ( in_array( strtolower( $username ), array_map( 'strtolower', $illegal_logins ), true ) ) { $new_args = array(); /** * Filter generated customer username. * * @since 3.7.0 * @param string $username Generated username. * @param string $email New customer email address. * @param array $new_user_args Array of new user args, maybe including first and last names. * @param string $suffix Append string to username to make it unique. */ $new_args['first_name'] = apply_filters( 'woocommerce_generated_customer_username', 'woo_user_' . zeroise( wp_rand( 0, 9999 ), 4 ), $email, $new_user_args, $suffix ); return wc_create_new_customer_username( $email, $new_args, $suffix ); } if ( username_exists( $username ) ) { // Generate something unique to append to the username in case of a conflict with another user. $suffix = '-' . zeroise( wp_rand( 0, 9999 ), 4 ); return wc_create_new_customer_username( $email, $new_user_args, $suffix ); } /** * Filter new customer username. * * @since 3.7.0 * @param string $username Customer username. * @param string $email New customer email address. * @param array $new_user_args Array of new user args, maybe including first and last names. * @param string $suffix Append string to username to make it unique. */ return apply_filters( 'woocommerce_new_customer_username', $username, $email, $new_user_args, $suffix ); } /** * Login a customer (set auth cookie and set global user object). * * @param int $customer_id Customer ID. */ function wc_set_customer_auth_cookie( $customer_id ) { wp_set_current_user( $customer_id ); wp_set_auth_cookie( $customer_id, true ); // Update session. if ( is_callable( array( WC()->session, 'init_session_cookie' ) ) ) { WC()->session->init_session_cookie(); } } /** * Get past orders (by email) and update them. * * @param int $customer_id Customer ID. * @return int */ function wc_update_new_customer_past_orders( $customer_id ) { $linked = 0; $complete = 0; $customer = get_user_by( 'id', absint( $customer_id ) ); $customer_orders = wc_get_orders( array( 'limit' => -1, 'customer' => array( array( 0, $customer->user_email ) ), 'return' => 'ids', ) ); if ( ! empty( $customer_orders ) ) { foreach ( $customer_orders as $order_id ) { $order = wc_get_order( $order_id ); if ( ! $order ) { continue; } $order->set_customer_id( $customer->ID ); $order->save(); if ( $order->has_downloadable_item() ) { $data_store = WC_Data_Store::load( 'customer-download' ); $data_store->delete_by_order_id( $order->get_id() ); wc_downloadable_product_permissions( $order->get_id(), true ); } do_action( 'woocommerce_update_new_customer_past_order', $order_id, $customer ); if ( $order->get_status() === OrderInternalStatus::COMPLETED ) { ++$complete; } ++$linked; } } if ( $complete ) { update_user_meta( $customer_id, 'paying_customer', 1 ); Users::update_site_user_meta( $customer_id, 'wc_order_count', '' ); Users::update_site_user_meta( $customer_id, 'wc_money_spent', '' ); Users::delete_site_user_meta( $customer_id, 'wc_last_order' ); } return $linked; } /** * Order payment completed - This is a paying customer. * * @param int $order_id Order ID. */ function wc_paying_customer( $order_id ) { $order = wc_get_order( $order_id ); $customer_id = $order->get_customer_id(); if ( $customer_id > 0 && 'shop_order_refund' !== $order->get_type() ) { $customer = new WC_Customer( $customer_id ); if ( ! $customer->get_is_paying_customer() ) { $customer->set_is_paying_customer( true ); $customer->save(); } } } add_action( 'woocommerce_payment_complete', 'wc_paying_customer' ); add_action( 'woocommerce_order_status_completed', 'wc_paying_customer' ); /** * Checks if a user (by email or ID or both) has bought an item. * * @param string $customer_email Customer email to check. * @param int $user_id User ID to check. * @param int $product_id Product ID to check. * @return bool */ function wc_customer_bought_product( $customer_email, $user_id, $product_id ) { global $wpdb; $result = apply_filters( 'woocommerce_pre_customer_bought_product', null, $customer_email, $user_id, $product_id ); if ( null !== $result ) { return $result; } /** * Whether to use lookup tables - it can optimize performance, but correctness depends on the frequency of the AS job. * * @since 9.7.0 * * @param bool $enabled * @param string $customer_email Customer email to check. * @param int $user_id User ID to check. * @param int $product_id Product ID to check. * @return bool */ $use_lookup_tables = apply_filters( 'woocommerce_customer_bought_product_use_lookup_tables', false, $customer_email, $user_id, $product_id ); $transient_name = 'wc_customer_bought_product_' . md5( $customer_email . $user_id . $use_lookup_tables ); if ( $use_lookup_tables ) { // Lookup tables get refreshed along with the `woocommerce_reports` transient version. $transient_version = WC_Cache_Helper::get_transient_version( 'woocommerce_reports' ); } else { $transient_version = WC_Cache_Helper::get_transient_version( 'orders' ); } $transient_value = get_transient( $transient_name ); if ( isset( $transient_value['value'], $transient_value['version'] ) && $transient_value['version'] === $transient_version ) { $result = $transient_value['value']; } else { $customer_data = array( $user_id ); if ( $user_id ) { $user = get_user_by( 'id', $user_id ); if ( isset( $user->user_email ) ) { $customer_data[] = $user->user_email; } } if ( is_email( $customer_email ) ) { $customer_data[] = $customer_email; } $customer_data = array_map( 'esc_sql', array_filter( array_unique( $customer_data ) ) ); $statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() ); if ( count( $customer_data ) === 0 ) { return false; } if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { $statuses = array_map( function ( $status ) { return "wc-$status"; }, $statuses ); $order_table = OrdersTableDataStore::get_orders_table_name(); $user_id_clause = ''; if ( $user_id ) { $user_id_clause = 'OR o.customer_id = ' . absint( $user_id ); } if ( $use_lookup_tables ) { // HPOS: yes, Lookup table: yes. $sql = " SELECT DISTINCT product_or_variation_id FROM ( SELECT CASE WHEN product_id != 0 THEN product_id ELSE variation_id END AS product_or_variation_id FROM {$wpdb->prefix}wc_order_product_lookup lookup INNER JOIN $order_table AS o ON lookup.order_id = o.ID WHERE o.status IN ('" . implode( "','", $statuses ) . "') AND ( o.billing_email IN ('" . implode( "','", $customer_data ) . "') $user_id_clause ) ) AS subquery WHERE product_or_variation_id != 0 "; } else { // HPOS: yes, Lookup table: no. $sql = " SELECT DISTINCT im.meta_value FROM $order_table AS o INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON o.id = i.order_id INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id WHERE o.status IN ('" . implode( "','", $statuses ) . "') AND im.meta_key IN ('_product_id', '_variation_id' ) AND im.meta_value != 0 AND ( o.billing_email IN ('" . implode( "','", $customer_data ) . "') $user_id_clause ) "; } $result = $wpdb->get_col( $sql ); } elseif ( $use_lookup_tables ) { // HPOS: no, Lookup table: yes. $result = $wpdb->get_col( " SELECT DISTINCT product_or_variation_id FROM ( SELECT CASE WHEN lookup.product_id != 0 THEN lookup.product_id ELSE lookup.variation_id END AS product_or_variation_id FROM {$wpdb->prefix}wc_order_product_lookup AS lookup INNER JOIN {$wpdb->posts} AS p ON p.ID = lookup.order_id INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' ) AND pm.meta_key IN ( '_billing_email', '_customer_user' ) AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' ) ) AS subquery WHERE product_or_variation_id != 0 " ); // WPCS: unprepared SQL ok. } else { // HPOS: no, Lookup table: no. // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared $result = $wpdb->get_col( " SELECT DISTINCT im.meta_value FROM {$wpdb->posts} AS p INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' ) AND pm.meta_key IN ( '_billing_email', '_customer_user' ) AND im.meta_key IN ( '_product_id', '_variation_id' ) AND im.meta_value != 0 AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' ) " ); // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared } $result = array_map( 'absint', $result ); $transient_value = array( 'version' => $transient_version, 'value' => $result, ); set_transient( $transient_name, $transient_value, DAY_IN_SECONDS * 30 ); } return in_array( absint( $product_id ), $result, true ); } /** * Checks if the current user has a role. * * @param string $role The role. * @return bool */ function wc_current_user_has_role( $role ) { return wc_user_has_role( wp_get_current_user(), $role ); } /** * Checks if a user has a role. * * @param int|\WP_User $user The user. * @param string $role The role. * @return bool */ function wc_user_has_role( $user, $role ) { if ( ! is_object( $user ) ) { $user = get_userdata( $user ); } if ( ! $user || ! $user->exists() ) { return false; } return in_array( $role, $user->roles, true ); } /** * Checks if a user has a certain capability. * * @param array $allcaps All capabilities. * @param array $caps Capabilities. * @param array $args Arguments. * * @return array The filtered array of all capabilities. */ function wc_customer_has_capability( $allcaps, $caps, $args ) { if ( isset( $caps[0] ) ) { switch ( $caps[0] ) { case 'view_order': $user_id = intval( $args[1] ); $order = wc_get_order( $args[2] ); if ( $order && $user_id === $order->get_user_id() ) { $allcaps['view_order'] = true; } break; case 'pay_for_order': $user_id = intval( $args[1] ); $order_id = isset( $args[2] ) ? $args[2] : null; // When no order ID, we assume it's a new order // and thus, customer can pay for it. if ( ! $order_id ) { $allcaps['pay_for_order'] = true; break; } $order = wc_get_order( $order_id ); if ( $order && ( $user_id === $order->get_user_id() || ! $order->get_user_id() ) ) { $allcaps['pay_for_order'] = true; } break; case 'order_again': $user_id = intval( $args[1] ); $order = wc_get_order( $args[2] ); if ( $order && $user_id === $order->get_user_id() ) { $allcaps['order_again'] = true; } break; case 'cancel_order': $user_id = intval( $args[1] ); $order = wc_get_order( $args[2] ); if ( $order && $user_id === $order->get_user_id() ) { $allcaps['cancel_order'] = true; } break; case 'download_file': $user_id = intval( $args[1] ); $download = $args[2]; if ( $download && $user_id === $download->get_user_id() ) { $allcaps['download_file'] = true; } break; } } return $allcaps; } add_filter( 'user_has_cap', 'wc_customer_has_capability', 10, 3 ); /** * Safe way of allowing shop managers restricted capabilities that will remove * access to the capabilities if WooCommerce is deactivated. * * @since 3.5.4 * @param bool[] $allcaps Array of key/value pairs where keys represent a capability name and boolean values * represent whether the user has that capability. * @param string[] $caps Required primitive capabilities for the requested capability. * @param array $args Arguments that accompany the requested capability check. * @param WP_User $user The user object. * @return bool[] */ function wc_shop_manager_has_capability( $allcaps, $caps, $args, $user ) { if ( wc_user_has_role( $user, 'shop_manager' ) ) { // @see wc_modify_map_meta_cap, which limits editing to customers. $allcaps['edit_users'] = true; } return $allcaps; } add_filter( 'user_has_cap', 'wc_shop_manager_has_capability', 10, 4 ); /** * Modify the list of editable roles to prevent non-admin adding admin users. * * @param array $roles Roles. * @return array */ function wc_modify_editable_roles( $roles ) { if ( is_multisite() && is_super_admin() ) { return $roles; } if ( ! wc_current_user_has_role( 'administrator' ) ) { unset( $roles['administrator'] ); if ( wc_current_user_has_role( 'shop_manager' ) ) { $shop_manager_editable_roles = apply_filters( 'woocommerce_shop_manager_editable_roles', array( 'customer' ) ); return array_intersect_key( $roles, array_flip( $shop_manager_editable_roles ) ); } } return $roles; } add_filter( 'editable_roles', 'wc_modify_editable_roles' ); /** * Modify capabilities to prevent non-admin users editing admin users. * * $args[0] will be the user being edited in this case. * * @param array $caps Array of caps. * @param string $cap Name of the cap we are checking. * @param int $user_id ID of the user being checked against. * @param array $args Arguments. * @return array */ function wc_modify_map_meta_cap( $caps, $cap, $user_id, $args ) { if ( is_multisite() && is_super_admin() ) { return $caps; } switch ( $cap ) { case 'edit_user': case 'remove_user': case 'promote_user': case 'delete_user': if ( ! isset( $args[0] ) || $args[0] === $user_id ) { break; } elseif ( ! wc_current_user_has_role( 'administrator' ) ) { if ( wc_user_has_role( $args[0], 'administrator' ) ) { $caps[] = 'do_not_allow'; } elseif ( wc_current_user_has_role( 'shop_manager' ) ) { // Shop managers can only edit customer info. $userdata = get_userdata( $args[0] ); $shop_manager_editable_roles = apply_filters( 'woocommerce_shop_manager_editable_roles', array( 'customer' ) ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment if ( property_exists( $userdata, 'roles' ) && ! empty( $userdata->roles ) && ! array_intersect( $userdata->roles, $shop_manager_editable_roles ) ) { $caps[] = 'do_not_allow'; } } } break; } return $caps; } add_filter( 'map_meta_cap', 'wc_modify_map_meta_cap', 10, 4 ); /** * Get customer download permissions from the database. * * @param int $customer_id Customer/User ID. * @return array */ function wc_get_customer_download_permissions( $customer_id ) { $data_store = WC_Data_Store::load( 'customer-download' ); return apply_filters( 'woocommerce_permission_list', $data_store->get_downloads_for_customer( $customer_id ), $customer_id ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment } /** * Get customer available downloads. * * @param int $customer_id Customer/User ID. * @return array */ function wc_get_customer_available_downloads( $customer_id ) { $downloads = array(); $_product = null; $order = null; $file_number = 0; // Get results from valid orders only. $results = wc_get_customer_download_permissions( $customer_id ); if ( $results ) { foreach ( $results as $result ) { $order_id = intval( $result->order_id ); if ( ! $order || $order->get_id() !== $order_id ) { // New order. $order = wc_get_order( $order_id ); $_product = null; } // Make sure the order exists for this download. if ( ! $order ) { continue; } // Check if downloads are permitted. if ( ! $order->is_download_permitted() ) { continue; } $product_id = intval( $result->product_id ); if ( ! $_product || $_product->get_id() !== $product_id ) { // New product. $file_number = 0; $_product = wc_get_product( $product_id ); } // Check product exists and has the file. if ( ! $_product || ! $_product->exists() || ! $_product->has_file( $result->download_id ) ) { continue; } $download_file = $_product->get_file( $result->download_id ); // If the downloadable file has been disabled (it may be located in an untrusted location) then do not return it. if ( ! $download_file->get_enabled() ) { continue; } // Download name will be 'Product Name' for products with a single downloadable file, and 'Product Name - File X' for products with multiple files. // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment $download_name = apply_filters( 'woocommerce_downloadable_product_name', $download_file['name'], $_product, $result->download_id, $file_number ); $downloads[] = array( 'download_url' => add_query_arg( array( 'download_file' => $product_id, 'order' => $result->order_key, 'email' => rawurlencode( $result->user_email ), 'key' => $result->download_id, ), home_url( '/' ) ), 'download_id' => $result->download_id, 'product_id' => $_product->get_id(), 'product_name' => $_product->get_name(), 'product_url' => $_product->is_visible() ? $_product->get_permalink() : '', // Since 3.3.0. 'download_name' => $download_name, 'order_id' => $order->get_id(), 'order_key' => $order->get_order_key(), 'downloads_remaining' => $result->downloads_remaining, 'access_expires' => $result->access_expires, 'file' => array( 'name' => $download_file->get_name(), 'file' => $download_file->get_file(), ), ); ++$file_number; } } // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment return apply_filters( 'woocommerce_customer_available_downloads', $downloads, $customer_id ); } /** * Get total spent by customer. * * @param int $user_id User ID. * @return string */ function wc_get_customer_total_spent( $user_id ) { $customer = new WC_Customer( $user_id ); return $customer->get_total_spent(); } /** * Get total orders by customer. * * @param int $user_id User ID. * @return int */ function wc_get_customer_order_count( $user_id ) { $customer = new WC_Customer( $user_id ); return $customer->get_order_count(); } /** * Reset _customer_user on orders when a user is deleted. * * @param int $user_id User ID. */ function wc_reset_order_customer_id_on_deleted_user( $user_id ) { global $wpdb; if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { $order_table_ds = wc_get_container()->get( OrdersTableDataStore::class ); $order_table = $order_table_ds::get_orders_table_name(); $wpdb->update( $order_table, array( 'customer_id' => 0, 'date_updated_gmt' => current_time( 'mysql', true ), ), array( 'customer_id' => $user_id, ), array( '%d', '%s', ), array( '%d', ) ); } if ( ! OrderUtil::custom_orders_table_usage_is_enabled() || OrderUtil::is_custom_order_tables_in_sync() ) { $wpdb->update( $wpdb->postmeta, array( 'meta_value' => 0, //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value ), array( 'meta_key' => '_customer_user', //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key 'meta_value' => $user_id, //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value ) ); } } add_action( 'deleted_user', 'wc_reset_order_customer_id_on_deleted_user' ); /** * Get review verification status. * * @param int $comment_id Comment ID. * @return bool */ function wc_review_is_from_verified_owner( $comment_id ) { $verified = get_comment_meta( $comment_id, 'verified', true ); return '' === $verified ? WC_Comments::add_comment_purchase_verification( $comment_id ) : (bool) $verified; } /** * Disable author archives for customers. * * @since 2.5.0 */ function wc_disable_author_archives_for_customers() { global $author; if ( is_author() ) { $user = get_user_by( 'id', $author ); if ( user_can( $user, 'customer' ) && ! user_can( $user, 'edit_posts' ) ) { wp_safe_redirect( wc_get_page_permalink( 'shop' ) ); exit; } } } add_action( 'template_redirect', 'wc_disable_author_archives_for_customers' ); /** * Hooks into the `profile_update` hook to set the user last updated timestamp. * * @since 2.6.0 * @param int $user_id The user that was updated. * @param array $old The profile fields pre-change. */ function wc_update_profile_last_update_time( $user_id, $old ) { wc_set_user_last_update_time( $user_id ); } add_action( 'profile_update', 'wc_update_profile_last_update_time', 10, 2 ); /** * Hooks into the update user meta function to set the user last updated timestamp. * * @since 2.6.0 * @param int $meta_id ID of the meta object that was changed. * @param int $user_id The user that was updated. * @param string $meta_key Name of the meta key that was changed. * @param mixed $_meta_value Value of the meta that was changed. */ function wc_meta_update_last_update_time( $meta_id, $user_id, $meta_key, $_meta_value ) { $keys_to_track = apply_filters( 'woocommerce_user_last_update_fields', array( 'first_name', 'last_name' ) ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment $update_time = in_array( $meta_key, $keys_to_track, true ) ? true : false; $update_time = 'billing_' === substr( $meta_key, 0, 8 ) ? true : $update_time; $update_time = 'shipping_' === substr( $meta_key, 0, 9 ) ? true : $update_time; if ( $update_time ) { wc_set_user_last_update_time( $user_id ); } } add_action( 'update_user_meta', 'wc_meta_update_last_update_time', 10, 4 ); /** * Sets a user's "last update" time to the current timestamp. * * @since 2.6.0 * @param int $user_id The user to set a timestamp for. */ function wc_set_user_last_update_time( $user_id ) { update_user_meta( $user_id, 'last_update', gmdate( 'U' ) ); } /** * Get customer saved payment methods list. * * @since 2.6.0 * @param int $customer_id Customer ID. * @return array */ function wc_get_customer_saved_methods_list( $customer_id ) { return apply_filters( 'woocommerce_saved_payment_methods_list', array(), $customer_id ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingHookComment } /** * Get info about customer's last order. * * @since 2.6.0 * @param int $customer_id Customer ID. * @return WC_Order|bool Order object if successful or false. */ function wc_get_customer_last_order( $customer_id ) { $customer = new WC_Customer( $customer_id ); return $customer->get_last_order(); } /** * When a user is deleted in WordPress, delete corresponding WooCommerce data. * * @param int $user_id User ID being deleted. */ function wc_delete_user_data( $user_id ) { global $wpdb; // Clean up sessions. $wpdb->delete( $wpdb->prefix . 'woocommerce_sessions', array( 'session_key' => $user_id, ) ); // Revoke API keys. $wpdb->delete( $wpdb->prefix . 'woocommerce_api_keys', array( 'user_id' => $user_id, ) ); // Clean up payment tokens. $payment_tokens = WC_Payment_Tokens::get_customer_tokens( $user_id ); foreach ( $payment_tokens as $payment_token ) { $payment_token->delete(); } } add_action( 'delete_user', 'wc_delete_user_data' ); /** * Store user agents. Used for tracker. * * @since 3.0.0 * @param string $user_login User login. * @param int|object $user User. */ function wc_maybe_store_user_agent( $user_login, $user ) { if ( 'yes' === get_option( 'woocommerce_allow_tracking', 'no' ) && user_can( $user, 'manage_woocommerce' ) ) { $admin_user_agents = array_filter( (array) get_option( 'woocommerce_tracker_ua', array() ) ); $admin_user_agents[] = wc_get_user_agent(); update_option( 'woocommerce_tracker_ua', array_unique( $admin_user_agents ), false ); } } add_action( 'wp_login', 'wc_maybe_store_user_agent', 10, 2 ); /** * Update logic triggered on login. * * @since 3.4.0 * @param string $user_login User login. * @param object $user User. */ function wc_user_logged_in( $user_login, $user ) { wc_update_user_last_active( $user->ID ); update_user_meta( $user->ID, '_woocommerce_load_saved_cart_after_login', 1 ); } add_action( 'wp_login', 'wc_user_logged_in', 10, 2 ); /** * Update when the user was last active. * * @since 3.4.0 */ function wc_current_user_is_active() { if ( ! is_user_logged_in() ) { return; } wc_update_user_last_active( get_current_user_id() ); } add_action( 'wp', 'wc_current_user_is_active', 10 ); /** * Set the user last active timestamp to now. * * @since 3.4.0 * @param int $user_id User ID to mark active. */ function wc_update_user_last_active( $user_id ) { if ( ! $user_id ) { return; } update_user_meta( $user_id, 'wc_last_active', (string) strtotime( gmdate( 'Y-m-d', time() ) ) ); } /** * Translate WC roles using the woocommerce textdomain. * * @since 3.7.0 * @param string $translation Translated text. * @param string $text Text to translate. * @param string $context Context information for the translators. * @param string $domain Text domain. Unique identifier for retrieving translated strings. * @return string */ function wc_translate_user_roles( $translation, $text, $context, $domain ) { // translate_user_role() only accepts a second parameter starting in WP 5.2. if ( version_compare( get_bloginfo( 'version' ), '5.2', '<' ) ) { return $translation; } if ( 'User role' === $context && 'default' === $domain && in_array( $text, array( 'Shop manager', 'Customer' ), true ) ) { return translate_user_role( $text, 'woocommerce' ); } return $translation; } add_filter( 'gettext_with_context', 'wc_translate_user_roles', 10, 4 ); Az Tətbiq Android Apk Və Ios Üçün - Ravian Technologies

Exclusive OFF Exclusive OFF - We are also offering one month free customer support after completing the project

AI Powered, Well Reputed and Trusted Company for Your Successful Business

Az Tətbiq Android Apk Və Ios Üçün

Mostbet Yüklə: Azərbaycan Üçün Mobil Tətbiq Google Android Və Ios

Hesabın ilk doldurulması məcburi bir hərəkətdir, buna görə paralel olaraq bukmeker kontorundan qeydiyyat bonusu almaq imkanını nəzərdən keçirməyə dəyər. Bir çox oyunçu bu xüsusi intizam üzrə mərc oynamağa başlamaq üçün Mostbet Azerbaycan yükle qərar verir. Şişirilmiş əmsalları gözləyə biləcəyiniz bir neçə kiçik bölmələr də var. İdmanın populyarlığı böyük turnirlər üçün orta hesabla 3 faiz, milli çempionatlar üçün isə 4-6 faiz marja ilə nəticələndi. İlk mərc etmək üçün oyunçular xəttlə tanış olmalı və mövcud oyunlardan birini seçməlidirlər. Mostbet Azərbaycan yükle –də hətta gecənin bir yarısı da mərc etmək mümkündür.

  • Mostbet az yukle, ondan canlı kazino, kart və stolüstü oyunlar, lotereyalar kimi bölmələrə daxil olmaq üçün istifadə edə bilərsiniz.
  • İstifadəçilər oyunçular üçün uyğun mərc seçimlərini asanlıqla əldə edə bilərlər.
  • Mostbet tətbiqi, müxtəlif idman növləri üzrə mərc imkanlər təmin edir.
  • 30-dan çox müxtəlif idman novl ilə hər bir oyunçu üçün geniş seçim imkanı təmin edirik.
  • Yükləmə zamanı hər hansı bir problem olarsa, bizim dəstək komandamız həmişə kömək etməyə hazırdır.
  • Onu öz sinifinin digər nümayəndələrindən fərqləndirən əsas şey sürətli oynanışı və vizual olaraq çox weil keyfiyyətli olmasıdır.

Mostbet tətbiqi iOS cihazları üçün hazırlanmışdır və i phone, ipad tablet və hətta iMac cihazlarında işlənə bilər. Hazırlanmış funksionallıqdan əlavə, mobil tətbiq təcrübəli oyunçuları da təəccübləndirə bilər. Ümumi funksionallıq dəstinə bir neçə eksklüziv imkanlar əlavə edilib.

Mostbet Mobil Sayt Versiyası

Apk faylı, Enjoy Store-da mövcud olmayan tətbiqlərin yüklənməsi üçün nəzərdə tutulmuş xüsusi bir formatdır və Android əməliyyat sisteminə uyğun olaraq işləyir. Problemsiz əməliyyatlardan həzz alın və bu gün mərc və ya oyun oynamağa başlayın! Əgər siz Azərbaycandasınızsa və idman mərc oyunlarını sevirsinizsə, Android və iOS üçün Mostbet Proqramını yoxlamalısınız.

  • Mostbet Tətbiqi sizə hər addımda kömək etmək üçün əla müştəri dəstəyi təklif edir.
  • Qeyd edək ki, MostBet tərəfindən depozitlər üçün heç bir komissiya tətbiq olunmur.
  • Mobil tətbiqi Mostbet apk indir Android operating-system əməliyyat sistemi üçün bukmeker kontorunun rəsmi saytından əldə edilə bilər.
  • Baccarat oyunu sadə qaydalara malikdir və strategiya qurmaq üçün çox əlverişlidir.
  • Oyunçular hər biri pulsuz və pullu versiyaya malik minlərlə slotdan yararlana bilər.

Azərbaycanda Android və en este momento iOS cihazınızda Mostbet Tətbiqindən istifadə etdiyiniz zaman siz eksklüziv bonuslar və promosyonlar dünyasını açırsınız. Tətbiq istifadəçilərimizi sadiqliklərinə və həvəslərinə görə mükafatlandıracağımıza inanırıq. Azərbaycanda Google android və iOS cihazlarınız üçün ən yaxşı köməkçi olan Mostbet Tətbiqinə xoş gəlmisiniz! Tətbiqimiz idman mərcləri və kazino oyunlarının həyəcanını barmaqlarınızın ucuna gətirir https://www.be8player.com/.

Mostbet App Yükləmə Ios Üçün

– Xeyr, bukmeker proqramını Mostbet saytından pulsuz yükləmək olar. Əgər sizdən proqram quraşdırmaq üçün pul istənilirsə, deməli siz” “fırıldaqçılarla əlaqə saxlayırsınız və heç bir halda onlara pul köçürməməlisiniz. – Xeyr, çünki bu platforma qumarla əlaqəli proqramların yerləşdirilməsini qadağan edir. Bəli, Mostbet bir çox oyunların demo versiyalarını təqdim edir ki, bu de alguma oyunçulara həqiqi pul mərc etmədən onları sınamağa imkan verir. Həqiqətən, Mostbet sobre yeni oyunçular üçün cəlbedici bonuslar təklif edir, o cümlədən depozit matçları və pulsuz fırlanmalar. Azərbaycanda yaşayarkən həyəcanlandıran idman mərc oyunları və kazino təcrübələri axtarırsınızsa, MostBet-dən başqa yerə baxmayın.

  • Rəsmi tətbiqimizi bir neçə sadə addımla yükləyərək, VPN tələb etmədən dərhal istifadə etməyə başlaya bilərsiniz.
  • Bu çox yönlü mərc növləri ilə siz mərc strategiyanızı bilik və intuisiyanıza uyğunlaşdıraraq uğur şansınızı artıra bilərsiniz.
  • Təkcə oyun öncəsi deyil, həm də canlı formatda mərc etmək mümkündür.
  • Faylların quraşdırma paketini yüklədikdən sonra istifadəçi quraşdırma proseduruna başlamalıdır.
  • Əlavə hesabların olması saytın mövcud qaydalarının ciddi şəkildə pozulmasıdır.

Platformamız birbaşa mobil vebsayt vasitəsilə bütün mərc funksiyalarına giriş imkanı verir. Siz tətbiqi yükləmədən daxil ola, mərc edə və hesabınızı idarə edə bilərsiniz. Bu seçim əlavə proqram təminatını quraşdırmağı üstün tutmayan istifadəçilər üçün davamlı təcrübə təmin edir. Mobil veb saytımız Mostbet proqram funksiyalarına girişi təmin edir, quraşdırma olmadan tam funksionallığı təmin edir. Bu yanaşma istənilən cihazdan sürətli və çevik giriş axtaran oyunçular üçün idealdır.

Mostbet Yukle Apk Azerbaycan 2024

İdman mərc oyunları həvəskarları həmçinin eSports tədbirlərinə mərc etmək imkanı əldə edirlər. Bonus nə kəmiyyət əmanət etdiyinizdən və aydın şərtlərin tətbiqindən bağlı olaraq hundred avroya kəmiyyət ola bilər. Bukmeker kontoru de uma vaxtaşırı müştərilərinə pulsuz mərclər təklif edir. Mostbet genuine alfilerazo mərc etməyiniz üçün lazım olan elliklə alətləri təklif edir. Bütün conventional idman və e-idman hadisələrinə, eləcə də Electronic digital İdmanlara Xətt və ya Canlı mərclər qoya bilərsiniz. Bu bölmədə Mostbet platformasındakı mərc seçimləri barədə uzun elan ala bilərsiniz.

  • Eyni zamanda müxtəlif idman və e-idman hadisələri üçün proqnozlar vermək mümkündür.
  • Tətbiqə daxil olmaq üçün sadəcə bir neçə dəfə düyməsini klikləyərək, oyun və bonus imkanlarından faydalana bilərsiniz.
  • Biz məsuliyyətli oyun təcrübəsini prioritet” “tuturuq və [email protected] ünvanında həsr olunmuş dəstək təklif edirik.
  • Çoxsaylı mərc seçimləri və müasir analitika ilə Mostbet Azərbaycanda Valorant-a mərc etmək istəyənlər üçün əla yerə çevrilir.
  • Əgər siz Azərbaycandasınızsa və Mostbet Tətbiqindən istifadə etmək istəyirsinizsə, onun geniş çeşiddə iOS cihazlarını dəstəklədiyini bilməkdən məmnun qalacaqsınız.
  • Ödənişlərin uğurla icra olunma faizi 98, 7% təşkil edir ki, bu da bazardakı ən yüksək göstəricilərdən biridir.

Mostbet-in qeydiyyat bonusu mərc etməyə yeni başlayan oyunçular üçün əla fürsətdir. İstifadəçilər rəsmi Mostbet saytından və ya App Store-dan tətbiqi pulsuz yükləyə bilərlər. Həm Android os, həm də iOS istifadəçiləri üçün bu tətbiqi yükləmək heç bir ödəniş tələb etmir. Mostbet tətbiqi mütəmadi olaraq yenilənir və istifadəçilərə avtomatik yeniləmə seçimi təqdim olunur.

Ios Tətbiqini Necə Quraşdırmaq Olar

Təəssüf ki, tətbiqin istifadəyə başlanması üçün heç bir mükafat nəzərdə tutulmayıb. Saytda qeydiyyatdan keçmişəm, Mostbet tətbiqində mənə en yeni bir hesab yaratmaq lazımdır? Mostbet tətbiqini endirmək və apk-faylı quraşdırmaq təhlükəsizdir? Yükləmə linki onlayn qumar klubunun portalının əsas səhifəsinin yuxarı encanto küncündə yerləşir. Mostbet keyfiyyətli mobil proqramı və tanınmış tərtibatçıların böyük slot machine kataloqu ilə etibarlı onlayn kazinodur. Şirkət daim xidmət keyfiyyətinin yaxşılaşdırılması üçün çalışır, yəni oyunçu ilə uzunmüddətli əməkdaşlığa ümid edir.

İstifadəçilər idman hadisələri, kazino oyunları və canlı matçlara təhlükəsiz şəkildə baxa və mərc edə bilərlər. Cihazlar iOS tətbiqimizi dəstəkləmək üçün müəyyən texniki tələblərə cavab verməlidir. Bunlara yenilənmiş əməliyyat sistemi və kifayət qədər yaddaş sahəsi daxildir. Bu tələblərə cavab verən cihazlar Mostbet tətbiqinin quraşdırılması zamanı səhvsiz işləyəcək. Bu, istifadəçilərə hadisələri semblante yükləməyə və mərcləri səmərəli şəkildə yerləşdirməyə imkan verir.

Kliklə Qeydiyyat

Beləliklə, oyunçular slotları janr və hoy provayderə görə çeşidləyə bilərlər. Siz həmçinin yalnız pulsuz fırlanmalar və ya unikal bonus turları təklif edən slotları seçə bilərsiniz. Əgər oyunçu maksimum qazanma şansı ilə mərc etməyi planlaşdırırsa, bunun üçün cekpotlarla bölmədən istifadə etməlisiniz.

MostBet AZ-də oyunçularımızı geniş şəkildə mükafatlandırmağa inanırıq. Bonus proqramlarımız oyun təcrübənizi artırmaq və əlavə qazanma imkanları yaratmaq üçün nəzərdə tutulub. İdman həvəskarları üçün” “nəzərdə tutulmuş idman bonus proqramımız həyəcan verici mükafatlar təklif edir. Hər hansı bir fürsəti qaçırmayın və oyun təcrübənizi artırmaq üçün bugün xəbər bülletenimizə abunə olun! Futbol MostBet AZ-də ən populyar” “idman növlərindən biridir və dünyadakı əsas liqalar və turnirlər geniş əhatə olunur. Oyun nəticələri, qola ümumi say və oyunçu performansları kimi müxtəlif bahis variantlarının dadını çıxarın.

Mostbet Yukle Apk Azerbaycan 2024

Apk faylı endirildikdən sonra quraşdırmaq üçün müəyyən bir yaddaş tələb olunur, buna görə də cihazınızın yaddaşını yoxlamaq vacibdir. Apk faylı, Play Store-da mövcud olmayan tətbiqlərin yüklənməsi üçün nəzərdə tutulmuş xüsusi bir formatdır və Android əməliyyat sisteminə uyğun olaraq işləyir. Apk faylını endirdikdən sonra, cihazınızın təhlükəsizlik ayarlarını tənzimləmək lazımdır ki, faylı quraşdırmaq mümkün olsun. Quraşdırma prosesi başa çatdıqdan sonra, tətbiq istifadəyə hazır olacaq və siz mərc etməyə başlaya bilərsiniz. Smartfonunuzdan Mostbet tətbiqi vasitəsilə mərc etməyə başlamaq çox sadədir. Qeydiyyat prosesi çox sadədir və bir neçə dəqiqə ərzində tamamlanır.

  • Buna görə də Mostbet APK yükle yalnız rəsmi saytımızdan aparılmalıdır.
  • Mərc bütün dünyada böyük bir istifadəçi auditoriyasını bir araya gətirir.
  • Nömrə və şifrəni daxil etdikdən sonra mostbet AZ com saytında oynamağa başlaya bilərsiniz Mstbet.
  • Bu zaman ərzində bukmeyker özünü rəsmi Kürasao lisenziyası çərçivəsində fəaliyyət göstərən etibarlı və təhlükəsiz sayt kimi tanıdıb.
  • Yayım üçün studiyada şəxsi iştirak effektinə zəmanət verən müasir avadanlıq istifadə olunur.

Oyunçular demək olar ki, bütün qumar əyləncələrinə giriş əldə edirlər. Oyunlar yalnız müxtəlifliyə görə deyil, həm də bir sıra əlavə parametrlərə görə sıralana bilər. Mostbet casino-da çoxsaylı oyunlar mövcuddur, u cümlədən slotlar, rulet, blackjack, holdem poker və mostbet aviator.” “[newline]Mostbet kazino həmçinin real dilerlərlə canlı oyunları təklif edir, bu da oyunçulara daha real təcrübə qazandırır. Mostbet sizə geniş oyun seçimi və yüksək keyfiyyətli oyun təcrübəsi təqdim edir. Mostbet az-90 kazino azerbaycan platformasında mərc etmək üçün ilk növbədə qeydiyyatdan keçməli və hesabınıza pul yatırmalısınız.

Təhlükəsizlik Və İstifadəçi Təhlükəsizliyi

Bu halda, beta ölçüsü və hadisə dərəcəsi vacib deyil – hər halda sikkələr hesablanacaq. Mostbet ua-da əsas balans düyməsini klikləməklə, siz oyunçunun hesabında artıq göstərilən mərc bonuslarının sayını öyrənə bilərsiniz. Bonus” “təklifləri oyunçuların balansına profit vəsaitləri əlavə etməklə, mərc oynamağa maraq göstərməyə və qalib gəlmə ehtimalını artırmağa kömək edir.

  • Seçim istifadəçilər arasında qüsursuz bir reputasiya qazanmağı bacaran etibarlı bir” “şirkətin xeyrinə edilməlidir.
  • Bonus hesablandıqdan sonra onu real hesabda jua çevirmək üçün oynayıb udmaq lazımdır.
  • Oyunçular canlı dilerlə blackjack, rulet və digər masa oyunlarını oynayaraq real kazino təcrübəsini mobil cihazda yaşayırlar.
  • Mostbet Yükləməsi üçün siz sonrakı fəaliyyət üçün təlimatların yerləşdirildiyi müvafiq bölməni seçməlisiniz.

Ödənişlərin uğurla icra olunma faizi 98, 7% təşkil edir ki, bu da bazardakı ən yüksək göstəricilərdən biridir. Vəsait çıxarma müddəti seçilmiş üsula görə 15 dəqiqədən twenty-four saata qədər çəkə bilər. Bütün tranzaksiyalar təhlükəsiz və qorunan sistemlə həyata keçirilir. Bizim rəsmi tətbiq istifadəçilərin məlumatlarını qorumaq üçün ən child təhlükəsizlik texnologiyalarını tətbiq edir.

Yeni Versiyada Ən Son Xüsusiyyətlər

Bu, proqramın optimal şəkildə işləməsini təmin edərək, sizə problemsiz mərc və oyun təcrübəsi təqdim edir. Beləliklə, cihazınızın en yeni olduğundan əmin olun və siz iOS cihazınızda Mostbetin təklif etdiyi hər şeydən həzz almağa hazır olacaqsınız. Əgər siz Azərbaycandasınızsa və Mostbet Tətbiqindən istifadə etmək istəyirsinizsə, onun geniş çeşiddə iOS cihazlarını dəstəklədiyini bilməkdən məmnun qalacaqsınız. Proqramları üçüncü tərəfin resurslarına yükləməmək daha yaxşıdır, çünki virus qazana bilərsiniz. Quraşdırma tamamlandıqdan sonra ekranda Mostbet Azerbaycan yukle” “işarəsi görünəcək.

Aşağıda Mostbet bonusunu necə əldə etmək və onu saytda aktivləşdirmək təsvir edilir. Sosial şəbəkələr vasitəsilə və ya bir kliklə qeydiyyatdan keçənlər üçün xüsusi təkliflər də mövcuddur mstbet. Mobil versiyada mobil telefon vasitəsilə, kompüterdə isə elektron poçt vasitəsilə qeydiyyatdan keçmək daha rahatdır. Bu, mostbetcom SHK bukmeykerində özünüzü tapmağın ən sürətli yoludur.

Mostbet Apk-ni Pulsuz Yüklə

Hesabda kifayət qədər vəsait olduğu halda mərc qəbul” “olunacaq Mostbet az on-line casino. Mostbet Azerbaycan apk tətbiqi geniş idman mərc imkanları təklif edir. Əgər Mostbet app axtarışda görünmürsə, hesabınızın regionunu dəyişmək lazım landa bilər. Əsas səhifəni açmaq, müvafiq bölməyə getmək və sisteminiz üçün versiyanı seçmək kifayətdir. Quraşdırıldıqdan dərhal sonra bütün dəyişdirilmiş parametrləri orijinal vəziyyətinə qaytara bilərsiniz. Lakin, Google android üçün mosbet the people yukle üçün yeniləmək üçün yenidən belə icazə” “verməli olacaqsınız.

  • Hesab yaradıldıqdan sonra istifadəçilər proqramın funksionallığına tam giriş əldə edə bilərlər.
  • Mostbet tətbiqini yükləmək üçün ilk addım Mostbet-in rəsmi saytını açmaqdır.
  • Bu cihazında məhdud yaddaş yeri olan və daha köhnə model telefon işlədənlər üçün faydalı” “ola bilər.
  • Hər bir belə mərc üçün bukmekerlər xal toplayırlar ki, onlar üçün Mostbet-də digər promosyonlarda added bonus və hoy pulsuz fırlanmalar əldə edə bilərsiniz.

Mostbet yüklə mobil tətbiqi mərc oyunları üçün geniş imkanlar təqdim edir. Qeydiyyat prosesini tamamladıqdan sonra,” “bonusu əldə etmək üçün tətbiqi yükləyərək əyləncəyə başlaya bilərsiniz -top1. com. Mostbet-də financial institution kartları və PayDo xidmətindən istifadə etməklə hesabı three or maybe more AZN-dən doldurmaq olar. Bundan sonra Mostbet AZ yükle Application Store-da əlçatan olacaq və siz tətbiqi rahatlıqla yükləyə biləcəksiniz. Biz tətbiqin klein işini daha ag yaxşılaşdırdıq, xətaları düzəltdik və yeni imkanlar əlavə etdik.

Ios Üçün Mostbet Iphone App Yuklə

Burada slotlar, qəza oyunları, stolüstü oyunlar, ruletka və canlı kazino bölmələri yer alır. Mostbet Live Casino bölməsində Evolution Gaming, Pragmatic Play və digər top provayderlərin oyunları mövcuddur. Real dilerlər ilə oyun oynayaraq həqiqi kazino atmosferini yaşayın.

  • Hesabda kifayət qədər vəsait olduğu halda mərc qəbul” “olunacaq Mostbet az on-line casino.
  • Zəng başa çatdıqdan sonra siz normal olaraq yenidən oxumağa davam edə bilərsiniz.
  • Mostbet tətbiqi istifadəçilərə bir çox fərqli ödəniş üsulları təklif edir.
  • Aviatrix eyni adlı provayder tərəfindən istehsal edilmiş başqa bir maraqlı qəza oyunudur.

Biz daha sürətli naviqasiya və mobil saytda mövcud olmayan real vaxt bildirişləri kimi eksklüziv funksiyaları təqdim edirik. Mostbet indir tətbiqini yükləyərək, istifadəçilər daha yaxşı mərc imkanlarına və eksklüziv təkliflərə sahib olurlar. Tətbiqi indi quraşdırın və idman və kazino oyunlarına təhlükəsiz və sürətli giriş əldə edin.

Mostbet Kazinosu

Android cihazlar üçün” “Mostbet yüklə və bütün mərcləri rahatlıqla ain! Bu, ənənəvi qeydiyyat addımlarından yan keçərək, dərhal mərc etməyə imkan verir. Qırmızı rəngi 8 cüt, 10 tək rəqəm, həmçinin Qara rəngli 8 cüt, twelve tək rəqəm yer almışdır. Bu xarici mərc olduğundan, Rəng mərcinin ödənişi 1-dən 1-ə nisbətindədir.

  • Axtardığınız oyunu tez tapmaq üçün proqram təminatçısı (Evolution Gambling, Red Tiger, Playtech və digərləri), mövzu, xüsusiyyətlər və t.
  • Mostbet yeni istifadəçilər və daimi oyunçular üçün müxtəlif bonuslar və aksiyalar təqdim” “edir.
  • Bukmeker kontorunun rəsmi saytına giriş əldə etdikdən sonra bu və ahora digər üsuldan istifadə etməklə Şəxsi Hesabınızda avtorizasiyadan keçməlisiniz.
  • Menyunun aşağı hissəsində dil parametrlərini dəyişdirmək üçün bir konsol var.
  • İstifadəçilər tətbiqi yükləməzdən əvvəl proqramın təqdim etdiyi bütün imkanlar haqqında məlumat əldə edə bilərlər.
  • Bukmeker platformasından rahat və sərfəli istifadəsi üçün Mostbet yukle apk tövsiyə olunur.

Mostbet mobil proqram vasitəsilə istənilən slot maşınını işə salmaqla to, avtomatik olaraq cihazınızın ekran təsvir ölçüsünü alacaq. Əksinə, bu dəyişikliyi bəyənəcəksiniz və slot maşınlarında pul qazanmaq çox daha rahat olacaq. Həmçinin proqram slotu demo rejimində işlədə biləcək ki, bu de uma virtual pul üçün oynamağa və seçilmiş strategiyanı sınaqdan keçirməyə kömək edəcək. Depozit və pul çıxarma əməliyyatlarını həyata keçirmək üçün MosBet tətbiqi çoxlu sayda ödəniş alətlərinin istifadəsini təmin edir. 30 AZN və daha yuxarı doldurma ilə, bonusa əlavə olaraq bəttorə 250 frispin əlavə ediləcək.

📌 Android Üçün Mostbet Tətbiqini Haradan Yükləyə Bilərəm?

Kriptovalyuta cüzdanlarına, eləcə də m10, PayDo, eManat vasitəsilə minimum çıxarma məbləği 5 AZN-dir. SmartPay vasitəsilə bank kartları ilə əməliyyatlar 30 AZN-dən başlayaraq həyata keçirilir. Pul bukmeyker tərəfindən komissiya olmadan dərhal hesaba köçürülür, lakin əməliyyat haqları bəzi ödəniş operatorları tərəfindən tutula bilər.

  • Əvvəla, tətbiq – bu ayrı-ayrı tamamilə proqramdır ki, onu yükləməli və quraşdırmaq lazımdır.
  • İlk iki seçim yalnız parola əlavə olaraq telefon nömrəsi və en este momento e-poçt ünvanı daxil etməlisiniz.
  • IOS 10. 0 və ya daha yüksək əməliyyat sistemi olan cihazlar bu tətbiqi rahatlıqla yükləyə bilər.
  • Oyunçu ayrıca kazino kolleksiyasının yeniliklərini, eləcə də qumar klubunun əksər müştəriləri arasında ən populyar qumar əyləncəsini seçə bilər.
  • Futbol, basketbol, tennis games kimi populyar idman növlərinə əlavə olaraq, eSports və electronic idman kimi seçimlər də mövcuddur.

Menyunun aşağı hissəsində dil parametrlərini dəyişdirmək üçün bir konsol va. IPhone və digər Apple markalı qadcetlərin sahibləri daha şanslıdır. Proqramı adı ilə və ya BK saytındakı linkdən istifadə edərək tapa bilərsiniz. Mostbet az indir əvvəl App Store-da hesab parametrlərinizə diqqət yetirin. Çeşiddə həm yeni başlayanlar, həm də daimi istifadəçilər üçün təşviqlər olacaqdır.

Xətt Və Cədvəl Mostbet

Mostbet tətbiqini yükləməzdən əvvəl düzgün formatı seçmək vacibdir. Tətbiq həm Android os, həm də iOS cihazları üçün fərqli formatlarda təqdim olunur və hər bir əməliyyat sistemi üçün uyğun formatı seçmək lazımdır. Əgər Android cihazı istifadə edirsinizsə, apk faylı yükləməlisiniz. Bu format iOS əməliyyat sistemi ilə tam uyğun gəlir və cihazınıza avtomatik olaraq quraşdırılır.

  • Onları qumardan canlı emosiyalar yaşamaq, eləcə də böyük bir uduş əldə” “etmək şansı əldə etmək istəyənlərin hamısı üçün istifadə edə bilər.
  • Proqramın quraşdırılması çox sürətlidir və istifadəsi çox rahatdır.
  • Texniki dəstək komandası sürətli və effektiv şəkildə istifadəçilərin” “problemlərini həll edir.
  • Bu klassik kart oyunu, oyunçulara böyük qazanc imkanları təqdim edir.

Sadə qaydalar və kart hesablama strategiyası bu əyləncəni canlı saxlayır. Dizayn markanın xarakterik üslubunda – mavi və ağ çalarların birləşməsində hazırlanmışdır. Narıncı düymələr mavi-ağ fonda parlaq şəkildə seçilir, üst xətt istədiyiniz oyunu seçməyi asanlaşdırır. Əsas səhifənin girişində isə bannerlər oyunçunu ən yaxın idman hadisələri ilə tanış edir. Oyun hesabı həm kartla, həm də elektron pulla müxtəlif yollarla doldurula bilər. Gələcəkdə bonuslar, loyallıq proqramları və cashback sistemi tariflərə əhəmiyyətli dərəcədə qənaət etməyə imkan verir.

Ən Boy Yeniləmə – Versiya 7 4 2

Mobil tətbiqin köməyi ilə hesabınıza asanlıqla depozit yatırmaq mümkündür. İstifadəçilər öz şəxsi məlumatlarını qoruyaraq qısa müddət ərzində istədikləri məbləği əlavə edə bilərlər. Eyni zamanda, tətbiqdə müxtəlif ödəniş üsulları mövcuddur ki, bu ag prosesi daha rahat edir. Mobil tətbiq vasitəsilə hesabınızdan pul çıxarmaq çox sadə və sürətlidir. Siz sadəcə tətbiqin menyusunda müvafiq bölməni seçərək, çıxarma məbləğini göstərə bilərsiniz. Proses zamanı təhlükəsizlik tədbirləri görülür və çıxarma əməliyyatları çox qısa zamanda həyata keçirilir.

  • Bu, proqramın optimal şəkildə işləməsini təmin edərək, sizə problemsiz mərc və oyun təcrübəsi təqdim edir.
  • Mostbet qəza oyunları kateqoriyasının ən populyar seçimlərindən biri də Lucky Jet slotudur.
  • Mostbet yüklə prosesi sadədir və minimal sistem tələblərinə cavab verən Google android cihazlarında stabil işləyir.
  • Onlar təkcə yeni müştərilərə deyil, həm də fəal müştərilərə aiddir.
  • Rahat işləyir, hətta 12 ildən əvvəl buraxılmış zəif prosessorlar və 1 GB-a qədər yaddaşı olan cihazlarda tez yüklənir.
  • Tətbiqin təhlükəsizlik tədbirləri davamlı olaraq yenilənir və istifadəçi təhlükəsizliyinə olan bağlılığımızı əks etdirir.

Bundan sonra, “Android üçün yüklə” düyməsini sıxmağınız lazım olan bir səhifə açılır. Faylların quraşdırma paketi 13, various MB ölçüsünə malikdir, smartfon və hoy planşetdə quraşdırmaq üçün 33 MB boş disk sahəsi olmalıdır. Bu oyunun populyarlığını nəzərə alaraq, Mostbet onu saytın əsas menyusuna əlavə edib.

Scroll to Top
Scroll to Top
small_c_popup.png

Let's have a chat

Get A Quote