HEX
Server: nginx
System: Linux pool195-106-36.bur.atomicsites.net 6.12.57+deb12-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.57-1~bpo12+1 (2025-11-17) x86_64
User: (0)
PHP: 8.3.32
Disabled: pcntl_fork
Upload Files
File: /wordpress/plugins/wp-cloud-client/1.2.0/src/Handler/TriggerAllPluginUpdatesHandler.php
<?php

declare(strict_types=1);

namespace VPlugins\WPCloudClient\Handler;

use VPlugins\WPCloudClient\Support\Logger;

/**
 * Triggers updates for every plugin that has one available.
 *
 * Action name: trigger_all_plugin_updates
 *
 * Response example:
 * {
 *   "results": [
 *     { "updated": true,  "slug": "woocommerce/woocommerce.php", "previous_version": "8.0.0", "new_version": "8.1.0", "message": "..." }
 *   ],
 *   "failures": [
 *     { "slug": "jetpack/jetpack.php", "message": "Update failed for plugin ..." }
 *   ],
 *   "succeeded": 1,
 *   "failed":    1
 * }
 */
final class TriggerAllPluginUpdatesHandler extends AbstractHandler {

	/**
	 * Class constructor.
	 *
	 * @param HandlerInterface $single Per-plugin update handler (expected to be TriggerPluginUpdateHandler).
	 * @param Logger           $logger Logger instance.
	 */
	public function __construct(
		private readonly HandlerInterface $single,
		private readonly Logger $logger,
	) {}

	/**
	 * Return the action name.
	 *
	 * @return string
	 */
	public function action(): string {
		return 'trigger_all_plugin_updates';
	}

	/**
	 * Run updates for every plugin with one available.
	 *
	 * @param array<string, mixed> $params Action parameters.
	 * @return array<string, mixed> Aggregate result.
	 */
	public function execute( array $params ): array {
		if ( ! function_exists( 'get_plugins' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		$slugs    = $this->collectUpdatableSlugs();
		$results  = [];
		$failures = [];

		foreach ( $slugs as $slug ) {
			try {
				$result = $this->single->execute( [ 'slug' => $slug ] );
				if ( ! empty( $result['updated'] ) ) {
					$results[] = $result;
				} else {
					$failures[] = [
						'slug'    => $slug,
						'message' => (string) ( $result['message'] ?? 'Update skipped.' ),
					];
				}
			} catch ( \Throwable $e ) {
				$this->logger->error(
					'Bulk plugin update failed for slug',
					[
						'slug'  => $slug,
						'error' => $e->getMessage(),
					]
				);
				$failures[] = [
					'slug'    => $slug,
					'message' => $e->getMessage(),
				];
			}
		}

		return [
			'results'   => $results,
			'failures'  => $failures,
			'succeeded' => count( $results ),
			'failed'    => count( $failures ),
		];
	}

	/**
	 * Return plugin slugs that the update transient reports have updates available.
	 *
	 * @return list<string>
	 */
	private function collectUpdatableSlugs(): array {
		$transient = get_site_transient( 'update_plugins' );
		if ( ! is_object( $transient ) || ! isset( $transient->response ) ) {
			return [];
		}

		$response = (array) $transient->response;
		return array_values( array_map( 'strval', array_keys( $response ) ) );
	}
}