diff -r 34716fd837a4 -r be944660c56a wp/wp-admin/includes/class-wp-privacy-requests-table.php --- a/wp/wp-admin/includes/class-wp-privacy-requests-table.php Tue Dec 15 15:52:01 2020 +0100 +++ b/wp/wp-admin/includes/class-wp-privacy-requests-table.php Wed Sep 21 18:19:35 2022 +0200 @@ -43,7 +43,7 @@ 'email' => __( 'Requester' ), 'status' => __( 'Status' ), 'created_timestamp' => __( 'Requested' ), - 'next_steps' => __( 'Next Steps' ), + 'next_steps' => __( 'Next steps' ), ); return $columns; } @@ -206,12 +206,13 @@ * * @since 4.9.6 * - * @return string[] Array of bulk action labels keyed by their action. + * @return array Array of bulk action labels keyed by their action. */ protected function get_bulk_actions() { return array( - 'delete' => __( 'Delete Requests' ), - 'resend' => __( 'Resend Confirmation Requests' ), + 'resend' => __( 'Resend confirmation requests' ), + 'complete' => __( 'Mark requests as completed' ), + 'delete' => __( 'Delete requests' ), ); } @@ -219,50 +220,138 @@ * Process bulk actions. * * @since 4.9.6 + * @since 5.6.0 Added support for the `complete` action. */ public function process_bulk_action() { $action = $this->current_action(); $request_ids = isset( $_REQUEST['request_id'] ) ? wp_parse_id_list( wp_unslash( $_REQUEST['request_id'] ) ) : array(); - $count = 0; + if ( empty( $request_ids ) ) { + return; + } - if ( $request_ids ) { - check_admin_referer( 'bulk-privacy_requests' ); - } + $count = 0; + $failures = 0; + + check_admin_referer( 'bulk-privacy_requests' ); switch ( $action ) { - case 'delete': - foreach ( $request_ids as $request_id ) { - if ( wp_delete_post( $request_id, true ) ) { - $count ++; - } - } - - add_settings_error( - 'bulk_action', - 'bulk_action', - /* translators: %d: Number of requests. */ - sprintf( _n( 'Deleted %d request', 'Deleted %d requests', $count ), $count ), - 'success' - ); - break; case 'resend': foreach ( $request_ids as $request_id ) { $resend = _wp_privacy_resend_request( $request_id ); if ( $resend && ! is_wp_error( $resend ) ) { $count++; + } else { + $failures++; + } + } + + if ( $failures ) { + add_settings_error( + 'bulk_action', + 'bulk_action', + sprintf( + /* translators: %d: Number of requests. */ + _n( + '%d confirmation request failed to resend.', + '%d confirmation requests failed to resend.', + $failures + ), + $failures + ), + 'error' + ); + } + + if ( $count ) { + add_settings_error( + 'bulk_action', + 'bulk_action', + sprintf( + /* translators: %d: Number of requests. */ + _n( + '%d confirmation request re-sent successfully.', + '%d confirmation requests re-sent successfully.', + $count + ), + $count + ), + 'success' + ); + } + + break; + + case 'complete': + foreach ( $request_ids as $request_id ) { + $result = _wp_privacy_completed_request( $request_id ); + + if ( $result && ! is_wp_error( $result ) ) { + $count++; } } add_settings_error( 'bulk_action', 'bulk_action', - /* translators: %d: Number of requests. */ - sprintf( _n( 'Re-sent %d request', 'Re-sent %d requests', $count ), $count ), + sprintf( + /* translators: %d: Number of requests. */ + _n( + '%d request marked as complete.', + '%d requests marked as complete.', + $count + ), + $count + ), 'success' ); break; + + case 'delete': + foreach ( $request_ids as $request_id ) { + if ( wp_delete_post( $request_id, true ) ) { + $count++; + } else { + $failures++; + } + } + + if ( $failures ) { + add_settings_error( + 'bulk_action', + 'bulk_action', + sprintf( + /* translators: %d: Number of requests. */ + _n( + '%d request failed to delete.', + '%d requests failed to delete.', + $failures + ), + $failures + ), + 'error' + ); + } + + if ( $count ) { + add_settings_error( + 'bulk_action', + 'bulk_action', + sprintf( + /* translators: %d: Number of requests. */ + _n( + '%d request deleted successfully.', + '%d requests deleted successfully.', + $count + ), + $count + ), + 'success' + ); + } + + break; } } @@ -395,19 +484,36 @@ * Default column handler. * * @since 4.9.6 + * @since 5.7.0 Added `manage_{$this->screen->id}_custom_column` action. * * @param WP_User_Request $item Item being shown. * @param string $column_name Name of column being shown. - * @return string Default column output. */ public function column_default( $item, $column_name ) { - $cell_value = $item->$column_name; + /** + * Fires for each custom column of a specific request type in the Requests list table. + * + * Custom columns are registered using the {@see 'manage_export-personal-data_columns'} + * and the {@see 'manage_erase-personal-data_columns'} filters. + * + * @since 5.7.0 + * + * @param string $column_name The name of the column to display. + * @param WP_User_Request $item The item being shown. + */ + do_action( "manage_{$this->screen->id}_custom_column", $column_name, $item ); + } - if ( in_array( $column_name, array( 'created_timestamp' ), true ) ) { - return $this->get_timestamp_as_date( $cell_value ); - } - - return $cell_value; + /** + * Created timestamp column. Overridden by children. + * + * @since 5.7.0 + * + * @param WP_User_Request $item Item being shown. + * @return string Human readable date. + */ + public function column_created_timestamp( $item ) { + return $this->get_timestamp_as_date( $item->created_timestamp ); } /**