` markup. */ function openstation_my_wordpress_icon_svg() { return '' // The folder: back tab, notch, front panel, all one outline. . '' // The WordPress mark, centred on the front panel at r=10. . '' . '' . '' . ''; } /** * Whether the current user should see My WordPress. * * Mirrors the recycle-bin gate — anyone who can edit posts can * browse posts and pages. * * This is the module's one capability gate, and it is a **server-side * authorization** gate, not just a visibility one. It decides: * * - The non-REST post-type bridge: whether * `desktop-mode/v1/post-type/` routes register at all * (`rest-post-type.php`). * - The per-comment dossier route * `desktop-mode/v1/comment-stats/` (`comment-stats.php`). * - The user and term dossier routes * `desktop-mode/v1/user-stats/`, * `desktop-mode/v1/user-footprint/` and * `desktop-mode/v1/term-stats//` (`user-stats.php`, * `user-footprint.php`, `term-stats.php`), which then scope their * payloads to what the caller may read. * - Whether the WooCommerce integration's boot config ships, so the * client can reach the order / customer / product surfaces at all * — those routes still enforce their own Woo capabilities on top * (`integrations/woocommerce.php`). * - Whether preview-action scripts registered by plugins are * enqueued (`preview-actions.php`). * - Whether Station Home offers the "WP Explorer" quick action * (`apps/station-home/parts/snapshot.php`). * * It does **not** gate the app's own window or pinned launcher: WP * Explorer is an App Framework app and declares * `->capabilities( 'edit_posts' )` itself (`apps/my-wordpress/`). * Returning `true` here opens the surfaces above without opening the * window; to move the window too, filter the app's manifest. * * @return bool */ function openstation_my_wordpress_user_can_use() { $can = current_user_can( 'edit_posts' ); /** * Filter whether the current user can reach the My WordPress * module's surfaces — its REST routes included. * * @param bool $can Default: edit_posts capability. */ return (bool) apply_filters( 'openstation_my_wordpress_user_can_use', $can ); } /** * Build the entity list shipped to the bundle. Posts, Pages, * Users, and Media. Future phases add * Comments, Tags, Categories, Themes, and Plugins. * * The optional `kind` field tells the bundle how to render entries * of this entity: `'post'` (default) renders the standard * title/excerpt/featured-image tile and the rendered-HTML preview; * `'user'` renders an avatar + display-name tile and routes to the * user dossier preview; `'media'` renders a thumbnail-grid tile and * routes to the media preview pane. Plugins extending the entity * list with a post-shaped collection can omit the field; user- and * media-shaped collections must set `'user'` / `'media'`. * The optional `post_type` field specifies the WP post-type * slug used for `os..changed` cross-window broadcasts. * * @return array[] Each entry is `array( 'id', 'label', 'icon', * 'restPath', 'kind', 'post_type' )`. `restPath` is appended to * the `restRoot` config to derive the list URL. */ function openstation_my_wordpress_entities() { $entities = array( array( 'id' => 'posts', 'label' => __( 'Posts', 'desktop-mode' ), 'icon' => 'dashicons-admin-post', 'restPath' => 'wp/v2/posts', 'kind' => 'post', 'post_type' => 'post', ), array( 'id' => 'pages', 'label' => __( 'Pages', 'desktop-mode' ), 'icon' => 'dashicons-admin-page', 'restPath' => 'wp/v2/pages', 'kind' => 'post', 'post_type' => 'page', ), array( 'id' => 'users', 'label' => __( 'Users', 'desktop-mode' ), 'icon' => 'dashicons-admin-users', 'restPath' => 'wp/v2/users', 'kind' => 'user', ), array( 'id' => 'media', 'label' => __( 'Media', 'desktop-mode' ), 'icon' => 'dashicons-admin-media', 'restPath' => 'wp/v2/media', 'kind' => 'media', 'post_type' => 'attachment', ), ); /** * Filter the list of entity types shown inside the My WordPress * window. Each entry must declare `id`, `label`, `icon`, and * `restPath`. Returning a reordered or extended array shows up * in the bundle on the next render. * * **Status: Experimental** — the entity descriptor shape may * gain fields as new entity kinds land (Comments, Tags, * Categories, Themes, Plugins). Stable id/label/icon/restPath * fields will continue to work; new optional fields will not * break existing consumers. The `kind` field is optional and * defaults to `'post'` for back-compat. * * Optional fields: * - `kind` — render strategy (`'post'` default, `'user'`, `'media'`). * - `post_type` — WP post-type slug for cross-window broadcast topic `os..changed`. * - `thumbnails` — set false to keep the section icon on every tile * instead of the entity's featured image. * - `editAction` — who edits this section's rows. A preview-action id * (see `openstation_my_wordpress_preview_actions`) * replaces "Open in editor" everywhere — pane button, * context-menu open entry, tile double-click. `false` * removes every edit affordance (double-click falls * back to the detail dossier; the bulk "Edit…" modal * is suppressed). Omit for the classic editor. * - `group` — folder id this section nests under at the root * (null / omitted renders it loose at the root). * - `groupLabel` — folder label. `groupIcon`, `groupOrder` follow. * * @param array[] $entities Default entities. */ $filtered = apply_filters( 'openstation_my_wordpress_entities', $entities ); return is_array( $filtered ) ? array_values( $filtered ) : $entities; } /* * No window, no template, no launcher. The explorer people open is * the `my-wordpress` APP (`apps/my-wordpress/`), which reclaimed the * "WP Explorer" name and the folder mark from this module's helpers * above. The legacy native window, its bundle and its pinned icon are * gone; every deep surface it used to host moved with the port — the * detail dossiers and the activity footprint render inside the app, * "open this object" travels through the shared stores in * `src/open-targets/explorer-open.ts` / `footprint-target.ts`, and * the Recycle Bin trashes dropped rows by their payload's `restPath`. * * `openstation_my_wordpress_entities()` and its filter remain as an * inert compatibility surface: subscribers registered against them * (WooCommerce's own among them) still run, and the pure helpers are * still what the tests pin — but nothing consumes the list to build a * window any more. The `openstation_my_wordpress_window_args` / * `openstation_my_wordpress_template_html` filters no longer fire. */