'subscriptions', * 'label' => 'Subscriptions', * 'path' => '/subscriptions', * 'icon' => 'repeat', // lucide icon name * 'children' => [ * ['label' => 'All Subscriptions', 'mode' => 'spa', 'path' => '/subscriptions'], * ['label' => 'New', 'mode' => 'spa', 'path' => '/subscriptions/new'], * ], * ]; * return $tree; * }); */ $tree = apply_filters('woonoow/nav_tree', $tree); // Allow per-section modification foreach ($tree as &$section) { $key = $section['key'] ?? ''; if ($key) { /** * Filter: woonoow/nav_tree/{key}/children * * Allows addons to inject items into specific sections. * * Example: * add_filter('woonoow/nav_tree/products/children', function($children) { * $children[] = [ * 'label' => 'Bundles', * 'mode' => 'spa', * 'path' => '/products/bundles', * ]; * return $children; * }); */ $section['children'] = apply_filters( "woonoow/nav_tree/{$key}/children", $section['children'] ?? [] ); } } // Store in option update_option(self::NAV_OPTION, [ 'version' => self::NAV_VERSION, 'tree' => $tree, 'updated' => time(), ], false); } /** * Get base navigation tree (core sections) * * @return array Base navigation tree */ private static function get_base_tree(): array { return [ [ 'key' => 'dashboard', 'label' => __('Dashboard', 'woonoow'), 'path' => '/', 'icon' => 'layout-dashboard', 'children' => [ ['label' => __('Overview', 'woonoow'), 'mode' => 'spa', 'path' => '/', 'exact' => true], ['label' => __('Revenue', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/revenue'], ['label' => __('Orders', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/orders'], ['label' => __('Products', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/products'], ['label' => __('Customers', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/customers'], ['label' => __('Coupons', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/coupons'], ['label' => __('Taxes', 'woonoow'), 'mode' => 'spa', 'path' => '/dashboard/taxes'], ], ], [ 'key' => 'orders', 'label' => __('Orders', 'woonoow'), 'path' => '/orders', 'icon' => 'receipt-text', 'children' => [], // Orders has no submenu by design ], [ 'key' => 'products', 'label' => __('Products', 'woonoow'), 'path' => '/products', 'icon' => 'package', 'children' => [ ['label' => __('All products', 'woonoow'), 'mode' => 'spa', 'path' => '/products'], ['label' => __('New', 'woonoow'), 'mode' => 'spa', 'path' => '/products/new'], ['label' => __('Categories', 'woonoow'), 'mode' => 'spa', 'path' => '/products/categories'], ['label' => __('Tags', 'woonoow'), 'mode' => 'spa', 'path' => '/products/tags'], ['label' => __('Attributes', 'woonoow'), 'mode' => 'spa', 'path' => '/products/attributes'], ], ], [ 'key' => 'coupons', 'label' => __('Coupons', 'woonoow'), 'path' => '/coupons', 'icon' => 'tag', 'children' => [ ['label' => __('All coupons', 'woonoow'), 'mode' => 'spa', 'path' => '/coupons'], ['label' => __('New', 'woonoow'), 'mode' => 'spa', 'path' => '/coupons/new'], ], ], [ 'key' => 'customers', 'label' => __('Customers', 'woonoow'), 'path' => '/customers', 'icon' => 'users', 'children' => [ ['label' => __('All customers', 'woonoow'), 'mode' => 'spa', 'path' => '/customers'], ], ], [ 'key' => 'settings', 'label' => __('Settings', 'woonoow'), 'path' => '/settings', 'icon' => 'settings', 'children' => self::get_settings_children(), ], ]; } /** * Get settings submenu children * * @return array Settings submenu items */ private static function get_settings_children(): array { $admin = admin_url('admin.php'); $children = [ // Core Settings (Shopify-inspired) ['label' => __('Store Details', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/store'], ['label' => __('Payments', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/payments'], ['label' => __('Shipping & Delivery', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/shipping'], ]; // Only show Tax if enabled in WooCommerce if (wc_tax_enabled()) { $children[] = ['label' => __('Tax', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/tax']; } $children = array_merge($children, [ ['label' => __('Notifications', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/notifications'], ['label' => __('Developer', 'woonoow'), 'mode' => 'spa', 'path' => '/settings/developer'], ]); return $children; } /** * Get the complete navigation tree * * @return array Navigation tree */ public static function get_nav_tree(): array { $data = get_option(self::NAV_OPTION, []); return $data['tree'] ?? self::get_base_tree(); } /** * Get a specific section by key * * @param string $key Section key * @return array|null Section data or null if not found */ public static function get_section(string $key): ?array { $tree = self::get_nav_tree(); foreach ($tree as $section) { if (($section['key'] ?? '') === $key) { return $section; } } return null; } /** * Flush the navigation cache */ public static function flush() { delete_option(self::NAV_OPTION); } /** * Get navigation tree for frontend * * @return array Array suitable for JSON encoding */ public static function get_frontend_nav_tree(): array { return self::get_nav_tree(); } }