ATS FILE v2 LOADED OK

'; }); /** * Re // TEMP: reset opcache add_action('wp_ajax_ats_reset_opcache', function() { if (function_exists('opcache_reset')) { opcache_reset(); echo 'reset'; } else { echo 'no opcache'; } die(); }); commended way to include parent theme styles. * Please see http://codex.wordpress.org/Child_Themes#How_to_Create_a_Child_Theme */ add_action('wp_enqueue_scripts', 'theme_enqueue_styles', 998); function theme_enqueue_styles() { wp_enqueue_style('flozen-style', get_template_directory_uri() . '/style.css'); wp_enqueue_style('flozen-child-style', get_stylesheet_uri()); } /** * Your code goes below */ function wc_get_product_id_by_variation_sku($sku) { $args = array( 'post_type' => 'product_variation', 'meta_query' => array( array( 'key' => '_sku', 'value' => $sku, ) ) ); // Get the posts for the sku $posts = get_posts( $args); if ($posts) { return $posts[0]; } else { return false; } } function wc_minimum_cart_value() { // Set the minimum cart value $minimum = 10; if ( WC()->cart->total < $minimum ) { // Display error message on the cart page if( is_cart() ) { wc_print_notice( sprintf( 'Your current cart total is %s — you must have an order with a minimum of %s to place your order.' , wc_price( WC()->cart->total ), wc_price( $minimum ) ), 'error' ); } else { // Display error message on the checkout page wc_add_notice( sprintf( 'Your current cart total is %s — you must have an order with a minimum of %s to place your order.' , wc_price( WC()->cart->total ), wc_price( $minimum ) ), 'error' ); } } } // Hook to enforce the minimum cart value during the checkout process add_action( 'woocommerce_checkout_process', 'wc_minimum_cart_value' ); // Hook to enforce the minimum cart value before displaying the cart add_action( 'woocommerce_before_cart' , 'wc_minimum_cart_value' ); // Hook to enforce the minimum cart value on the checkout page add_action( 'woocommerce_before_checkout_form', 'wc_minimum_cart_value', 20 ); function disable_cart_and_checkout_buttons() { // Set the minimum cart value $minimum = 10; if ( WC()->cart->total < $minimum ) { ?> id, ['edit-product', 'edit-page', 'edit-post'])) { echo ''; } }); // ===== WHOLESALE PAGE STYLES ===== add_action('wp_head', function() { if (is_page('wholesale')) { echo ''; } }); // ===== DARK GOLD THEME — PHASE 2 ===== add_action('wp_head', function() { if (is_admin()) return; echo ''; }, 999); // ============================================================ // PHASE 3 — Homepage Additional Sections // ============================================================ add_filter('the_content', function($content) { if (!is_front_page() && !is_home()) return $content; $sections = '
🚀
Same-Day Dispatch
Order before 2PM on weekdays
🌏
Ships Across SEA
SG, MY, TH, ID, PH & more
💎
100% Authentic
Authorised distributor for all brands
🤝
Wholesale Pricing
Exclusive rates for studios & shops
Our Brands
20+ Premium
Brands Stocked
FK IRONSMachines CHEYENNEMachines BISHOPMachines INTENZEInks ETERNALInks DYNAMICInks KWADRONNeedles CRITICALPower HUSTLE BUTTERAftercare KURO SUMIInks
Why Choose ATS
Trusted By Artists
Across Asia
10+
Years in Business
Serving the tattoo community since 2012
1,800+
Products Stocked
Machines, inks, needles, aftercare & more
SEA
Shipping Coverage
Singapore, Malaysia, Thailand, Indonesia & more
For Studios & Shops
Wholesale
Pricing Available
Apply for a wholesale account and get exclusive discounted pricing on all products. Tiers from 10% up to 30% off.
Silver — 10% off (min. SGD $300/mo)
Gold — 20% off (min. SGD $600/mo)
Platinum — 30% off (min. SGD $1,200/mo)
Apply for Wholesale
'; return $content . $sections; }, 20); // === ATS MEMBERSHIP POPUP STEP === add_action('wp_footer', function() { if (is_admin()) return; ?> 'ids')); if (is_wp_error($cat_ids) || empty($cat_ids)) return false; // Parent IDs: 163 = Tattoo Machines, 587 = Tattoo Transfer Paper & Printer $parent_ids = array(163, 587); $mp_ids = $parent_ids; foreach ($parent_ids as $pid) { $children = get_term_children($pid, 'product_cat'); if (!is_wp_error($children)) $mp_ids = array_merge($mp_ids, $children); } // Extra brand-specific machine subcategories not directly under 163 $extra = array(580, 400, 609, 601, 602, 597, 443, 596, 412); $mp_ids = array_merge($mp_ids, $extra); return !empty(array_intersect($cat_ids, $mp_ids)); } // 2. On order complete: assign premium_member role if product 19333 purchased add_action('woocommerce_order_status_completed', function($order_id) { $order = wc_get_order($order_id); if (!$order) return; $user_id = $order->get_user_id(); if (!$user_id) return; foreach ($order->get_items() as $item) { if ((int)$item->get_product_id() === 19333) { $user = new WP_User($user_id); $user->add_role('premium_member'); $now = time(); update_user_meta($user_id, 'ats_premium_since', $now); update_user_meta($user_id, 'ats_premium_expires', strtotime('+1 year', $now)); update_user_meta($user_id, 'ats_premium_year_spend', 0); break; } } }, 10); // 3. On order complete: track cumulative spend within membership year add_action('woocommerce_order_status_completed', function($order_id) { $order = wc_get_order($order_id); if (!$order) return; $user_id = $order->get_user_id(); if (!$user_id) return; $user = new WP_User($user_id); if (!in_array('premium_member', (array)$user->roles)) return; $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); if (!$expires || time() > $expires) return; // Skip if this order is the membership purchase itself foreach ($order->get_items() as $item) { if ((int)$item->get_product_id() === 19333) return; } $current = (float)get_user_meta($user_id, 'ats_premium_year_spend', true); // Use subtotal (pre-discount) so spend tracks actual product value $order_subtotal = 0; foreach ($order->get_items() as $item) { $order_subtotal += (float)$item->get_subtotal(); } update_user_meta($user_id, 'ats_premium_year_spend', $current + $order_subtotal); }, 15); // 4. Apply cart discount for premium members add_action('woocommerce_cart_calculate_fees', function($cart) { if (is_admin() && !defined('DOING_AJAX')) return; $user_id = get_current_user_id(); if (!$user_id) return; $user = new WP_User($user_id); if (!in_array('premium_member', (array)$user->roles)) return; $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); if (!$expires || time() > $expires) return; $discount = 0; foreach ($cart->get_cart() as $item_key => $item) { // Skip the membership product itself if ((int)$item['product_id'] === 19333) continue; $line_total = (float)$item['line_total']; $rate = ats_is_machine_or_printer($item['product_id']) ? 0.05 : 0.10; $discount += $line_total * $rate; } if ($discount > 0) { $cart->add_fee(__('Premium Member Discount', 'flozen-theme-child'), -round($discount, 2)); } }); // 5. On every page load: auto-renew or expire premium membership add_action('init', function() { if (!is_user_logged_in()) return; $user_id = get_current_user_id(); $user = new WP_User($user_id); if (!in_array('premium_member', (array)$user->roles)) return; $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); if (!$expires || time() <= $expires) return; // Membership has expired — check if they qualify for free renewal $year_spend = (float)get_user_meta($user_id, 'ats_premium_year_spend', true); if ($year_spend >= 3000) { // Free renewal: extend 1 year from expiry date, reset spend counter update_user_meta($user_id, 'ats_premium_expires', strtotime('+1 year', $expires)); update_user_meta($user_id, 'ats_premium_year_spend', 0); } else { // Not eligible — remove premium role $user->remove_role('premium_member'); } }); // Register premium_member role (runs once on theme load) add_action('after_switch_theme', function() { if (!get_role('premium_member')) { add_role('premium_member', 'Premium Member', array('read' => true)); } }); // Also ensure role exists on every load (safe fallback) add_action('init', function() { if (!get_role('premium_member')) { add_role('premium_member', 'Premium Member', array('read' => true)); } }, 1); // Shortcode: [ats_member_status] — shows membership status widget for logged-in premium members add_shortcode('ats_member_status', function() { if (!is_user_logged_in()) return ''; $user_id = get_current_user_id(); $user = new WP_User($user_id); if (!in_array('premium_member', (array)$user->roles)) return ''; $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); $spend = (float)get_user_meta($user_id, 'ats_premium_year_spend', true); $target = 3000; $pct = min(100, round(($spend / $target) * 100)); $days_left = max(0, ceil(($expires - time()) / 86400)); $renew_date = $expires ? date('d M Y', $expires) : '-'; ob_start(); ?>
PREMIUM MEMBER
Membership renews ( days left)
Free renewal progress S$ / S$3,000
% — = 100 ? 'You qualify for FREE renewal! 🎉' : 'Spend S$' . number_format($target - $spend, 2) . ' more for free renewal'; ?>
get_user_id(); if (!$user_id) return; // Only for non-premium members $user = new WP_User($user_id); if (in_array('premium_member', (array)$user->roles)) return; // Step 1: If this order used an earned discount, mark it as used $discount_earned = (int)get_user_meta($user_id, 'ats_free_discount_earned', true); if ($discount_earned) { update_user_meta($user_id, 'ats_free_discount_earned', 0); update_user_meta($user_id, 'ats_free_total_spend', 0); } // Step 2: Add this order's subtotal to cumulative spend $order_subtotal = 0; foreach ($order->get_items() as $item) { $order_subtotal += (float)$item->get_subtotal(); } $current_spend = (float)get_user_meta($user_id, 'ats_free_total_spend', true); $new_spend = $current_spend + $order_subtotal; // Step 3: Check if milestone reached if ($new_spend >= 1000 && !get_user_meta($user_id, 'ats_free_discount_earned', true)) { // Award 5% discount, carry over any excess spend update_user_meta($user_id, 'ats_free_discount_earned', 1); update_user_meta($user_id, 'ats_free_total_spend', $new_spend - 1000); } else { update_user_meta($user_id, 'ats_free_total_spend', $new_spend); } }, 20); // Apply 5% discount at cart when reward is earned add_action('woocommerce_cart_calculate_fees', function($cart) { if (is_admin() && !defined('DOING_AJAX')) return; $user_id = get_current_user_id(); if (!$user_id) return; $user = new WP_User($user_id); if (in_array('premium_member', (array)$user->roles)) return; // Only apply if they have earned a discount if (!(int)get_user_meta($user_id, 'ats_free_discount_earned', true)) return; $discount = 0; foreach ($cart->get_cart() as $item) { $discount += (float)$item['line_total'] * 0.05; } if ($discount > 0) { $cart->add_fee(__('Loyalty Reward — 5% Off', 'flozen-theme-child'), -round($discount, 2)); } }, 10); // Shortcode: [ats_free_member_status] — spend progress widget for standard members add_shortcode('ats_free_member_status', function() { if (!is_user_logged_in()) return ''; $user_id = get_current_user_id(); $user = new WP_User($user_id); if (in_array('premium_member', (array)$user->roles)) return ''; $spend = (float)get_user_meta($user_id, 'ats_free_total_spend', true); $earned = (int)get_user_meta($user_id, 'ats_free_discount_earned', true); $pct = min(100, round(($spend / 1000) * 100)); $remaining = max(0, 1000 - $spend); ob_start(); ?>
STANDARD MEMBER
🎉 5% discount ready — applies automatically at checkout!
Spend S$ more to earn 5% off your next order
Progress to next reward S$ / S$1,000
% — S$ to go
Reward unlocked! Shop now to use your 5% discount.
Upgrade to Premium Membership for instant 10% off everything — no spend required.
roles)) { wp_redirect(wc_get_page_permalink('myaccount')); exit; } } // Add premium product to cart and go straight to checkout WC()->cart->empty_cart(); WC()->cart->add_to_cart(19333); wp_redirect(wc_get_checkout_url()); exit; }); // Force account creation at checkout when Premium Membership is in cart add_filter('woocommerce_checkout_registration_required', function($required) { if (is_user_logged_in()) return $required; foreach (WC()->cart->get_cart() as $item) { if ((int)$item['product_id'] === 19333) return true; } return $required; }); // 3. Show "Upgrade to Premium" banner on My Account dashboard for non-premium members add_action('woocommerce_account_dashboard', function() { $user_id = get_current_user_id(); $user = new WP_User($user_id); if (in_array('premium_member', (array)$user->roles)) { // Already premium — show status instead $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); $days = $expires ? max(0, ceil(($expires - time()) / 86400)) : 0; echo '
'; echo ''; echo '
PREMIUM MEMBER
'; echo '
Membership expires in ' . $days . ' days  |  View benefits
'; echo '
'; } else { // Not premium — show upgrade prompt echo '
'; echo '
'; echo ''; echo '
Upgrade to Premium Membership
'; echo '
10% off all orders  |  5% off machines & printers  |  Free renewal at S$3,000 spend
'; echo '
'; echo 'UPGRADE — S$99/yr'; echo '
'; } }); // ============================================================ // ATS — AUTO-COMPLETE PREMIUM MEMBERSHIP ORDERS // Virtual products auto-complete so role is assigned immediately // ============================================================ add_filter('woocommerce_payment_complete_order_status', function($status, $order_id, $order) { if (!$order) return $status; foreach ($order->get_items() as $item) { if ((int)$item->get_product_id() === 19333) { return 'completed'; // Auto-complete Premium Membership orders } } return $status; }, 10, 3); // Also auto-complete if order only contains virtual products add_filter('woocommerce_order_item_needs_processing', function($needs, $product, $order_id) { if ($product && $product->is_virtual()) return false; return $needs; }, 10, 3); // ============================================================ // ATS — MANUAL PREMIUM MEMBERSHIP MANAGEMENT (BACKEND) // ============================================================ // 1. Add Premium Membership section to User Profile edit page add_action('show_user_profile', 'ats_show_premium_fields'); add_action('edit_user_profile', 'ats_show_premium_fields'); function ats_show_premium_fields($user) { if (!current_user_can('manage_options')) return; $is_premium = in_array('premium_member', (array)$user->roles); $expires = esc_attr(get_user_meta($user->ID, 'ats_premium_expires', true)); $since = get_user_meta($user->ID, 'ats_premium_since', true); $year_spend = floatval(get_user_meta($user->ID, 'ats_premium_year_spend', true)); $nonce = wp_create_nonce('ats_set_premium'); $checked = $is_premium ? ' checked="checked"' : ''; $since_html = $since ? 'Member Since' . esc_html(date('d M Y', strtotime($since))) . '' : ''; echo '

