[ 'name' => 'Plugin slug', 'exampleValue' => 'akismet', 'required' => true, 'title' => 'Slug or url', ] ] ]; public function collectData() { $input = trim($this->getInput('pluginUrl')); if (preg_match('#https://wordpress\.org/plugins/([\w-]+)#', $input, $m)) { $slug = $m[1]; } else { $slug = str_replace(['/'], '', $input); } $pluginData = self::fetchPluginData($slug); if ($pluginData->versions === []) { throw new \Exception('This plugin does not have versioning data'); } // We don't need trunk. I think it's the latest commit. unset($pluginData->versions->trunk); foreach ($pluginData->versions as $version => $downloadUrl) { $this->items[] = [ 'title' => $version, 'uri' => sprintf('https://wordpress.org/plugins/%s/#developers', $slug), 'uid' => $downloadUrl, ]; } usort($this->items, function ($a, $b) { return version_compare($b['title'], $a['title']); }); } /** * Fetch plugin data from wordpress.org json api * * https://codex.wordpress.org/WordPress.org_API#Plugins * https://wordpress.org/support/topic/using-the-wordpress-org-api/ */ private static function fetchPluginData(string $slug): \stdClass { $api = 'https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request[slug]=%s'; return json_decode(getContents(sprintf($api, $slug))); } }