Untitled
unknown
plain_text
7 months ago
6.9 kB
3
Indexable
/**
* CONFIGURATION - EDIT THESE VALUES
*/
// Set to true to use rolling 3-month periods instead of calendar quarters
$b2bking_use_rolling_quarters = false;
// Configure the group rules - Replace the IDs with your actual B2BKing group IDs
$b2bking_group_rules = array(
// Elite Group
'elite' => array(
'id' => 123, // Replace with actual Elite group ID
'threshold' => 25000, // Quarterly spending threshold in your currency
'upgrade_to' => 'elite_plus',
'downgrade_to' => 'elite_minus'
),
// Elite+ Group
'elite_plus' => array(
'id' => 124, // Replace with actual Elite+ group ID
'threshold' => 50000,
'downgrade_to' => 'elite'
),
// Elite- Group
'elite_minus' => array(
'id' => 125, // Replace with actual Elite- group ID
'threshold' => 5000,
'upgrade_to' => 'elite'
)
);
/**
* CODE BELOW - No need to edit unless you want to customize functionality
*/
// Schedule the quarterly check event
function b2bking_schedule_quarterly_checks() {
// Schedule the event if it's not already scheduled
if (!wp_next_scheduled('b2bking_quarterly_group_rules_check')) {
// Set to run at midnight on the 1st day of each quarter
$next_quarter_dates = array(
mktime(0, 0, 0, 1, 1, date('Y')), // January 1st
mktime(0, 0, 0, 4, 1, date('Y')), // April 1st
mktime(0, 0, 0, 7, 1, date('Y')), // July 1st
mktime(0, 0, 0, 10, 1, date('Y')), // October 1st
);
// Find the next upcoming quarter date
$now = time();
foreach ($next_quarter_dates as $date) {
if ($date > $now) {
wp_schedule_event($date, 'quarterly', 'b2bking_quarterly_group_rules_check');
break;
}
}
// If we've passed all quarter dates for this year, schedule for next year's January 1st
if (!wp_next_scheduled('b2bking_quarterly_group_rules_check')) {
wp_schedule_event(
mktime(0, 0, 0, 1, 1, date('Y') + 1),
'quarterly',
'b2bking_quarterly_group_rules_check'
);
}
}
}
add_action('init', 'b2bking_schedule_quarterly_checks');
// Register the quarterly interval for wp_schedule_event
function b2bking_add_quarterly_schedule($schedules) {
$schedules['quarterly'] = array(
'interval' => 7776000, // 90 days in seconds (approximate quarter)
'display' => __('Quarterly')
);
return $schedules;
}
add_filter('cron_schedules', 'b2bking_add_quarterly_schedule');
// Function to process all users and check their quarterly order totals
function b2bking_process_quarterly_group_rules() {
// Get all users with the customer role
$customer_users = get_users(array('role' => 'customer'));
// Loop through each customer
foreach ($customer_users as $user) {
b2bking_check_quarterly_rules($user->ID);
}
}
add_action('b2bking_quarterly_group_rules_check', 'b2bking_process_quarterly_group_rules');
// Function to check if a user meets the quarterly order total criteria
function b2bking_check_quarterly_rules($user_id) {
global $b2bking_use_rolling_quarters, $b2bking_group_rules;
// Get current user group
$current_group_id = get_user_meta($user_id, 'b2bking_customergroup', true);
// Skip if user doesn't have a B2BKing group
if (empty($current_group_id)) {
return;
}
// Use the globally defined group rules
$group_rules = $b2bking_group_rules;
// Map ID to group key for easier lookups
$group_id_map = array();
foreach ($group_rules as $key => $group) {
$group_id_map[$group['id']] = $key;
}
// If user is not in one of our defined groups, exit
if (!isset($group_id_map[$current_group_id])) {
return;
}
$current_group_key = $group_id_map[$current_group_id];
// Set date range for the quarter
if ($b2bking_use_rolling_quarters) {
// Option 1: Last 3 months rolling window (for flexibility)
$end_date = date('Y-m-d H:i:s');
$start_date = date('Y-m-d H:i:s', strtotime('-3 months'));
} else {
// Option 2: Previous calendar quarter
$current_month = date('n');
$current_year = date('Y');
// Determine which quarter we just completed
if ($current_month >= 1 && $current_month <= 3) {
// We're in Q1, so check Q4 of previous year
$quarter_start_month = 10;
$quarter_start_year = $current_year - 1;
} else {
// Check the previous quarter of current year
$quarter_start_month = floor(($current_month - 1) / 3) * 3 - 2;
$quarter_start_year = $current_year;
}
$quarter_end_month = $quarter_start_month + 2;
$quarter_end_year = $quarter_start_year;
$start_date = date('Y-m-d H:i:s', mktime(0, 0, 0, $quarter_start_month, 1, $quarter_start_year));
$end_date = date('Y-m-d H:i:s', mktime(23, 59, 59, $quarter_end_month, date('t', mktime(0, 0, 0, $quarter_end_month, 1, $quarter_end_year)), $quarter_end_year));
}
// Calculate order total for the quarter
$quarterly_total = b2bking_get_user_order_total($user_id, $start_date, $end_date);
// Get current group rule
$group_rule = $group_rules[$current_group_key];
$threshold = $group_rule['threshold'];
// Determine if group change is needed
$new_group_key = null;
if ($quarterly_total >= $threshold && isset($group_rule['upgrade_to'])) {
$new_group_key = $group_rule['upgrade_to'];
} elseif ($quarterly_total < $threshold && isset($group_rule['downgrade_to'])) {
$new_group_key = $group_rule['downgrade_to'];
}
// If a group change is needed, update the user's group
if ($new_group_key && isset($group_rules[$new_group_key]['id'])) {
$new_group_id = $group_rules[$new_group_key]['id'];
// Update the user's group
update_user_meta($user_id, 'b2bking_customergroup', $new_group_id);
}
}
// Function to calculate a user's order total for a specific date range
function b2bking_get_user_order_total($user_id, $start_date, $end_date) {
// Get all orders for this user in the date range
$args = array(
'customer_id' => $user_id,
'date_created' => $start_date . '...' . $end_date,
'status' => array('wc-completed', 'wc-processing'), // Only count completed and processing orders
'limit' => -1, // Get all orders
);
$orders = wc_get_orders($args);
$total = 0;
// Sum the order totals
foreach ($orders as $order) {
$total += $order->get_total();
}
return $total;
}Editor is loading...
Leave a Comment