⭐ ATS Premium Membership

'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo $since_html; echo ''; echo '
Status

Tick to grant premium_member role. Untick to remove.

Expiry Date

Leave blank for 1 year from today.

Year Spend (S$)

Cumulative spend this year. S$3,000 = free renewal.

'; } function ats_save_premium_fields($user_id) { if (!current_user_can('manage_options')) return; $is_premium = isset($_POST['ats_premium_active']) ? 1 : 0; $user = new WP_User($user_id); if ($is_premium) { $user->add_role('premium_member'); $raw = sanitize_text_field($_POST['ats_premium_expires'] ?? ''); if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $raw, $m)) { $exp = $m[3] . '-' . $m[2] . '-' . $m[1]; } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $raw)) { $exp = $raw; } else { $exp = date('Y-m-d', strtotime('+1 year')); } update_user_meta($user_id, 'ats_premium_expires', $exp); if (!get_user_meta($user_id, 'ats_premium_since', true)) { update_user_meta($user_id, 'ats_premium_since', current_time('Y-m-d')); } update_user_meta($user_id, 'ats_premium_year_spend', floatval($_POST['ats_premium_year_spend'] ?? 0)); } else { $user->remove_role('premium_member'); delete_user_meta($user_id, 'ats_premium_expires'); delete_user_meta($user_id, 'ats_premium_since'); update_user_meta($user_id, 'ats_premium_year_spend', 0); } } // AJAX endpoint for Save Premium button add_action('wp_ajax_ats_set_premium', function() { if (!current_user_can('manage_options')) wp_die('Unauthorized'); check_ajax_referer('ats_set_premium', '_ajax_nonce'); $user_id = intval($_POST['user_id'] ?? 0); if (!$user_id) wp_send_json_error('No user ID'); $user = new WP_User($user_id); $is_premium = intval($_POST['is_premium'] ?? 0); if ($is_premium) { $user->add_role('premium_member'); $raw = sanitize_text_field($_POST['expires'] ?? ''); if (preg_match('/^(\d{2})\/(\d{2})\/(\d{4})$/', $raw, $m)) { $exp = $m[3] . '-' . $m[2] . '-' . $m[1]; } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $raw)) { $exp = $raw; } else { $exp = date('Y-m-d', strtotime('+1 year')); } update_user_meta($user_id, 'ats_premium_expires', $exp); if (!get_user_meta($user_id, 'ats_premium_since', true)) { update_user_meta($user_id, 'ats_premium_since', current_time('Y-m-d')); } update_user_meta($user_id, 'ats_premium_year_spend', floatval($_POST['year_spend'] ?? 0)); wp_send_json_success(array('message' => 'Premium granted until ' . $exp)); } else { $user->remove_role('premium_member'); delete_user_meta($user_id, 'ats_premium_expires'); delete_user_meta($user_id, 'ats_premium_since'); update_user_meta($user_id, 'ats_premium_year_spend', 0); wp_send_json_success(array('message' => 'Premium revoked')); } }); // JS for Save Premium button add_action('admin_footer', function() { $screen = get_current_screen(); if (!$screen || !in_array($screen->id, array('profile', 'user-edit'))) return; echo ''; }); // 3. Add "Upgrade to Premium" column in Users list add_filter('manage_users_columns', function($cols) { $cols['ats_premium'] = '⭐ Premium'; return $cols; }); add_filter('manage_users_custom_column', function($output, $col, $user_id) { if ($col !== 'ats_premium') return $output; $user = new WP_User($user_id); if (in_array('premium_member', (array)$user->roles)) { $expires = (int)get_user_meta($user_id, 'ats_premium_expires', true); $days = $expires ? max(0, ceil(($expires - time()) / 86400)) : '?'; return '★ Active
' . $days . ' days left'; } $upgrade_url = admin_url('user-edit.php?user_id=' . $user_id . '#ats-premium'); return 'Upgrade'; }, 10, 3); // 4. Bulk action: Upgrade selected users to Premium (1 year from today) add_filter('bulk_action_links_users', function($actions) { $actions['ats_grant_premium'] = '⭐ Grant Premium (1 year)'; $actions['ats_revoke_premium'] = '✕ Revoke Premium'; return $actions; }); add_filter('bulk_actions-users', function($actions) { $actions['ats_grant_premium'] = '⭐ Grant Premium (1 year)'; $actions['ats_revoke_premium'] = '✕ Revoke Premium'; return $actions; }); add_filter('handle_bulk_actions-users', function($redirect, $action, $user_ids) { if ($action === 'ats_grant_premium') { foreach ($user_ids as $uid) { $u = new WP_User($uid); $u->add_role('premium_member'); update_user_meta($uid, 'ats_premium_expires', strtotime('+1 year')); update_user_meta($uid, 'ats_premium_year_spend', 0); if (!get_user_meta($uid, 'ats_premium_since', true)) { update_user_meta($uid, 'ats_premium_since', time()); } } return add_query_arg('ats_granted', count($user_ids), $redirect); } if ($action === 'ats_revoke_premium') { foreach ($user_ids as $uid) { $u = new WP_User($uid); $u->remove_role('premium_member'); } return add_query_arg('ats_revoked', count($user_ids), $redirect); } return $redirect; }, 10, 3); // Show success notice after bulk action add_action('admin_notices', function() { if (!empty($_GET['ats_granted'])) { echo '

