File: //wordpress/plugins/wp-cloud-client/1.1.7/src/Api/Controller/SubsiteController.php
<?php
declare(strict_types=1);
namespace VPlugins\WPCloudClient\Api\Controller;
use VPlugins\WPCloudClient\Api\ApiResponse;
use VPlugins\WPCloudClient\Support\Logger;
use WP_REST_Request;
use WP_REST_Response;
final readonly class SubsiteController {
private const MAX_PER_PAGE = 500;
/**
* Construct the subsite controller.
*
* @param Logger $logger Logger instance.
*/
public function __construct(
private Logger $logger,
) {}
/**
* Return a paginated subsite list for the network.
*
* Accepts optional `number` (1–500, default 500) and `offset` (default 0)
* query parameters for pagination.
*
* @param WP_REST_Request $request The incoming REST request.
* @return WP_REST_Response
*/
public function list( WP_REST_Request $request ): WP_REST_Response {
if ( ! is_multisite() ) {
return ApiResponse::error( 'not_multisite', 'This endpoint is only available on multisite installations.', 400 )->toWpResponse();
}
try {
$number = max( 1, min( (int) ( $request->get_param( 'number' ) ?? self::MAX_PER_PAGE ), self::MAX_PER_PAGE ) );
$offset = max( 0, (int) ( $request->get_param( 'offset' ) ?? 0 ) );
$allSites = get_sites(
[
'number' => $number,
'offset' => $offset,
]
);
$subsites = [];
foreach ( $allSites as $site ) {
if ( $site->spam ) {
$status = 'spam';
} elseif ( $site->archived ) {
$status = 'archived';
} elseif ( $site->deleted ) {
$status = 'deactivated';
} else {
$status = 'active';
}
$subsites[] = [
'blog_id' => (int) $site->blog_id,
'blog_name' => (string) get_blog_option( (int) $site->blog_id, 'blogname' ),
'path' => (string) $site->path,
'domain' => (string) $site->domain,
'status' => $status,
'created_at' => (string) $site->registered,
'last_updated' => (string) $site->last_updated,
];
}
return ApiResponse::success(
[
'subsites' => $subsites,
'count' => count( $subsites ),
]
)->toWpResponse();
} catch ( \Throwable $e ) {
$this->logger->error( 'SubsiteController: failed to list subsites', $e );
return ApiResponse::error( 'list_failed', 'An internal error occurred while listing subsites.', 500 )->toWpResponse();
}
}
}