'object', 'properties' => ['id' => ['type' => 'integer', 'minimum' => 1]], 'required' => ['id'], 'additionalProperties' => false, ]; } public function outputSchema(): ?array { $schema = MediaPresenter::fullSchema(); $schema['properties']['usages_complete'] = ['type' => 'boolean']; $schema['properties']['usages_truncated'] = ['type' => 'boolean']; $schema['required'] = array_merge($schema['required'], ['usages_complete', 'usages_truncated']); return $schema; } public function annotations(): array { return Annotations::read(); } public function isDirect(): bool { return false; } public function permission(array $input): bool|WP_Error { $attachment = MediaGuard::attachment($input['id'] ?? null, 'edit_post', true); return $attachment instanceof WP_Error ? $attachment : true; } public function execute(array $input): mixed { $attachment = MediaGuard::attachment($input['id'] ?? null, 'edit_post', true); if ($attachment instanceof WP_Error) { return $attachment; } $scan = $this->finder->scan((int) $attachment->ID); return array_merge($this->presenter->full($attachment, $scan['usages']), [ 'usages_complete' => $scan['complete'], 'usages_truncated' => $scan['truncated'], ]); } }