⭐ Premium membership granted to ' . (int)$_GET['ats_granted'] . ' user(s).

'; } if (!empty($_GET['ats_revoked'])) { echo '

Premium membership revoked from ' . (int)$_GET['ats_revoked'] . ' user(s).

'; } }); // ATS TEMP FIX - REMOVE AFTER USE add_action('wp_ajax_ats_fix_plugin', function() { if (!current_user_can('manage_options')) wp_die('no'); $b = base64_decode(str_replace(' ', '+', $_POST['c'] ?? '')); $p = WP_PLUGIN_DIR . '/ats-premium-manager/ats-premium-manager.php'; $ok = file_put_contents($p, $b); wp_send_json(array('written' => $ok, 'path' => $p)); }); // END ATS TEMP FIX // Remove ATS show button on reset password page only add_action('wp_footer', function() { if (is_admin()) return; if (!is_account_page()) return; ?> Page not found – Asia Tattoo Supply
404

Oops! That page can’t be found.

Sorry, but the page you are looking for is not found. Please, make sure you have typed the current URL.

GO TO HOME
Navigation

My Cart

Close

Great to see you here !

A password will be sent to your email address.


Your personal data will be used to support your experience throughout this website, to manage access to your account, and for other purposes described in our privacy policy.

Already got an account?

Quickview

Close

Categories