PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.10
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.10
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
← All changes | includes/recycle-bin/capture.php +40 -35 0.8.81.1.10 View file →
@@ -1,7 +1,7 @@
1 1 <?php
2 2 /**
3 - * Desktop Mode — Recycle Bin: capture.
3 + * OpenStation — Recycle Bin: capture.
4 4 *
5 5 * Stamps "who-deleted-what-when" metadata onto posts, pages, and
6 6 * comments as they pass through `wp_trash_post()` / `trashed_comment`,
7 7 * so the Recycle Bin window can show "deleted by Alice, 5 minutes ago"
@@ -11,18 +11,17 @@
11 11 * vanilla WordPress behavior (permanent-delete on first click). To
12 12 * enable trash for media, define `MEDIA_TRASH` as `true` in
13 13 * `wp-config.php`; the Recycle Bin window will surface trashed
14 14 * attachments automatically because `attachment` is in the default
15 - * `desktop_mode_recycle_bin_capture_post_types` list.
15 + * `openstation_recycle_bin_capture_post_types` list.
16 16 *
17 - * - `desktop_mode_recycle_bin_capture_post_types` controls which post
17 + * - `openstation_recycle_bin_capture_post_types` controls which post
18 18 * types we listen for in the first place.
19 - * - The `desktop_mode_recycle_bin_item_captured` action fires after a
19 + * - The `openstation_recycle_bin_item_captured` action fires after a
20 20 * successful capture so plugins can mirror the event (audit log,
21 21 * external storage, etc.).
22 22 *
23 - * @package WPDesktopMode
24 - * @since 0.19.0
23 + * @package OpenStation
25 24 */
26 25
27 26 defined( 'ABSPATH' ) || exit;
28 27
@@ -33,28 +32,44 @@
33 32 * here is consistency: every "deleted" thing flows through the same
34 33 * filter pipeline, so a plugin that wants a single audit log can
35 34 * subscribe once.
36 35 *
37 - * @since 0.19.0
36 + * Custom post types with an admin UI (`show_ui`, non-builtin) are
37 + * included by default — a trashed WooCommerce product or
38 + * portfolio entry belongs in the site-wide bin just as much as a
39 + * post does. Visibility stays safe because every row is still gated
40 + * per-item on `edit_post` before it is listed. Headless CPTs
41 + * (`show_ui => false`, e.g. the pinned-notes `wpd_note`) stay out
42 + * unless their owning feature opts in via the filter.
38 43 *
39 44 * @return string[]
40 45 */
41 -function desktop_mode_recycle_bin_capture_post_types() {
46 +function openstation_recycle_bin_capture_post_types() {
42 47 $types = array( 'post', 'page', 'attachment' );
43 48
49 + $custom = get_post_types(
50 + array(
51 + 'show_ui' => true,
52 + '_builtin' => false,
53 + ),
54 + 'names'
55 + );
56 + $types = array_merge( $types, array_values( (array) $custom ) );
57 +
44 58 /**
45 59 * Filter the post types the recycle bin tracks.
46 60 *
47 - * Returning a list excluding `attachment` disables the soft-delete
48 - * interception entirely — vanilla WordPress media deletion resumes.
61 + * Returning a list excluding `attachment` stops the bin from
62 + * stamping and listing trashed attachments; it does not change how
63 + * WordPress deletes media (that is governed by `MEDIA_TRASH`).
64 + * Remove a custom post type here to keep its trash out of the bin,
65 + * or add a headless (`show_ui => false`) type to opt it in.
49 66 *
50 - * @since 0.19.0
51 - *
52 67 * @param string[] $types Post types whose deletions the recycle bin tracks.
53 68 */
54 - $types = apply_filters( 'desktop_mode_recycle_bin_capture_post_types', $types );
69 + $types = apply_filters( 'openstation_recycle_bin_capture_post_types', $types );
55 70
56 - return array_values( array_filter( array_map( 'strval', (array) $types ) ) );
71 + return array_values( array_unique( array_filter( array_map( 'strval', (array) $types ) ) ) );
57 72 }
58 73
59 74 /**
60 75 * Mirror the capture for posts/pages so the bin has a uniform record
@@ -63,36 +78,32 @@
63 78 * Core's `wp_trash_post_meta` is set on every trash but it doesn't
64 79 * include the user id — we stash that ourselves under a private meta
65 80 * key so the table can show "deleted by Alice".
66 81 *
67 - * @since 0.19.0
68 - *
69 82 * @param int $post_id Post being trashed.
70 83 */
71 -function desktop_mode_recycle_bin_on_trash_post( $post_id ) {
84 +function openstation_recycle_bin_on_trash_post( $post_id ) {
72 85 $post = get_post( $post_id );
73 86 if ( ! $post ) {
74 87 return;
75 88 }
76 - if ( ! in_array( $post->post_type, desktop_mode_recycle_bin_capture_post_types(), true ) ) {
89 + if ( ! in_array( $post->post_type, openstation_recycle_bin_capture_post_types(), true ) ) {
77 90 return;
78 91 }
79 - desktop_mode_recycle_bin_record_capture( $post_id );
92 + openstation_recycle_bin_record_capture( $post_id );
80 93 }
81 94
82 95 /**
83 96 * Persist who-deleted-what-when metadata for a single item.
84 97 *
85 - * Stored under `_desktop_mode_trash_*` postmeta on the trashed post itself —
98 + * Stored under `_openstation_trash_*` postmeta on the trashed post itself —
86 99 * survives un-trash naturally because we only consult it while in the
87 100 * bin, and gets cleaned up by core when the post is permanently
88 101 * deleted via the standard postmeta cascade.
89 102 *
90 - * @since 0.19.0
91 - *
92 103 * @param int $post_id Post id being captured.
93 104 */
94 -function desktop_mode_recycle_bin_record_capture( $post_id ) {
105 +function openstation_recycle_bin_record_capture( $post_id ) {
95 106 $user_id = get_current_user_id();
96 107 $now_gmt = current_time( 'mysql', true );
97 108
98 109 update_post_meta( $post_id, '_desktop_mode_trash_user_id', (int) $user_id );
@@ -103,32 +114,28 @@
103 114 *
104 115 * Use this to mirror the event into an external audit log or to
105 116 * extend the captured payload with custom postmeta.
106 117 *
107 - * @since 0.19.0
108 - *
109 118 * @param int $post_id Post id that was captured.
110 119 * @param int $user_id User id who triggered the capture.
111 120 * @param string $now_gmt MySQL-format GMT timestamp.
112 121 */
113 - do_action( 'desktop_mode_recycle_bin_item_captured', $post_id, $user_id, $now_gmt );
122 + do_action( 'openstation_recycle_bin_item_captured', $post_id, $user_id, $now_gmt );
114 123 }
115 124
116 -add_action( 'wp_trash_post', 'desktop_mode_recycle_bin_on_trash_post', 10, 1 );
125 +add_action( 'wp_trash_post', 'openstation_recycle_bin_on_trash_post', 10, 1 );
117 126
118 127 /**
119 128 * Capture deleted-by metadata for comments — symmetric to
120 - * `desktop_mode_recycle_bin_record_capture` but writing to `commentmeta`
129 + * `openstation_recycle_bin_record_capture` but writing to `commentmeta`
121 130 * instead of `postmeta`. Comments use `wp_set_comment_status('trash')`
122 131 * which fires `trashed_comment`; we don't need to short-circuit
123 132 * anything (core already routes to a real trash status), just
124 133 * stamp the moment so the bin can show "by Alice, 5 minutes ago".
125 134 *
126 - * @since 0.21.0
127 - *
128 135 * @param int $comment_id Comment about to be trashed.
129 136 */
130 -function desktop_mode_recycle_bin_on_trash_comment( $comment_id ) {
137 +function openstation_recycle_bin_on_trash_comment( $comment_id ) {
131 138 $comment_id = (int) $comment_id;
132 139 $user_id = get_current_user_id();
133 140 $now_gmt = current_time( 'mysql', true );
134 141
@@ -137,13 +144,11 @@
137 144
138 145 /**
139 146 * Fires after the recycle bin records a comment capture.
140 147 *
141 - * @since 0.21.0
142 - *
143 148 * @param int $comment_id Comment id that was captured.
144 149 * @param int $user_id User id who triggered the capture.
145 150 * @param string $now_gmt MySQL-format GMT timestamp.
146 151 */
147 - do_action( 'desktop_mode_recycle_bin_comment_captured', $comment_id, $user_id, $now_gmt );
152 + do_action( 'openstation_recycle_bin_comment_captured', $comment_id, $user_id, $now_gmt );
148 153 }
149 -add_action( 'trashed_comment', 'desktop_mode_recycle_bin_on_trash_comment', 10, 1 );
154 +add_action( 'trashed_comment', 'openstation_recycle_bin_on_trash_comment', 10, 1 );