<?php
add_action('init', function () {
// Gmail-inspired custom statuses
$statuses_to_add = [
'requested' => ['label' => 'Requested', 'color' => '#e3f2fd'],
'awaiting_confirmation' => ['label' => 'Awaiting Confirmation', 'color' => '#fff3e0'],
'confirmed' => ['label' => 'Confirmed', 'color' => '#f1f8e9'],
'in_transit' => ['label' => 'In Transit', 'color' => '#e8eaf6'],
'arrived_locally' => ['label' => 'Arrived Locally', 'color' => '#ede7f6'],
'splitted' => ['label' => 'Split Order', 'color' => '#f3e5f5'],
'ready_to_pick' => ['label' => 'Ready to Pickup', 'color' => '#f0f4c3'],
'ready_to_deliver' => ['label' => 'Ready to Deliver', 'color' => '#e0f7fa'],
'partially_delivered' => ['label' => 'Partially Delivered', 'color' => '#fffde7'],
'completed' => ['label' => 'Completed', 'color' => '#e8f5e9'],
'returned' => ['label' => 'Returned', 'color' => '#fce4ec'],
'cancelled' => ['label' => 'Cancelled', 'color' => '#fbe9e7'],
'refunded' => ['label' => 'Refunded', 'color' => '#ede7f6'],
];
// 1. Save or merge into custom_order_statuses option
$existing = get_option('custom_order_statuses', []);
$merged = $existing;
foreach ($statuses_to_add as $slug => $data) {
$label = $data['label'];
$color = $data['color'];
$merged[$slug] = ['label' => $label, 'color' => $color];
// 2. Register as post status
register_post_status('wc-' . $slug, [
'label' => $label,
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop("$label <span class='count'>(%s)</span>", "$label <span class='count'>(%s)</span>"),
]);
}
update_option('custom_order_statuses', $merged);
});
// 3. Register them into WooCommerce dropdowns
add_filter('wc_order_statuses', function ($statuses) {
$custom = get_option('custom_order_statuses', []);
foreach ($custom as $slug => $data) {
$statuses['wc-' . $slug] = $data['label'];
}
return $statuses;
});
// 4. Ensure role_permissions has these labels set to TRUE
add_action('admin_init', function () {
$custom = get_option('custom_order_statuses', []);
$roles = ['administrator', 'shop_manager', 'wcfm_vendor', 'customer'];
$role_permissions = get_option('role_permissions', []);
foreach ($roles as $role) {
if (!isset($role_permissions[$role])) $role_permissions[$role] = [];
if (!isset($role_permissions[$role]['order_statuses'])) $role_permissions[$role]['order_statuses'] = [];
foreach ($custom as $slug => $data) {
$label = $data['label'];
$role_permissions[$role]['order_statuses'][$label] = true;
}
}
update_option('role_permissions', $role_permissions);
});