File: //wordpress/plugins/wp-cloud-client/1.1.5/src/Handler/TriggerAllThemeUpdatesHandler.php
<?php
declare(strict_types=1);
namespace VPlugins\WPCloudClient\Handler;
use VPlugins\WPCloudClient\Support\Logger;
/**
* Triggers updates for every theme that has one available.
*
* Action name: trigger_all_theme_updates
*
* Response example:
* {
* "results": [
* { "updated": true, "slug": "twentytwentyfour", "previous_version": "1.0", "new_version": "1.1", "message": "..." }
* ],
* "failures": [
* { "slug": "some-theme", "message": "Update failed for theme ..." }
* ],
* "succeeded": 1,
* "failed": 1
* }
*/
final class TriggerAllThemeUpdatesHandler extends AbstractHandler {
/**
* Class constructor.
*
* @param HandlerInterface $single Per-theme update handler (expected to be TriggerThemeUpdateHandler).
* @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_theme_updates';
}
/**
* Run updates for every theme with one available.
*
* @param array<string, mixed> $params Action parameters.
* @return array<string, mixed> Aggregate result.
*/
public function execute( array $params ): array {
$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 theme 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 theme stylesheet slugs that the update transient reports have updates available.
*
* @return list<string>
*/
private function collectUpdatableSlugs(): array {
$transient = get_site_transient( 'update_themes' );
if ( ! is_object( $transient ) || ! isset( $transient->response ) ) {
return [];
}
$response = (array) $transient->response;
return array_values( array_map( 'strval', array_keys( $response ) ) );
}
}