/** * 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 ); if ( $use_lookup_tables ) { // Lookup tables get refreshed along with the `woocommerce_reports` transient version (due to async processing). // With high orders placement rate, this caching here will be short-lived (suboptimal for BFCM/Christmas and busy stores in general). $cache_version = WC_Cache_Helper::get_transient_version( 'woocommerce_reports' ); } elseif ( '' === $customer_email && $user_id ) { // Optimized: for specific customers version with orders count (it's a user meta from in-memory populated datasets). // Best-case scenario for caching here, as it only depends on the customer orders placement rate. $cache_version = wc_get_customer_order_count( $user_id ); } else { // Fallback: create, update, and delete operations on orders clears caches and refreshes `orders` transient version. // With high orders placement rate, this caching here will be short-lived (suboptimal for BFCM/Christmas and busy stores in general). // For the core, no use-cases for this branch. Themes/extensions are still valid use-cases. $cache_version = WC_Cache_Helper::get_transient_version( 'orders' ); } $cache_group = 'orders'; $cache_key = 'wc_customer_bought_product_' . md5( $customer_email . '-' . $user_id . '-' . $use_lookup_tables ); $cache_value = wp_cache_get( $cache_key, $cache_group ); if ( isset( $cache_value['value'], $cache_value['version'] ) && $cache_value['version'] === $cache_version ) { $result = $cache_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 p.post_type = 'shop_order' 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 ); wp_cache_set( $cache_key, array( 'version' => $cache_version, 'value' => $result, ), $cache_group, MONTH_IN_SECONDS ); } 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 ); Demystifying Casino Dress Code: Navigate The Regulations & Dress Along With Confidence – Barter Up Now – Trade without Money
Loading…
  • ahtsham
  • July 4, 2025

Demystifying Casino Dress Code: Navigate The Regulations & Dress Along With Confidence

Gambling In Las Vegas: A New Beginners Guide

So although Jeremy Jeff designs are daring and funky, maintain it toned lower here; casinos are usually about classiness above splashiness. Now,” “I’ll admit there will be some exceptions, just like gaming bars or perhaps beachfront spots where fancy footwear isn’t an issue. But if you’re going to places just like the Bellagio or Caesars Palace, leave the particular sneakers at home.

It is also different within that it is usually traditionally used regarding events after six p. m., while white tie may also be anticipated for day occasions. You may locate casinos using a black-tie dress code, yet it’ll also typically be in spot only for special events or appropriated areas in typically the casino. The minimum requirement is really a floor-length evening gown or perhaps dress. There are no restrictions on color or material but “tasteful” is the order of the particular day. Optional components include clutch purses and handbags, tiaras, long white gloves and, of course, jewelry.

Winstar Casino

You’ll be able to spend a morning on the casino ground without being unpleasant. When you proceed to an online casino, dress in wise casual or semi-formal attire. Men may choose a company match or button-up t-shirt, while women may opt for cocktail dresses or night time dresses. Formal for a man could be referred to as adding color to the black-tie dress code.

  • White Tie trousers are usually higher-waisted than all those of Black Tie.
  • If you’ve enjoyed shelling out time playing in an online casino, it’s very likely you’ve given considered to visiting a brick-and-mortar version, too.
  • Attending a new casino-themed party will be an opportunity to embrace your interior high roller and have a great time.

Now, suits and ties are your friends if you’re aiming regarding that James Bond vibe – classy but completely optional. They’re just like a golden admission, making you seem to be put together with out effort. To ensure that you have the full experience available to you, it is recommended which you follow company formal guidelines. That way, if an individual decide to consume at one regarding the restaurants or see a display, you know you won’t be turned away. If you’re seeking for edgy yet affordable clothing next you should certainly check out Glassons mostbet login.

Do On The Internet Casinos Have The Dress Code?

Instead, black tie would certainly have meant a new floor- or calf-length evening gown, with a fur place and a set of long hand protection. The classic black tie look is not out of style, so within an extended dress guarantees of which you are outfitted appropriately for the particular occasion. Despite this particular gradual shift apart from sartorial formalities, casinos have remained a conservative environment. Staff still use shirts and connections, with neat haircuts” “and makeup.

  • You may also shop for particular items which would make a person look better yet about the casino floor, but once once again, this may not be mandatory.
  • Always select safe online gambling dens licensed in your current jurisdiction.
  • When in doubt, it’s best to gown in conservative colours and clothing.

Casinos will expect you to maintain a certain standard, actually though American casinos tend to be more laidback as compared to their European alternatives. It’s called playing for a purpose, and any type it takes carries built in risks and absolutely no guarantees of earning. With that said…a “smart bet” in Las Vegas would end up being one with a reduce house edge, meaning better odds in order to the player. For example, the Gold Nugget offers every day lessons on eight different games comprising pai gow poker to craps to roulette. Ask a person at the online casino cage (cashier) wherever you might be staying with regard to the latest routine of free classes.

Are There Outfit Codes At Las Vegas Casinos?

If you’re looking in order to dress up and proceed all out like you’re likely to a reddish colored carpet, opting regarding a formal outfit is the method to go. This is the perfect outfit if the dress code telephone calls for a fancy. Channel your inner key agent having a Bond-inspired outfit. A smooth tuxedo or even a sharp pantsuit can make you feel like a high roller mostbet app.

The primary thing is not to make it too revealing – although what exactly is “too revealing” is, in itself, subjective. As typically the name suggests, business formal is the type of clothes you’d wear to job. Nowadays, this has come to be increasingly informal, thus with time, this dress code may want to consider a different name! Casinos will be certainly not only a place for guys who enjoy gambling. Female celebrities, including Pamela Anderson, Jennifer Tilly and Shannon Elizabeth, are well known for frequenting them.

What To Put On To An On Line Casino: Outfit Inspo

Table games have got an element associated with human interaction in addition to these first impressions actually count. Sometimes, a casino doesn’t obviously” “point out what its dress code is, although other casinos claims to have no dress code at almost all. If an online casino doesn’t indicate the dress code upon its website, it’s advisable to contact the casino immediately. You wouldn’t want to travel a fair distance only in order to must turn around and refuse. Equally, you wouldn’t want to spend several hours on the on line casino floor only in order to realize that you’re inappropriately dressed to the bar or restaurant.

  • Although the name refers primarily to menswear, it also limitations what women can easily wear.
  • So, in case you are in doubt, you can constantly jump to Reddit and see what typically the crowd there thinks about your selection of casino dress.
  • For the majority of us, the casinos associated with Monaco and Mayfair are the things of fantasy.
  • This formal clothing is a chic and comfortable choice of which exudes style.

Many casino dress codes seem kind of blurry today because we aren’t as absolute within our clothing. However, there are nevertheless some general on line casino dress code suggestions that can assist you figure out there what to use to a casino. If your particular casino doesn’t have got a huge Instagram page, try checking out the pages of similar internet casinos in the region to obtain a feel for the way the locals gown. After all, “smart-casual” (the most common casino dress code) varies big time by location. For males, this usually implies wearing a collared shirt, dress” “jeans, and dress sneakers.

Make Positive To Check The Casino’s Dress Code

Choosing an outfit for the casino can be a frustrating issue. Perhaps you don’t enjoy wearing elegant clothes and don’t see why you should be forced to wear them within a casino. You might also get the personal interactions demanding, especially if you’re well-known. You could feel it’s having in the method of enjoying typically the games.

  • They take a quick minute to glance by means of and skim for any glaring products that you can’t take with a person or clothes that you cannot put on.
  • If you’re wearing the dark coloured suit you can add the suit vest in case you want in order to make your look more formal.
  • The inclusion of online gambling dens and legalized sports betting has, and will, continue to grow the particular industry’s value.
  • Waistcoats, preferably white or perhaps off-white, should become worn, and dark patent leather shoes are non-negotiable.
  • This means that males can wear pants along with a t-shirt, and women can put on a sundress or even blouse.

Today, amid improved regulation and licensing and with the particular uptake of on the internet gambling, casinos will be as popular because ever. The addition of online casinos and legalized gambling has, and can, always grow the particular industry’s value. To dress appropriately, stick to the guidelines for Semiformal or Company Formal.

Black Tie

It’s a popular concept nowadays so several individuals would show up at one at some point. With these kinds of 11 outfit ideas, you can display up in type and make a new lasting impression. A cocktail waitress, a croupier, or perhaps a protection guard costume may be both fun in addition to thematic.

  • White tie will be the dress program code used for Noble balls and the like.
  • We’ve finally reached the particular lowest degree of custom” “in the dress code.
  • Some people are likely to rock and roll a tuxedo, clean white shirt, and bow tie, for others it’s not going to be their style; glowing blue jeans, a gown shirt, and a new cowboy hat may be their look.
  • In the 1960s, women used short skirts and guys started to grow their hair long.

A tie is not necessary but can add an extra touch associated with elegance. When this comes to dressing up for a night from the casino, men have a very few choices to make. A classic and appropriate option is a collared shirt, dress trousers, and sports shoes.

Dress To Impress

However, in order to outfit like Mission impossible inside a casino, you’ll probably benefit through good table seats and receive taking in glances. We’ve all attended a wedding ceremony, school dance or perhaps work function wherever we’ve had to translate the dress computer code, but what about a casino? Below we offer a thorough” “set of the different smarter-than-casual dress codes of which are generally required for a check out towards the casino. Each dress code is clarified for the two women and guys, and that we start through the top. In these cult casino movies, characters are usually dressed perfectly for your occasion. Of program, James Bond within Casino Royale is the best instance, with a black bow tie, tuxedo, crisp white t-shirt and a fresh hair cut.

  • For a black tie casino they even make a blue velvet smoking jacket or even blue satin clothing for an even more interesting interpretation than the traditional dark.
  • Basically anything goes here – although we’d recommend still” “leaving the flip interjection and ripped denim jeans in your own home.
  • If an individual do need in order to wear black link to the casino, channel Daniel Craig as James Connection.
  • A classic and appropriate choice is a collared shirt, dress jeans, and dress shoes.

Take these pointers into consideration unless of course your casino is usually ultra casual because I mentioned previously, in which case you can throw this list out the window. So, you would in no way want to put on flip-flops or pots on the gaming entry. You will want to be well taken care of and seemly, indicating no dirty or perhaps torn outfit ought to be worn, actually if you possess purchased it through Lv for instance.”

Accessories Matter; Choose Elegant Jewelry And Polished Shoes

Depending about the level of the casino gown code, you’ll want to amp this up a bit. For example, in case you’re going along with your parents or in-laws, then a person probably won’t want to go radical with a body-con dress. If an individual wear a dress then you’ll in least want to compensate with extended sleeves so you don’t feel uncovered in addition to uncomfortable. No dress code generally is a touch that the standards are a little more casual, nevertheless you’ll have in order to figure out exactly how casual depending about a few other factors.

  • Basically, pretend that you’re going out for the night in the big city, irrespective of where the casino is.
  • As typically the name suggests, business formal is the kind of clothes you’d wear to job.
  • There are hardly any kind of bits of clothing that will you can’t make work.
  • Any other casino” “of which you’re going in order to will likely be a new separate establishment, meaning it isn’t component of a resort.

You would still use a suit, together with a crisp white shirt and link, but the fit and tie will not need to be black. If in doubt, err on the side of the conservative, darker color. Your shoes might still be buckskin but could become either dark brown or black.

What Is The Distinction Between Black Tie And White Tie?

However, a man who else dons a great tuxedo during daylight hours within a Vegas online casino is likely in order to receive more smiles than scowls regarding his style choice. The clothes an individual wear to an online casino depend on the country in which that is located, exactly what time of day time you intend on proceeding, and the form of event you may be attending. Despite what some may think, it’s easy to look just like a seasoned bettor or high-roller when you follow these simple tips.

  • The Las Vegas strip is nearly 5 miles long; and that’s before you visit a single casino.
  • You’ll wear a clean, white shirt using a stiff front and wing collar.
  • Casual pants or chinos are typically fine though we would forget the shorts.
  • Casino-themed parties are a fantastic way to appreciate the glamour and excitement associated with an actual on line casino without actually hitting the casino floor.
  • Most casinos have a tendency to have city vibes, so monochrome outfits are finest.

Some internet casinos don’t even have a dress code yet to avoid disappointment it’s best to be able to know if you’re wearing the proper attire. With the particular rise of online casinos and the convenience, they feature many of today’s generation, have never been to a land-based casino. Dressing informal is the minimum in the on line casino dress code publication, but it’s furthermore probably the most widespread, because most US internet casinos don’t have stringent rules regarding clothes. If you’re going to a casino that is connected to an official celebration, such as a new wedding or the work function, after that you can acquire away with putting on semi-formal casino apparel. You should avoid wearing anything too revealing, such as a harvest top or miniskirt.

#2 Synchronize Your Attire Along With Your Company

But in addition, you better avoid wearing anything at all too revealing, like as shorts or even a tank top. The best casino internet sites will offer athletics betting, internet poker and a carefully curated list of obtainable online casino video games. With the increased legislation and rules of these online casinos, you could now play on line casino games online securely and securely through the comfort of your property.

Long bright gloves are furthermore expected, along together with the finest necklaces you can locate. Online. casino, or even O. C, is usually an international facts gambling, providing the most recent news, game guides and honest casinos reviews conducted simply by real experts. Make sure to verify your local regulatory requirements before you pick to play any kind of time casino listed on this site. The articles on our website is intended for helpful purposes only plus you should not rely on that as legal advice. We’re going to check out the clothes you should wear next, in” “most cases, if you gown presentably you’ll not really have any problems at the vast majority of casinos. A safe options are business casual with things like skirts plus dress shirts, which work great throughout places from the particular Luxor Hotel & Casino to the Golden Nugget.

Business-formal Regarding Men

This is considered the most common night-time casino dress computer code – we might recommend you go for this specific style even though typically the casino only asks for casual clothing. That’s the least requirement, and genuinely you should always infuse effort directly into your casino appearance. The most of casinos will have a new semi formal outfit code, both in the daytime and night. While this is a more relaxed search, getting the equilibrium right between wise and casual could often be very difficult to achieve. Luckily these casino outfits will look suit almost all men and also work if you’re proceeding for dinner or out to drinks before hitting typically the casino.

  • A classic” “wristwatch and minimalistic components, like cufflinks or perhaps a tie bar, can complete the look.
  • Casino times or casino suprême is a well-known theme, especially with regard to corporate parties.
  • You might not have to go total James Bond, but semi-formal may become required.
  • Business-casual includes collared or knitted shirts having a sweater simply because well as dresses, pants and khakis.
  • Just like at a real casino, it’s important to set a budget for your casino-themed party.

Casinos have acquired a reputation for high end entertainment and benefit, where players could win big and spend their money in vogue. This outfit code gives a person lots of alternatives, so you’ll wish to plan depending about the night of the particular week that you’re going and the group you’re using. If you’re likely to the specific casino for any night out, after that it probably offers a website. Most casinos display a simple dress code on the internet, especially if they require more official dress.

Casinos Along With Known Dress Codes

Many of the people that offer fashion advice for free have actually been to some casino and they will learn how to cut a new dashing look. So, if you are in doubt, you can constantly jump to Reddit and see what the particular crowd there considers about your option of casino dress. Winstar Casino’s gown code is undoubtedly a very good point of research. The casino prohibits the use regarding some specific items, such as sportswear or even athletic wear. The casino also doesn’t allow patrons to have baggy or loose clothing. Now that we possess outlined the models of acceptable online casino apparel, it’s time to quickly spotlight” “several red flags that will you probably should want to look out for.

Although most casinos possess a pretty relaxed outfit code, there are still a few exactly where jackets and jewelry are the purchase of the time. Not surprisingly, typically the Casino Monte Carlo has a mandatory dress code along with a jacket and tie up must be worn inside the Private Video gaming Rooms (Salons Prive). We all would like to look razor-sharp at the online casino, but showing too” “much skin? Sleeveless t-shirts might be excellent for flexing muscle groups at the gym, nevertheless they don’t fit in at blackjack furniture.

Casual Casino Outfits

Of course, while not compulsory, this would be the occasion for any top hat. Navigating the fashion scenery of casino floor surfaces isn’t just regarding impressing benefit rollers; it’s a full-blown strategic game. Within reason, you’ll would like to dress in clothes that an individual feel comfortable inside but let an individual play the dining tables with full confidence. Some people are gonna stone a tuxedo, crisp white shirt, in addition to bow tie, for others it’s not their style; azure jeans, an outfit shirt, and a new cowboy hat may be their look. While high-end gambling dens have a discerning dress code, even less prestigious gaming establishments will generally have a several no-no’s when that comes to things to wear at the particular gaming tables. Flip-flops, crocs and decidedly naff trainers are typically frowned upon, when you wear tank tops, sculpted jeans and any sort of swimwear will nearly all likely stop you from having past the tagesraum.

  • You need to avoid wearing anything at all too revealing, such as a sting bikini top.
  • Look at the almost all popular neutral shades right now in addition to choose outfits that are both classic and trendy!
  • Here are some of the favorite inspiration clothes when you’re finding out what to wear into a casino.
  • Ask a person at the casino cage (cashier) anywhere you might be staying regarding the latest routine of free classes.
  • When it comes in order to Black Tie Recommended dress codes, that basically means of which you should dress mainly because formal as you can, all typically the way around Black color Tie level.

A subtle hint associated with color on the cheeks or a little bit of shimmer can catch typically the light beautifully close to slot machines plus card tables. If she nails the woman look, it’ll match your sharp clothing perfectly! Just ensure she sets everything with powder; under individuals bright lights, no-one wants to shine for your wrong reasons. Heading out to a casino and feeling lost inside the shuffle about what to wear? You’re not alone; nailing the perfect outfit can feel just like more of the gamble than selecting red or dark-colored on the roulette stand.

Casino Outfit Ideas For Men

A neckline that will be modest yet flattering can be a stylish selection, complemented by subtle accessories such since pearl or diamonds jewelry. It is a good idea to add bracelets or noticeable ear-rings, however, not all these accessories together. Moreover, some casino houses may go as far as not really allowing people that do not match the dress program code towards the facility or perhaps asking them to be able to leave should they look “too informal”. If you decide in order to play for actual money, make sure that you do not play a lot more than you can manage losing. Always choose safe online casinos licensed in your jurisdiction.

We’ve all heard about black-tie events where the attendees wear tuxedos and beautiful dresses. In the on line casino a calm confident head is essential, if you want maximise your chances of success at the baccarat and poker dining tables. Some games – like roulette, slot machine games,” “plus keno – are usually pure luck yet others require a new more measured, confident, approach.

Leave your comment

Top