wp/wp-admin/includes/class-wp-privacy-requests-table.php
changeset 18 be944660c56a
parent 16 a86126ab1dd4
child 19 3d72ae0968f4
--- 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 );
 	}
 
 	/**