-
Notifications
You must be signed in to change notification settings - Fork 41
migration wp explorer app
Status: shipped with the App Framework port. Affects plugins that opened, configured, or extended the legacy desktop-mode-my-wordpress native window or its bundle's wp.os.myWordpress API.
WP Explorer was rebuilt as an App Framework app (apps/my-wordpress/, window id my-wordpress) and the legacy native window was deleted outright — its bundle, its registration, its pinned icon, and its window-only configuration surface. The app carries the original's name, its folder-mark icon, its pinned launcher slot, and every surface the window hosted: the section grids, the detail dossiers, the media "used in" scan, the Agents section, the WooCommerce sections, and — last to move — the full-body activity footprint.
What did not change: the os.my-wordpress.* JS hook seams (they fire from the app with the same payload shapes), the openstation_my_wordpress_* PHP helper functions and REST routes, the shared explorer stylesheet (desktop-mode-my-wordpress style handle, now a companion of the app window), the user-meta/query-flag surface, and the frozen ids elsewhere.
| Before | After |
|---|---|
wp.os.openWindow( 'desktop-mode-my-wordpress' ) |
wp.os.openWindow( 'my-wordpress' ) |
openstation_my_wordpress_window_args (filter) |
openstation_app_window_args with $id === 'my-wordpress'
|
openstation_my_wordpress_icon_args (filter) |
openstation_app_manifest with $id === 'my-wordpress' (title / icon / desktop_icon) |
openstation_my_wordpress_template_html (filter) |
— (the app has no static template to filter) |
A stored desktop layout that placed the old pinned icon (desktop-mode-my-wordpress) simply stops resolving; the app registers its own pinned launcher in the same slot (position: -1).
| Before | After |
|---|---|
openDetail( { entityId, postId, postTitle } ) |
The shared open target: wp.os.createSharedStore( 'desktop-mode/my-wordpress/open-target', … ) + wp.os.openWindow( 'my-wordpress' ); in-bundle code imports openExplorerDetail() from src/open-targets/explorer-open.ts
|
openMedia( { mediaId } ) |
Same store, kind: 'media' — or openExplorerMedia()
|
openUserFootprint( { userId, userName } ) |
Unchanged call, new destination: openUserFootprintWindow() (src/open-targets/footprint-target.ts) opens the app; the os-open-user-footprint bridge message still lands here |
trashEntity( entityId, id ) |
Shortcut drag payloads carry their section's restPath; the Recycle Bin DELETEs against it (src/desktop-files/rest-trash.ts) and announces os.<post-type>.changed (trashed) |
registerEntityKind() |
— by design. Add a section via openstation_my_wordpress_app_sections; decorate every surface through the os.my-wordpress.* seams |
openstation_my_wordpress_entities still runs but is inert — no window consumes it. Register sections with openstation_my_wordpress_app_sections; the app's descriptors carry id / label / icon / kind / post_type / capability / thumbnails / restPath / the group* folder fields, plus flat for sections whose rows are not posts. Row facts ride the rows themselves (the app sends REST-visible meta, per-taxonomy term ids, and integration fields like openstation_woo), so listFields / listQuery have no equivalent and need none.
os-my-wordpress-entity-trashed no longer fires. Trash flows broadcast the standard content-change (os.<post-type>.changed, action trashed) via wp.os.announceContentChange() — which is also what the app's watch( '*' ) refreshes on, so list views everywhere stay reactive without a bespoke event.
Selecting a list row or icon opens its preview immediately using the title, thumbnail and excerpt already in the loaded list. Full details arrive through a background refresh. Rapid picks coalesce, and a detail response is rendered only when its identity matches the current selection; closing the preview is local and sends no request.
Dropping an entity into Trash or confirming its Trash action hides its tile and open preview immediately. Failed mutations restore the previous view; successful mutations reconcile from the server. Older accumulated list pages retain a local removal marker so clearing the pending overlay cannot resurrect a trashed tile. A fresh page containing a restored row clears that marker. The existing REST collection path and content-change broadcasts retain their meaning; only successful mutations are announced.
This wiki is generated from the docs/ directory — edits made here are overwritten by the next sync.
To change a page, open a pull request against docs/.
Guides
- Development guide
- Releasing openstation
- Agents security model
- API Index
- The App Framework — a window in one PHP file
- Architecture
- Bridge protocol — wiring overview
- <os-*> component reference
- Data model — where OpenStation keeps its data
- Native Desktop Host — Experimental
- Desktop themes
- Dock customization — two registries, one mental model
- The event-driven framework
- Files on the Desktop
- Folder sharing
- Getting Started
- Hooks Reference
- Icons
- JavaScript Reference
- The Living Tree — algorithm definition
- Window-scoped MIO
- Mio
- Mobile — the phone layer
- Multisite
- Native Windows & Framework Interop
- OpenStation Network
- Plugin compatibility layer
- Progressive Web App (PWA)
- Station Home
- Using openstation from your own plugin
- Workspaces
Migration notes
- Migration: built-in activity channels move to the os/ namespace
- Migration — Code Blue becomes an App Framework app
- Migration: window, wallpaper and widget bundles load on demand
- Migration — Posts, Pages, Users, User Edit, Plugins and Comments become App Framework apps
- Migration — the navigation model
- Migration — OpenStation Preferences becomes an App Framework app
- Performance settings move to Extended options
- Presence storage migration
- Migration — the Recycle Bin becomes an App Framework app
- Migration — the shell boots from its own screen
- Migration — Station Home becomes an App Framework app
- Migration: a native window's tabs move to the window chrome
- Migration — WP Explorer becomes the my-wordpress app
- Migration — WordPress package globals are no longer ambient
More
All examples
- AI Agents — extend and invoke from a plugin
- wp.os.ai.ask() — programmatic AI Copilot
- Tune the AI model config
- Custom arrange-menu action
- Open a child window its owner can't cover
- Style a specific admin page inside the iframe
- Code Blue — register your plugin's log file
- Open a file in the Code editor (deep-link from any window)
- Connect to a window — title-bar button + iframe pub/sub
- Content changes — live-refresh every window listing your type
- Custom window chrome (Experimental)
- Register a custom unfocused-window effect
- Example: render a data table
- Real file storage — react to uploads, gate policy, share from PHP
- React to a window being set free onto the real desktop
- Cross-window devtools — instrumentation primitives
- Add a dock item with a badge
- Decorate the dock without forking the renderer
- Replace the dock rail entirely
- Retune the Drafts widget's AI writing assistant
- Gate OpenStation by role
- Iframe-initiated window opens
- Build a feed reader without the bookkeeping
- Inject data into openStationConfig
- Render a list without losing clicks — renderKeyedList()
- Example: layout primitives (body → panel → row → col)
- Use <os-*> components from a plugin that ships as a zip
- Restyle and drive Mio
- Repairable form edits with MIO
- Register a window companion
- Pin your app to the phone tab bar, and react to the mode
- Add an action that works on a whole selection
- WP Explorer — custom post types and their folder
- WP Explorer — add a column to the list view
- Add an action button to a WP Explorer preview pane
- Example: native Posts window
- Example: native window with tabs
- Native windows
- Customize note → post conversion
- Send a notification
- OAuth relay — connect to an external service
- Ship a window as an .os.php app
- OS-file drop
- <os-flyout> — window-scoped sliding card
- Plugins window — extras
- Track who's around — wp.os.presence
- Example: progress bar
- PWA install — surface your own button
- React to window events
- Example: extend the Trash
- Register a slash-command
- Register a desktop theme from a plugin
- Register a game
- Example: register a desktop icon (Jorvy)
- Register a wallpaper
- Register a widget
- Related entities — extend the title bar's "Related" menu
- The native-window render ctx
- Revisions in their own window — extend or redirect "View revisions"
- Programmatic folder sharing
- Share state across multi-bundle plugins — wp.os.createSharedStore()
- Example: loading spinner
- Add an opt-in card to Station Home
- Observe stored-file cleanup failures
- Accept drops on your desktop icon
- Give a tile two icons, one per state
- Add a row to a window's ⋯ menu
- Example: window activity & the status ring
- Window controls
- Subscribe to window lifecycle events
- Window links — relate windows and restyle the ties (Experimental)
- Window loading state — spinner overlay & ready signal
- Show a banner at the top of a window
- Pulse a window's icon — Window.requestAttention()
- Register a custom window reveal
- Window slots
- Window themes
- Native window with bundle-bound config
- Place something where the user can reach it — wp.os.workArea
- Ship a workspace template