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; ?>