/** * Create a mock plugin that is deleted * when the tests are done running * with a wp-require file * with the contents of $require. * * @param array $requires The desired contents of the wp-require file. * * @return WPPlugin The plugin */ public static function createMockPlugin($requires) { $basePluginDir = WPRequire::PLUGINS_DIR(); // Create a random name $pluginName = Str::random(20); // Create the plugin directory $pluginDir = new File($basePluginDir . "/{$pluginName}"); $pluginDir->createDir(); // Create the base plugin file $pluginFile = new File($pluginDir->getPath() . "/{$pluginName}.php"); $pluginFile->createFile(); // Write plugin name and version to the plugin header $pluginFileWriter = new FileWriter($pluginFile); $pluginFileWriter->open(); $pluginFileWriter->write("\n/*\n * Plugin Name: {$pluginName}\n * Version: 1.0.0\n */"); $pluginFileWriter->close(); // Create the wp-require.json file $wpRequireFile = new File($pluginDir->getPath() . "/wp-require.json"); $wpRequireFile->createFile(); $wpRequireFileWriter = new FileWriter($wpRequireFile); // Write the array as json to the wp-require.json file $wpRequireFileWriter->open(); $wpRequireFileWriter->write((string) new Json($requires)); $wpRequireFileWriter->close(); // Request files to be deleted on tearDown $pluginFile->deleteOnExit(); $wpRequireFile->deleteOnExit(); $pluginDir->deleteOnExit(); $plugin = new WPPlugin("{$pluginName}/{$pluginName}.php"); return $plugin; }
/** * Return the absolut path to the root of the plugin, or null * if this plugin is a single file. * * @return string|null */ protected function getPath() { if ($this->getPluginFolder() === null) { return null; } else { return WPRequire::PLUGINS_DIR() . "/" . $this->getPluginFolder(); } }
/** * Get active plugins that does not have there requirements met. * returns an array with plugin-base-name=>["this"=>[required-version, supplied-version]] * Supplied version in this array will be "null" if there was non supplied. eg. If it was a plugin * that wa entierly missing. * * @return array plugin-name=>(outdatedOrMissing=>(required, supplied))[] */ private static function getUnsuportedPlugins() { $activePlugins = self::getAllActivePlugins(); $unsuported = []; foreach ($activePlugins as $plugin) { $pluginFile = $plugin->getPluginFile(); $wpRequireFile = $plugin->getWpRequire(); // If no wp-require file exists, assume it has all it needs if ($wpRequireFile === null) { continue; } // Init the $unsuported array for this plugin $unsuported[$pluginFile] = array(); $requiredPhpVersion = $wpRequireFile->getRequiredPhpVersion(); $requiredWpVersion = $wpRequireFile->getRequiredWpVersion(); $requiredPlugins = $wpRequireFile->getRequiredPlugins(); $phpComp = $requiredPhpVersion->isCompatibleWith(self::getPhpVersion()); if (!$phpComp) { $unsuported[$pluginFile]["php"] = array($requiredPhpVersion, self::getPhpVersion()); } $wpComp = $requiredWpVersion->isCompatibleWith(self::getWpVersion()); if (!$wpComp) { $unsuported[$pluginFile]["wp"] = array($requiredWpVersion, self::getWpVersion()); } $unsuported[$pluginFile]['plugins'] = array(); foreach ($requiredPlugins as $requiredPluginFile => $requiredPluginVersion) { if (!self::isPluginActive($requiredPluginFile)) { if (!isset($unsuported[$pluginFile]['plugins'])) { $unsuported[$pluginFile]['plugins'] = array(); } $unsuported[$pluginFile]['plugins'][$requiredPluginFile] = array($requiredPluginVersion, null); } else { $pluginData = get_plugin_data(WPRequire::PLUGINS_DIR() . "/" . $requiredPluginFile); $requiredVersion = new Version($requiredPluginVersion); $suppliedVersion = new Version($pluginData["Version"]); if (!$requiredVersion->isCompatibleWith($suppliedVersion)) { $unsuported[$pluginFile]['plugins'][$requiredPluginFile] = array($requiredPluginVersion, new Version($pluginData["Version"])); } } } // If this plugins plugin requirments was uphelp if (count($unsuported[$pluginFile]['plugins']) === 0) { unset($unsuported[$pluginFile]['plugins']); } // If no reasons for why this plugin is unsuported can be found // Remove it from the array if (count($unsuported[$pluginFile]) === 0) { unset($unsuported[$pluginFile]); } } return $unsuported; }