-
Notifications
You must be signed in to change notification settings - Fork 42
example my wordpress list column
Status: Experimental.
WP Explorer's list view (the Icons / List control in a section's search band) paints a sortable table: ID, title, slug, author, dates, comment count and so on for posts, with their own sets for media and users. Your plugin can put its own facts in a column — read straight off the row, which carries the same REST-visible fields the tiles do.
Register the meta so it rides the row (show_in_rest), then add the
column through the os.my-wordpress.list-columns JS filter.
// PHP — the fact has to reach the browser first.
add_action( 'init', static function () {
register_post_meta( 'ticket', '_lane', array(
'type' => 'string',
'single' => true,
'show_in_rest' => true,
) );
} );
// Ship the script with the explorer window.
add_filter( 'openstation_app_window_args', static function ( array $args, string $app_id ) {
if ( 'my-wordpress' === $app_id ) {
$args['scripts'][] = 'my-plugin-explorer';
}
return $args;
}, 10, 2 );// my-plugin-explorer.js
wp.hooks.addFilter(
'os.my-wordpress.list-columns',
'my-plugin/lane',
( columns, section ) => {
if ( section.id !== 'cpt-ticket' ) {
return columns;
}
const { html } = wp.os.apps;
columns.splice( 2, 0, {
id: 'lane',
label: 'Lane',
// Render a badge from the kit; a plain string works too.
render: ( item ) => {
const lane = String( item.meta?._lane ?? '' );
return lane
? html`<os-badge tone=${ lane === 'blocked' ? 'danger' : 'info' } no-dot>${ lane }</os-badge>`
: '—';
},
} );
return columns;
},
);The column appears after the title, is offered in the column chooser (users can hide it, and their choice is remembered per section), and its cells never break the table: a renderer that throws paints an empty cell.
A column sorts when the section's server orders include both of its
keys. The built-in orders come from the app's sort_options(); a
plugin section (one you added through
openstation_my_wordpress_app_sections) can be given more through
that same filter — every entry is key => [ label, orderby, order ],
and orderby is whatever WP_Query accepts, meta_value included:
add_filter( 'openstation_my_wordpress_app_sections', static function ( array $sections ) {
// …your section…
return $sections;
} );Then point the column at the two keys:
sort: { asc: 'lane-asc', desc: 'lane-desc', first: 'asc' },A header whose keys the section lacks renders as a plain heading — nothing to undo when the order is not available.
- The filter contract, the row shape and every built-in column id:
os.my-wordpress.list-columns. - Decorating the tile view instead:
os.my-wordpress.list-tile. - The app itself: My WordPress.
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