| 1 |
<?php |
| 2 |
|
| 3 |
namespace Extendify\Shared\Services; |
| 4 |
|
| 5 |
class AdminMenuList |
| 6 |
{ |
| 7 |
public static $transient = 'extendify_admin_pages_menu'; |
| 8 |
|
| 9 |
public static function init() |
| 10 |
{ |
| 11 |
\add_action("admin_menu", [self::class, "populate"], 999); |
| 12 |
\add_action('upgrader_process_complete', [self::class, 'remove']); |
| 13 |
|
| 14 |
// Upgrader process completed does not fire on activating/deactivating a plugin, |
| 15 |
// so we need to regenerate the menu after activate/deactivate the plugin |
| 16 |
\add_action('activate_plugin', [self::class, 'remove']); |
| 17 |
\add_action('deactivate_plugin', [self::class, 'remove']); |
| 18 |
} |
| 19 |
|
| 20 |
/** |
| 21 |
* Retrieves all WordPress admin page slugs (menu and submenu items). |
| 22 |
* Results are cached for performance. |
| 23 |
* |
| 24 |
* @return void |
| 25 |
*/ |
| 26 |
public static function populate() |
| 27 |
{ |
| 28 |
global $menu, $submenu; |
| 29 |
|
| 30 |
if (get_transient(self::$transient) !== false || !is_array($menu) || !is_array($submenu)) { |
| 31 |
return; |
| 32 |
} |
| 33 |
|
| 34 |
$adminUrl = admin_url(); |
| 35 |
$allPages = []; |
| 36 |
|
| 37 |
foreach ($menu as $menuItem) { |
| 38 |
if (empty($menuItem[0]) || !isset($menuItem[2])) { |
| 39 |
continue; |
| 40 |
} |
| 41 |
$allPages[] = $menuItem[2]; |
| 42 |
} |
| 43 |
|
| 44 |
foreach ($submenu as $parent => $submenuItems) { |
| 45 |
if (!isset($parent) || strpos($parent, '.php') === false) { |
| 46 |
$parent = 'admin.php'; |
| 47 |
} |
| 48 |
|
| 49 |
$subItems = array_map(function ($item) use ($parent) { |
| 50 |
return strpos($item, '.php') === false ? sprintf('%s?page=%s', $parent, $item) : $item; |
| 51 |
}, array_column($submenuItems, 2)); |
| 52 |
|
| 53 |
array_push($allPages, ...$subItems); |
| 54 |
} |
| 55 |
|
| 56 |
$allPages = array_values(array_filter($allPages, function ($page) { |
| 57 |
return strpos($page, 'http') === false; |
| 58 |
})); |
| 59 |
|
| 60 |
foreach ($allPages as &$page) { |
| 61 |
$page = str_replace($adminUrl, '', $page); |
| 62 |
|
| 63 |
if (strpos($page, '.php') === false) { |
| 64 |
$page = 'admin.php?page=' . $page; |
| 65 |
} |
| 66 |
} |
| 67 |
unset($page); |
| 68 |
|
| 69 |
set_transient(self::$transient, $allPages); |
| 70 |
} |
| 71 |
|
| 72 |
public static function remove($plugin) |
| 73 |
{ |
| 74 |
\delete_transient(self::$transient); |
| 75 |
} |
| 76 |
} |
| 77 |
|