Automattic\WooCommerce\Internal\Admin\Logging

PageController::handle_list_table_bulk_actions()privateWC 1.0

Process bulk actions initiated from the log file list table.

Method of the class: PageController{}

No Hooks.

Return

null. Nothing (null).

Usage

// private - for code of main (parent) class only
$result = $this->handle_list_table_bulk_actions( $view ): void;
$view(string) (required)
The current view within the Logs tab.

PageController::handle_list_table_bulk_actions() code WC 9.3.3

<?php
private function handle_list_table_bulk_actions( string $view ): void {
	// Bail if we're not using the file handler.
	if ( LogHandlerFileV2::class !== $this->settings->get_default_handler() ) {
		return;
	}

	$params = $this->get_query_params( array( 'file_id' ) );

	// Bail if this is not the list table view.
	if ( 'list_files' !== $view ) {
		return;
	}

	$action = $this->get_list_table( $view )->current_action();

	// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
	$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? wp_unslash( $_SERVER['REQUEST_URI'] ) : $this->get_logs_tab_url();

	if ( $action ) {
		check_admin_referer( 'bulk-log-files' );

		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			wp_die( esc_html__( 'You do not have permission to manage log files.', 'woocommerce' ) );
		}

		$sendback = remove_query_arg( array( 'deleted' ), wp_get_referer() );

		// Multiple file_id[] params will be filtered separately, but assigned to $files as an array.
		$file_ids = $params['file_id'];

		if ( ! is_array( $file_ids ) || count( $file_ids ) < 1 ) {
			wp_safe_redirect( $sendback );
			exit;
		}

		switch ( $action ) {
			case 'export':
				if ( 1 === count( $file_ids ) ) {
					$export_error = $this->file_controller->export_single_file( reset( $file_ids ) );
				} else {
					$export_error = $this->file_controller->export_multiple_files( $file_ids );
				}

				if ( is_wp_error( $export_error ) ) {
					wp_die( wp_kses_post( $export_error->get_error_message() ) );
				}
				break;
			case 'delete':
				$deleted  = $this->file_controller->delete_files( $file_ids );
				$sendback = add_query_arg( 'deleted', $deleted, $sendback );

				/**
				 * If the delete action was triggered on the single file view, don't redirect back there
				 * since the file doesn't exist anymore.
				 */
				$sendback = remove_query_arg( array( 'view', 'file_id' ), $sendback );
				break;
		}

		$sendback = remove_query_arg( array( 'action', 'action2' ), $sendback );

		wp_safe_redirect( $sendback );
		exit;
	} elseif ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {
		$removable_args = array( '_wp_http_referer', '_wpnonce', 'action', 'action2', 'filter_action' );
		wp_safe_redirect( remove_query_arg( $removable_args, $request_uri ) );
		exit;
	}

	$deleted = filter_input( INPUT_GET, 'deleted', FILTER_VALIDATE_INT );

	if ( is_numeric( $deleted ) ) {
		add_action(
			'admin_notices',
			function () use ( $deleted ) {
				?>
				<div class="notice notice-info is-dismissible">
					<p>
						<?php
						printf(
						// translators: %s is a number of files.
							esc_html( _n( '%s log file deleted.', '%s log files deleted.', $deleted, 'woocommerce' ) ),
							esc_html( number_format_i18n( $deleted ) )
						);
						?>
					</p>
				</div>
				<?php
			}
		);
	}
}