Нет описания

Initializer.php 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. <?php
  2. namespace MailPoet\Config;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\API\JSON\API;
  5. use MailPoet\AutomaticEmails\AutomaticEmails;
  6. use MailPoet\Cron\CronTrigger;
  7. use MailPoet\InvalidStateException;
  8. use MailPoet\PostEditorBlocks\PostEditorBlock;
  9. use MailPoet\Router;
  10. use MailPoet\Settings\SettingsController;
  11. use MailPoet\Util\ConflictResolver;
  12. use MailPoet\Util\Helpers;
  13. use MailPoet\Util\Notices\PermanentNotices;
  14. use MailPoet\WooCommerce\Helper as WooCommerceHelper;
  15. use MailPoet\WooCommerce\TransactionalEmailHooks as WCTransactionalEmails;
  16. use MailPoet\WP\Functions as WPFunctions;
  17. use MailPoet\WP\Notice as WPNotice;
  18. class Initializer {
  19. public $automaticEmails;
  20. /** @var AccessControl */
  21. private $accessControl;
  22. /** @var Renderer */
  23. private $renderer;
  24. /** @var RendererFactory */
  25. private $rendererFactory;
  26. /** @var API */
  27. private $api;
  28. /** @var Activator */
  29. private $activator;
  30. /** @var SettingsController */
  31. private $settings;
  32. /** @var Router\Router */
  33. private $router;
  34. /** @var Hooks */
  35. private $hooks;
  36. /** @var Changelog */
  37. private $changelog;
  38. /** @var Menu */
  39. private $menu;
  40. /** @var CronTrigger */
  41. private $cronTrigger;
  42. /** @var PermanentNotices */
  43. private $permanentNotices;
  44. /** @var Shortcodes */
  45. private $shortcodes;
  46. /** @var DatabaseInitializer */
  47. private $databaseInitializer;
  48. /** @var WCTransactionalEmails */
  49. private $wcTransactionalEmails;
  50. /** @var WooCommerceHelper */
  51. private $wcHelper;
  52. /** @var \MailPoet\PostEditorBlocks\PostEditorBlock */
  53. private $postEditorBlock;
  54. /** @var Localizer */
  55. private $localizer;
  56. /** @var AssetsLoader */
  57. private $assetsLoader;
  58. const INITIALIZED = 'MAILPOET_INITIALIZED';
  59. public function __construct(
  60. RendererFactory $rendererFactory,
  61. AccessControl $accessControl,
  62. API $api,
  63. Activator $activator,
  64. SettingsController $settings,
  65. Router\Router $router,
  66. Hooks $hooks,
  67. Changelog $changelog,
  68. Menu $menu,
  69. CronTrigger $cronTrigger,
  70. PermanentNotices $permanentNotices,
  71. Shortcodes $shortcodes,
  72. DatabaseInitializer $databaseInitializer,
  73. WCTransactionalEmails $wcTransactionalEmails,
  74. PostEditorBlock $postEditorBlock,
  75. WooCommerceHelper $wcHelper,
  76. Localizer $localizer,
  77. AssetsLoader $assetsLoader
  78. ) {
  79. $this->rendererFactory = $rendererFactory;
  80. $this->accessControl = $accessControl;
  81. $this->api = $api;
  82. $this->activator = $activator;
  83. $this->settings = $settings;
  84. $this->router = $router;
  85. $this->hooks = $hooks;
  86. $this->changelog = $changelog;
  87. $this->menu = $menu;
  88. $this->cronTrigger = $cronTrigger;
  89. $this->permanentNotices = $permanentNotices;
  90. $this->shortcodes = $shortcodes;
  91. $this->databaseInitializer = $databaseInitializer;
  92. $this->wcTransactionalEmails = $wcTransactionalEmails;
  93. $this->wcHelper = $wcHelper;
  94. $this->postEditorBlock = $postEditorBlock;
  95. $this->localizer = $localizer;
  96. $this->assetsLoader = $assetsLoader;
  97. }
  98. public function init() {
  99. // load translations
  100. $this->setupLocalizer();
  101. try {
  102. $this->databaseInitializer->initializeConnection();
  103. } catch (\Exception $e) {
  104. return WPNotice::displayError(Helpers::replaceLinkTags(
  105. WPFunctions::get()->__('Unable to connect to the database (the database is unable to open a file or folder), the connection is likely not configured correctly. Please read our [link] Knowledge Base article [/link] for steps how to resolve it.', 'mailpoet'),
  106. 'https://kb.mailpoet.com/article/200-solving-database-connection-issues',
  107. [
  108. 'target' => '_blank',
  109. 'data-beacon-article' => '596de7db2c7d3a73488b2f8d',
  110. ]
  111. ));
  112. }
  113. // activation function
  114. WPFunctions::get()->registerActivationHook(
  115. Env::$file,
  116. [
  117. $this,
  118. 'runActivator',
  119. ]
  120. );
  121. WPFunctions::get()->addAction('activated_plugin', [
  122. new PluginActivatedHook(new DeferredAdminNotices),
  123. 'action',
  124. ], 10, 2);
  125. WPFunctions::get()->addAction('init', [
  126. $this,
  127. 'preInitialize',
  128. ], 0);
  129. WPFunctions::get()->addAction('init', [
  130. $this,
  131. 'initialize',
  132. ]);
  133. WPFunctions::get()->addAction('admin_init', [
  134. $this,
  135. 'setupPrivacyPolicy',
  136. ]);
  137. WPFunctions::get()->addAction('wp_loaded', [
  138. $this,
  139. 'postInitialize',
  140. ]);
  141. WPFunctions::get()->addAction('admin_init', [
  142. new DeferredAdminNotices,
  143. 'printAndClean',
  144. ]);
  145. WPFunctions::get()->addFilter('wpmu_drop_tables', [
  146. $this,
  147. 'multisiteDropTables',
  148. ]);
  149. $this->hooks->initEarlyHooks();
  150. }
  151. public function runActivator() {
  152. try {
  153. $this->activator->activate();
  154. } catch (InvalidStateException $e) {
  155. return $this->handleRunningMigration($e);
  156. } catch (\Exception $e) {
  157. return $this->handleFailedInitialization($e);
  158. }
  159. }
  160. public function preInitialize() {
  161. try {
  162. $this->renderer = $this->rendererFactory->getRenderer();
  163. $this->setupWidget();
  164. $this->hooks->init();
  165. $this->setupWoocommerceTransactionalEmails();
  166. $this->assetsLoader->loadStyles();
  167. } catch (\Exception $e) {
  168. $this->handleFailedInitialization($e);
  169. }
  170. }
  171. public function setupWidget() {
  172. WPFunctions::get()->registerWidget('\MailPoet\Form\Widget');
  173. }
  174. public function initialize() {
  175. try {
  176. $this->maybeDbUpdate();
  177. $this->setupInstaller();
  178. $this->setupUpdater();
  179. $this->setupCapabilities();
  180. $this->menu->init();
  181. $this->setupShortcodes();
  182. $this->setupImages();
  183. $this->setupPersonalDataExporters();
  184. $this->setupPersonalDataErasers();
  185. $this->changelog->init();
  186. $this->setupCronTrigger();
  187. $this->setupConflictResolver();
  188. $this->setupPages();
  189. $this->setupPermanentNotices();
  190. $this->setupAutomaticEmails();
  191. $this->postEditorBlock->init();
  192. WPFunctions::get()->doAction('mailpoet_initialized', MAILPOET_VERSION);
  193. } catch (InvalidStateException $e) {
  194. return $this->handleRunningMigration($e);
  195. } catch (\Exception $e) {
  196. return $this->handleFailedInitialization($e);
  197. }
  198. define(self::INITIALIZED, true);
  199. }
  200. public function maybeDbUpdate() {
  201. try {
  202. $currentDbVersion = $this->settings->get('db_version');
  203. } catch (\Exception $e) {
  204. $currentDbVersion = null;
  205. }
  206. // if current db version and plugin version differ
  207. if (version_compare($currentDbVersion, Env::$version) !== 0) {
  208. $this->activator->activate();
  209. }
  210. }
  211. public function setupInstaller() {
  212. $installer = new Installer(
  213. Installer::PREMIUM_PLUGIN_SLUG
  214. );
  215. $installer->init();
  216. }
  217. public function setupUpdater() {
  218. $slug = Installer::PREMIUM_PLUGIN_SLUG;
  219. $pluginFile = Installer::getPluginFile($slug);
  220. if (empty($pluginFile) || !defined('MAILPOET_PREMIUM_VERSION')) {
  221. return false;
  222. }
  223. $updater = new Updater(
  224. $pluginFile,
  225. $slug,
  226. MAILPOET_PREMIUM_VERSION
  227. );
  228. $updater->init();
  229. }
  230. public function setupLocalizer() {
  231. $this->localizer->init();
  232. }
  233. public function setupCapabilities() {
  234. $caps = new Capabilities($this->renderer);
  235. $caps->init();
  236. }
  237. public function setupShortcodes() {
  238. $this->shortcodes->init();
  239. }
  240. public function setupImages() {
  241. WPFunctions::get()->addImageSize('mailpoet_newsletter_max', Env::NEWSLETTER_CONTENT_WIDTH);
  242. }
  243. public function setupCronTrigger() {
  244. // setup cron trigger only outside of cli environment
  245. if (php_sapi_name() !== 'cli') {
  246. $this->cronTrigger->init();
  247. }
  248. }
  249. public function setupConflictResolver() {
  250. $conflictResolver = new ConflictResolver();
  251. $conflictResolver->init();
  252. }
  253. public function postInitialize() {
  254. if (!defined(self::INITIALIZED)) return;
  255. try {
  256. $this->api->init();
  257. $this->router->init();
  258. $this->setupUserLocale();
  259. } catch (\Exception $e) {
  260. $this->handleFailedInitialization($e);
  261. }
  262. }
  263. public function setupUserLocale() {
  264. if (get_user_locale() === WPFunctions::get()->getLocale()) return;
  265. WPFunctions::get()->unloadTextdomain(Env::$pluginName);
  266. $this->localizer->init();
  267. }
  268. public function setupPages() {
  269. $pages = new \MailPoet\Settings\Pages();
  270. $pages->init();
  271. }
  272. public function setupPrivacyPolicy() {
  273. $privacyPolicy = new PrivacyPolicy();
  274. $privacyPolicy->init();
  275. }
  276. public function setupPersonalDataExporters() {
  277. $exporters = new PersonalDataExporters();
  278. $exporters->init();
  279. }
  280. public function setupPersonalDataErasers() {
  281. $erasers = new PersonalDataErasers();
  282. $erasers->init();
  283. }
  284. public function setupPermanentNotices() {
  285. $this->permanentNotices->init();
  286. }
  287. public function handleFailedInitialization($exception) {
  288. // check if we are able to add pages at this point
  289. if (function_exists('wp_get_current_user')) {
  290. Menu::addErrorPage($this->accessControl);
  291. }
  292. return WPNotice::displayError($exception);
  293. }
  294. private function handleRunningMigration(InvalidStateException $exception) {
  295. if (function_exists('wp_get_current_user')) {
  296. Menu::addErrorPage($this->accessControl);
  297. }
  298. return WPNotice::displayWarning($exception->getMessage());
  299. }
  300. public function setupAutomaticEmails() {
  301. $automaticEmails = new AutomaticEmails();
  302. $automaticEmails->init();
  303. $automaticEmails->getAutomaticEmails();
  304. }
  305. public function multisiteDropTables($tables) {
  306. global $wpdb;
  307. $tablePrefix = $wpdb->prefix . Env::$pluginPrefix;
  308. $mailpoetTables = $wpdb->get_col("SHOW TABLES LIKE '$tablePrefix%'");
  309. return array_merge($tables, $mailpoetTables);
  310. }
  311. private function setupWoocommerceTransactionalEmails() {
  312. $wcEnabled = $this->wcHelper->isWooCommerceActive();
  313. $optInEnabled = $this->settings->get('woocommerce.use_mailpoet_editor', false);
  314. if ($wcEnabled && $optInEnabled) {
  315. $this->wcTransactionalEmails->overrideStylesForWooEmails();
  316. $this->wcTransactionalEmails->useTemplateForWoocommerceEmails();
  317. }
  318. }
  319. }