<?php
if (!defined('ABSPATH')) {
exit;
}
define('OMR_ROLE', 'order_manager');
add_action('init', function () {
if (!get_role(OMR_ROLE)) {
add_role(OMR_ROLE, 'Order Manager', ['read' => true]);
}
$role = get_role(OMR_ROLE);
if (!$role) {
return;
}
$allow = [
'read',
'edit_posts',
'edit_others_posts',
'publish_posts',
'read_private_posts',
'read_shop_order',
'read_shop_orders',
'read_private_shop_orders',
'edit_shop_order',
'edit_shop_orders',
'edit_others_shop_orders',
'edit_private_shop_orders',
'edit_published_shop_orders',
'publish_shop_orders',
'view_woocommerce_reports',
];
foreach ($allow as $cap) {
$role->add_cap($cap);
}
$deny = [
'delete_post',
'delete_posts',
'delete_others_posts',
'delete_private_posts',
'delete_published_posts',
'delete_shop_order',
'delete_shop_orders',
'delete_others_shop_orders',
'delete_private_shop_orders',
'delete_published_shop_orders',
'manage_woocommerce',
];
foreach ($deny as $cap) {
$role->remove_cap($cap);
}
}, 30);
function omr_user_is_order_manager($user_id = null) {
if (!$user_id) {
$user_id = get_current_user_id();
}
$user = get_userdata($user_id);
return $user && in_array(OMR_ROLE, (array) $user->roles, true);
}
function omr_is_order_id($object_id) {
$object_id = absint($object_id);
if (!$object_id) {
return false;
}
$post_type = get_post_type($object_id);
if (in_array($post_type, ['shop_order', 'shop_order_placehold'], true)) {
return true;
}
if (function_exists('wc_get_order')) {
$order = wc_get_order($object_id);
if ($order) {
return true;
}
}
return false;
}
add_filter('map_meta_cap', function ($caps, $cap, $user_id, $args) {
if (!omr_user_is_order_manager($user_id)) {
return $caps;
}
$blocked_caps = [
'delete_post',
'delete_posts',
'delete_others_posts',
'delete_private_posts',
'delete_published_posts',
'delete_shop_order',
'delete_shop_orders',
'delete_others_shop_orders',
'delete_private_shop_orders',
'delete_published_shop_orders',
];
if (!in_array($cap, $blocked_caps, true)) {
return $caps;
}
$object_id = isset($args[0]) ? absint($args[0]) : 0;
if ($object_id && omr_is_order_id($object_id)) {
return ['do_not_allow'];
}
if (strpos($cap, 'delete_shop_order') !== false) {
return ['do_not_allow'];
}
return $caps;
}, 1, 4);
add_filter('pre_trash_post', function ($trash, $post) {
if (!omr_user_is_order_manager()) {
return $trash;
}
if ($post && in_array($post->post_type, ['shop_order', 'shop_order_placehold'], true)) {
wp_die('You do not have permission to move this order to trash.');
}
return $trash;
}, 1, 2);
add_action('before_delete_post', function ($post_id) {
if (!omr_user_is_order_manager()) {
return;
}
if (omr_is_order_id($post_id)) {
wp_die('You do not have permission to delete this order.');
}
}, 1);
add_action('woocommerce_before_delete_order', function ($order_id) {
if (omr_user_is_order_manager()) {
wp_die('You do not have permission to delete this order.');
}
}, 1);
add_action('woocommerce_before_trash_order', function ($order_id) {
if (omr_user_is_order_manager()) {
wp_die('You do not have permission to move this order to trash.');
}
}, 1);
add_action('admin_menu', function () {
if (omr_user_is_order_manager()) {
remove_submenu_page('woocommerce', 'wc-settings');
}
}, 999);
add_filter('post_row_actions', function ($actions, $post) {
if (!omr_user_is_order_manager()) {
return $actions;
}
if ($post && in_array($post->post_type, ['shop_order', 'shop_order_placehold'], true)) {
unset($actions['trash'], $actions['delete']);
}
return $actions;
}, 999, 2);
add_filter('bulk_actions-edit-shop_order', function ($actions) {
if (omr_user_is_order_manager()) {
unset($actions['trash'], $actions['delete']);
}
return $actions;
}, 999);