wpInfo->plugins as $pluginInfo) {
$this->plugins[$pluginInfo->slug] = new DUPX_Plugin_item((array) $pluginInfo);
}
$this->setCustomPluginsActions();
Log::info('CONSTRUCT PLUGINS OBJECTS: ' . Log::v2str($this->plugins), Log::LV_HARD_DEBUG);
}
private function setCustomPluginsActions()
{
$default = DUPX_Plugin_custom_actions::BY_DEFAULT_ENABLED;
$afterLogin = true;
$longMsg = '';
$this->customPluginsActions[self::SLUG_DUPLICATOR_LITE] = new DUPX_Plugin_custom_actions(
self::SLUG_DUPLICATOR_LITE,
$default,
$afterLogin,
$longMsg
);
$this->customPluginsActions[self::SLUG_DUPLICATOR_TESTER] = new DUPX_Plugin_custom_actions(
self::SLUG_DUPLICATOR_TESTER,
$default,
$afterLogin,
$longMsg
);
$this->customPluginsActions[self::SLUG_DUPLICATOR_PRO] = new DUPX_Plugin_custom_actions(
self::SLUG_DUPLICATOR_PRO,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
false,
'Duplicator PRO has been deactivated because in the new versions it is not possible to ' .
'have Duplicator PRO active at the same time as PRO.'
);
$longMsg = "This plugin is deactivated by default automatically. "
. "You must reactivate from the WordPress admin panel after completing the installation "
. "or from the plugins tab."
. " Your site's frontend will render properly after reactivating the plugin.";
$this->customPluginsActions[self::SLUG_WPBAKERY_PAGE_BUILDER] = new DUPX_Plugin_custom_actions(
self::SLUG_WPBAKERY_PAGE_BUILDER,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$this->customPluginsActions[self::SLUG_JETPACK] = new DUPX_Plugin_custom_actions(
self::SLUG_JETPACK,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$longMsg = "This plugin is deactivated by default automatically due to issues that one may encounter when migrating. "
. "You must reactivate from the WordPress admin panel after completing the installation "
. "or from the plugins tab."
. " Your site's frontend will render properly after reactivating the plugin.";
$this->customPluginsActions[self::SLUG_POPUP_MAKER] = new DUPX_Plugin_custom_actions(
self::SLUG_POPUP_MAKER,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$this->customPluginsActions[self::SLUG_WP_ROCKET] = new DUPX_Plugin_custom_actions(
self::SLUG_WP_ROCKET,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$this->customPluginsActions[self::SLUG_WPS_HIDE_LOGIN] = new DUPX_Plugin_custom_actions(
self::SLUG_WPS_HIDE_LOGIN,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$longMsg = "This plugin is deactivated by default automatically due to issues that one may encounter when migrating. "
. "You must reactivate from the WordPress admin panel after completing the installation "
. "or from the plugins tab.";
$this->customPluginsActions[self::SLUG_WOO_ADMIN] = new DUPX_Plugin_custom_actions(
self::SLUG_WOO_ADMIN,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
$this->customPluginsActions[self::SLUG_BETTER_WP_SECURITY] = new DUPX_Plugin_custom_actions(
self::SLUG_BETTER_WP_SECURITY,
DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED,
true,
$longMsg
);
}
/**
*
* @return DUPX_Plugin_item[]
*/
public function getPlugins()
{
return $this->plugins;
}
/**
*
* @staticvar string[] $dropInsPaths
* @return string[]
*/
public function getDropInsPaths()
{
static $dropInsPaths = null;
if (is_null($dropInsPaths)) {
$dropInsPaths = array();
foreach ($this->plugins as $plugin) {
if ($plugin->isDropIns()) {
$dropInsPaths[] = $plugin->getPluginArchivePath();
}
}
Log::info('DROP INS PATHS: ' . Log::v2str($dropInsPaths));
}
return $dropInsPaths;
}
public function pluginExistsInArchive($slug)
{
return array_key_exists($slug, $this->plugins);
}
/**
* This function performs status checks on plugins and disables those that must disable creating user messages
*/
public function preViewChecks()
{
$noticeManager = DUPX_NOTICE_MANAGER::getInstance();
$paramsManager = PrmMng::getInstance();
if (DUPX_InstallerState::isRestoreBackup()) {
return;
}
$activePlugins = $paramsManager->getValue(PrmMng::PARAM_PLUGINS);
$saveParams = false;
foreach ($this->customPluginsActions as $slug => $customPlugin) {
if (!isset($this->plugins[$slug])) {
continue;
}
switch ($customPlugin->byDefaultStatus()) {
case DUPX_Plugin_custom_actions::BY_DEFAULT_DISABLED:
if (($delKey = array_search($slug, $activePlugins)) !== false) {
$saveParams = true;
unset($activePlugins[$delKey]);
$noticeManager->addNextStepNotice(array(
'shortMsg' => 'Plugin ' . $this->plugins[$slug]->name . ' disabled by default',
'level' => DUPX_NOTICE_ITEM::NOTICE,
'longMsg' => $customPlugin->byDefaultMessage(),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'plugins'
), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'custom_plugin_action' . $slug);
}
break;
case DUPX_Plugin_custom_actions::BY_DEFAULT_ENABLED:
if (!in_array($slug, $activePlugins)) {
$saveParams = true;
$activePlugins[] = $slug;
$noticeManager->addNextStepNotice(array(
'shortMsg' => 'Plugin ' . $this->plugins[$slug]->name . ' enabled by default',
'level' => DUPX_NOTICE_ITEM::NOTICE,
'longMsg' => $customPlugin->byDefaultMessage(),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
'sections' => 'plugins'
), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'custom_plugin_action' . $slug);
}
break;
case DUPX_Plugin_custom_actions::BY_DEFAULT_AUTO:
default:
break;
}
}
if ($saveParams) {
$paramsManager->setValue(PrmMng::PARAM_PLUGINS, $activePlugins);
$paramsManager->save();
$noticeManager->saveNotices();
}
}
public function getStatusCounts($subsiteId = -1)
{
$result = array(
DUPX_Plugin_item::STATUS_MUST_USE => 0,
DUPX_Plugin_item::STATUS_DROP_INS => 0,
DUPX_Plugin_item::STATUS_NETWORK_ACTIVE => 0,
DUPX_Plugin_item::STATUS_ACTIVE => 0,
DUPX_Plugin_item::STATUS_INACTIVE => 0
);
foreach ($this->plugins as $plugin) {
$result[$plugin->getOrgiStatus($subsiteId)]++;
}
return $result;
}
public function getDefaultActivePluginsList($subsiteId = -1)
{
$result = array();
foreach ($this->plugins as $plugin) {
if (!$plugin->isInactive($subsiteId)) {
$result[] = $plugin->slug;
}
}
return $result;
}
/**
* return alla plugins slugs list
*
* @return string[]
*/
public function getAllPluginsSlugs()
{
return array_keys($this->plugins);
}
public function setActions($plugins, $subsiteId = -1)
{
Log::info('FUNCTION [' . __FUNCTION__ . ']: plugins ' . Log::v2str($plugins), Log::LV_DEBUG);
foreach ($this->plugins as $slug => $plugin) {
$deactivate = false;
if ($plugin->isForceDisabled()) {
$deactivate = true;
} else {
if (!$this->plugins[$slug]->isInactive($subsiteId) && !in_array($slug, $plugins)) {
$deactivate = true;
}
}
if ($deactivate) {
$this->plugins[$slug]->setDeactivateAction($subsiteId, null, null, false);
}
}
foreach ($plugins as $slug) {
if (isset($this->plugins[$slug])) {
$this->plugins[$slug]->setActivationAction($subsiteId, false);
}
}
$this->setAutoActions($subsiteId);
DUPX_NOTICE_MANAGER::getInstance()->saveNotices();
}
public function executeActions($dbh, $subsiteId = -1)
{
$activePluginsList = array();
$activateOnLoginPluginsList = array();
$this->unistallList = array();
$escapedTablePrefix = mysqli_real_escape_string($dbh, PrmMng::getInstance()->getValue(PrmMng::PARAM_DB_TABLE_PREFIX));
$noticeManager = DUPX_NOTICE_MANAGER::getInstance();
Log::info('PLUGINS OBJECTS: ' . Log::v2str($this->plugins), Log::LV_HARD_DEBUG);
foreach ($this->plugins as $plugin) {
$deactivated = false;
if ($plugin->deactivateAction) {
$plugin->deactivate();
// can't remove deactivate after login
$deactivated = true;
} else {
if ($plugin->isActive($subsiteId)) {
$activePluginsList[] = $plugin->slug;
}
}
if ($plugin->activateAction) {
$activateOnLoginPluginsList[] = $plugin->slug;
$noticeManager->addFinalReportNotice(array(
'shortMsg' => 'Activate ' . $plugin->name . ' after you login.',
'level' => DUPX_NOTICE_ITEM::NOTICE,
'sections' => 'plugins'
));
}
}
// force duplicator lite activation
if (!array_key_exists(self::SLUG_DUPLICATOR_LITE, $activePluginsList)) {
$activePluginsList[] = self::SLUG_DUPLICATOR_LITE;
}
// force duplicator tester activation if exists
if ($this->pluginExistsInArchive(self::SLUG_DUPLICATOR_TESTER) && !array_key_exists(self::SLUG_DUPLICATOR_TESTER, $activePluginsList)) {
$activePluginsList[] = self::SLUG_DUPLICATOR_TESTER;
}
Log::info('Active plugins: ' . Log::v2str($activePluginsList), Log::LV_DEBUG);
$value = mysqli_real_escape_string($dbh, @serialize($activePluginsList));
$optionTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
$query = "UPDATE `" . $optionTable . "` SET option_value = '" . $value . "' WHERE option_name = 'active_plugins' ";
if (!DUPX_DB::mysqli_query($dbh, $query)) {
$noticeManager->addFinalReportNotice(array(
'shortMsg' => 'QUERY ERROR: MySQL',
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
'longMsg' => "Error description: " . mysqli_error($dbh),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
'sections' => 'database'
));
throw new Exception("Database error description: " . mysqli_error($dbh));
}
$value = mysqli_real_escape_string($dbh, @serialize($activateOnLoginPluginsList));
$optionTable = mysqli_real_escape_string($dbh, DUPX_DB_Functions::getOptionsTableName());
$query = "INSERT INTO `" . $optionTable . "` (option_name, option_value) VALUES('" . self::OPTION_ACTIVATE_PLUGINS . "','" . $value . "') ON DUPLICATE KEY UPDATE option_name=\"" . self::OPTION_ACTIVATE_PLUGINS . "\"";
if (!DUPX_DB::mysqli_query($dbh, $query)) {
$noticeManager->addFinalReportNotice(array(
'shortMsg' => 'QUERY ERROR: MySQL',
'level' => DUPX_NOTICE_ITEM::HARD_WARNING,
'longMsg' => "Error description: " . mysqli_error($dbh),
'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
'sections' => 'database'
));
throw new Exception("Database error description: " . mysqli_error($dbh));
}
return true;
}
/**
* remove inactive plugins
* this method must calle after wp-config set
*/
public function unistallInactivePlugins()
{
Log::info('FUNCTION [' . __FUNCTION__ . ']: unistall inactive plugins');
foreach ($this->unistallList as $plugin) {
if ($plugin->uninstall()) {
Log::info("UNINSTALL PLUGIN " . Log::v2str($plugin->slug) . ' DONE');
} else {
Log::info("UNINSTALL PLUGIN " . Log::v2str($plugin->slug) . ' FAILED');
}
}
}
/**
* Set automatic actions for plugins
*
* @return void
*/
public function setAutoActions($subsiteId = -1)
{
$paramManager = PrmMng::getInstance();
$casesToHandle = array(
array(
'slugs' => array(
self::SLUG_SIMPLE_SSL,
self::SLUG_WP_FORCE_SSL,
self::SLUG_HTTPS_REDIRECTION,
self::SLUG_ONE_CLICK_SSL
),
'longMsg' => "The plugin '%name%' has been deactivated because you are migrating from SSL (HTTPS) to Non-SSL (HTTP).
" .
"If it was not deactivated, you would not be able to login.",
'info' => '%name% [as Non-SSL installation] will be deactivated',
'condition' => !DUPX_U::is_ssl()
),
array(
'slugs' => array(
self::SLUG_RECAPTCHA,
self::SLUG_LOGIN_NOCAPTCHA,
self::SLUG_GOOGLE_CAPTCHA,
self::SLUG_ADVANCED_CAPTCHA
),
'longMsg' => "The plugin '%name%' has been deactivated because reCaptcha requires a site key which is bound to the site's address." .
"Your package site's address and installed site's address don't match. " .
"You can reactivate it after finishing with the installation.
" .
"Please do not forget to change the reCaptcha site key after activating it.",
'info' => '%name% [as package creation site URL and the installation site URL are different] will be deactivated',
'condition' => $paramManager->getValue(PrmMng::PARAM_SITE_URL_OLD) != $paramManager->getValue(PrmMng::PARAM_SITE_URL),
),
);
foreach ($casesToHandle as $case) {
foreach ($case['slugs'] as $slug) {
if (isset($this->plugins[$slug]) && $this->plugins[$slug]->isActive($subsiteId) && $case['condition']) {
$info = str_replace('%name%', $this->plugins[$slug]->name, $case['info']);
$longMsg = str_replace('%name%', $this->plugins[$slug]->name, $case['longMsg']);
Log::info($info, Log::LV_DEBUG);
$this->plugins[$slug]->setDeactivateAction($subsiteId, $info, $longMsg);
}
}
}
foreach ($this->customPluginsActions as $slug => $customPlugin) {
if (!isset($this->plugins[$slug])) {
continue;
}
if (!$this->plugins[$slug]->isInactive($subsiteId) && $customPlugin->isEnableAfterLogin()) {
$this->plugins[$slug]->setActivationAction($subsiteId);
}
}
}
private function __clone()
{
}
}