subscriptionForm = $subscriptionForm; $this->subscriptionComment = $subscriptionComment; $this->subscriptionManage = $subscriptionManage; $this->subscriptionRegistration = $subscriptionRegistration; $this->settings = $settings; $this->wp = $wp; $this->postNotificationScheduler = $postNotificationScheduler; $this->wordpressMailerReplacer = $wordpressMailerReplacer; $this->displayFormInWPContent = $displayFormInWPContent; $this->wpSegment = $wpSegment; $this->subscriberHandler = $subscriberHandler; $this->hooksWooCommerce = $hooksWooCommerce; $this->subscriberChangesNotifier = $subscriberChangesNotifier; $this->dotcomLicenseProvisioner = $dotcomLicenseProvisioner; $this->automateWooHooks = $automateWooHooks; $this->wooSystemInfoController = $wooSystemInfoController; } public function init() { $this->setupWPUsers(); $this->setupWooCommerceUsers(); $this->setupWooCommercePurchases(); $this->setupWooCommerceSubscriberEngagement(); $this->setupWooCommerceTracking(); $this->setupImageSize(); $this->setupListing(); $this->setupSubscriptionEvents(); $this->setupWooCommerceSubscriptionEvents(); $this->setupAutomateWooSubscriptionEvents(); $this->setupPostNotifications(); $this->setupWooCommerceSettings(); $this->setupWoocommerceSystemInfo(); $this->setupFooter(); $this->setupSettingsLinkInPluginPage(); $this->setupChangeNotifications(); $this->setupLicenseProvisioning(); } public function initEarlyHooks() { $this->setupMailer(); } public function setupSubscriptionEvents() { $subscribe = $this->settings->get('subscribe', []); // Subscribe in comments if ( isset($subscribe['on_comment']['enabled']) && (bool)$subscribe['on_comment']['enabled'] ) { if ($this->wp->isUserLoggedIn()) { $this->wp->addAction( 'comment_form_field_comment', [$this->subscriptionComment, 'extendLoggedInForm'] ); } else { $this->wp->addAction( 'comment_form_after_fields', [$this->subscriptionComment, 'extendLoggedOutForm'] ); } $this->wp->addAction( 'comment_post', [$this->subscriptionComment, 'onSubmit'], 60, 2 ); $this->wp->addAction( 'wp_set_comment_status', [$this->subscriptionComment, 'onStatusUpdate'], 60, 2 ); } // Subscribe in registration form if ( isset($subscribe['on_register']['enabled']) && (bool)$subscribe['on_register']['enabled'] ) { if (is_multisite()) { $this->wp->addAction( 'signup_extra_fields', [$this->subscriptionRegistration, 'extendForm'] ); $this->wp->addAction( 'wpmu_validate_user_signup', [$this->subscriptionRegistration, 'onMultiSiteRegister'], 60, 1 ); } else { $this->wp->addAction( 'register_form', [$this->subscriptionRegistration, 'extendForm'] ); // we need to process new users while they are registered. // We used `register_post` before but that is too soon // because if registration fails during `registration_errors` we will keep the user as subscriber. // So we are hooking to `registration_error` with a low priority. $this->wp->addFilter( 'registration_errors', [$this->subscriptionRegistration, 'onRegister'], 60, 3 ); } $this->wp->addAction( 'woocommerce_register_form', [$this->hooksWooCommerce, 'extendForm'] ); $this->wp->addFilter( 'woocommerce_registration_errors', [$this->hooksWooCommerce, 'onRegister'], 60, 3 ); } // Manage subscription $this->wp->addAction( 'admin_post_mailpoet_subscription_update', [$this->subscriptionManage, 'onSave'] ); $this->wp->addAction( 'admin_post_nopriv_mailpoet_subscription_update', [$this->subscriptionManage, 'onSave'] ); // Subscription form $this->wp->addAction( 'admin_post_mailpoet_subscription_form', [$this->subscriptionForm, 'onSubmit'] ); $this->wp->addAction( 'admin_post_nopriv_mailpoet_subscription_form', [$this->subscriptionForm, 'onSubmit'] ); $this->wp->addFilter( 'the_content', [$this->displayFormInWPContent, 'contentDisplay'] ); $this->wp->addFilter( 'woocommerce_product_loop_end', [$this->displayFormInWPContent, 'wooProductListDisplay'] ); $this->wp->addAction( 'wp_footer', [$this->displayFormInWPContent, 'maybeRenderFormsInFooter'] ); } public function setupMailer() { $this->wp->addAction('plugins_loaded', [ $this->wordpressMailerReplacer, 'replaceWordPressMailer', ]); $this->wp->addAction('login_init', [ $this->wordpressMailerReplacer, 'replaceWordPressMailer', ]); $this->wp->addAction('lostpassword_post', [ $this->wordpressMailerReplacer, 'replaceWordPressMailer', ]); } public function setupWooCommerceSubscriptionEvents() { $woocommerce = $this->settings->get('woocommerce', []); // WooCommerce: subscribe on checkout if (!empty($woocommerce['optin_on_checkout']['enabled'])) { $this->wp->addAction( 'woocommerce_checkout_before_terms_and_conditions', [$this->hooksWooCommerce, 'extendWooCommerceCheckoutForm'] ); } $this->wp->addAction( 'woocommerce_checkout_update_order_meta', [$this->hooksWooCommerce, 'subscribeOnCheckout'], 10, // this should execute after the WC sync call on the same hook 2 ); $this->wp->addAction( 'woocommerce_before_pay_action', [$this->hooksWooCommerce, 'subscribeOnOrderPay'], 10, 1 ); } public function setupAutomateWooSubscriptionEvents() { $this->automateWooHooks->setup(); } public function setupWPUsers() { // WP Users synchronization $this->wp->addAction( 'user_register', [$this->wpSegment, 'synchronizeUser'], 6 ); $this->wp->addAction( 'added_existing_user', [$this->wpSegment, 'synchronizeUser'], 6 ); $this->wp->addAction( 'profile_update', [$this->wpSegment, 'synchronizeUser'], 6, 2 ); $this->wp->addAction( 'add_user_role', [$this->wpSegment, 'synchronizeUser'], 6, 1 ); $this->wp->addAction( 'set_user_role', [$this->wpSegment, 'synchronizeUser'], 6, 1 ); $this->wp->addAction( 'delete_user', [$this->wpSegment, 'synchronizeUser'], 1 ); // multisite $this->wp->addAction( 'deleted_user', [$this->wpSegment, 'synchronizeUser'], 1 ); $this->wp->addAction( 'remove_user_from_blog', [$this->wpSegment, 'synchronizeUser'], 1 ); // login $this->wp->addAction( 'wp_login', [$this->subscriberHandler, 'identifyByLogin'], 10, 1 ); } public function setupWooCommerceSettings() { $this->wp->addAction('woocommerce_settings_start', [ $this->hooksWooCommerce, 'disableWooCommerceSettings', ]); $this->wp->addAction('before_woocommerce_init', [ $this->hooksWooCommerce, 'declareWooCompatibility', ]); $this->wp->addAction('init', [ $this->hooksWooCommerce, 'addMailPoetTaskToWooHomePage', ]); $this->wp->addFilter( 'woocommerce_marketing_channels', [$this->hooksWooCommerce, 'addMailPoetMarketingMultiChannel'], 10, 1 ); } public function setupWoocommerceSystemInfo() { $this->wp->addAction( 'woocommerce_system_status_report', [ $this->wooSystemInfoController, 'render', ] ); $this->wp->addAction( 'woocommerce_rest_prepare_system_status', [ $this->wooSystemInfoController, 'addFields', ] ); $this->wp->addAction( 'woocommerce_rest_system_status_schema', [ $this->wooSystemInfoController, 'addSchema', ] ); } public function setupWooCommerceUsers() { // WooCommerce Customers synchronization $this->wp->addAction( 'woocommerce_created_customer', [$this->hooksWooCommerce, 'synchronizeRegisteredCustomer'], 7 ); $this->wp->addAction( 'woocommerce_new_customer', [$this->hooksWooCommerce, 'synchronizeRegisteredCustomer'], 7 ); $this->wp->addAction( 'woocommerce_update_customer', [$this->hooksWooCommerce, 'synchronizeRegisteredCustomer'], 7 ); $this->wp->addAction( 'woocommerce_delete_customer', [$this->hooksWooCommerce, 'synchronizeRegisteredCustomer'], 7 ); $this->wp->addAction( 'woocommerce_checkout_update_order_meta', [$this->hooksWooCommerce, 'synchronizeGuestCustomer'], 7 ); $this->wp->addAction( 'woocommerce_process_shop_order_meta', [$this->hooksWooCommerce, 'synchronizeGuestCustomer'], 7 ); } public function setupWooCommercePurchases() { $this->wp->addAction( 'woocommerce_order_status_changed', [$this->hooksWooCommerce, 'trackPurchase'], 10, 1 ); $this->wp->addAction( 'woocommerce_order_refunded', [$this->hooksWooCommerce, 'trackRefund'], 10, 1 ); } public function setupWooCommerceSubscriberEngagement() { $this->wp->addAction( 'woocommerce_new_order', [$this->hooksWooCommerce, 'updateSubscriberEngagement'], 7 ); // See class-wc-order.php, which says this about this action // "Fires when the order progresses from a pending payment status to a paid one" $this->wp->addAction( 'woocommerce_order_payment_status_changed', [$this->hooksWooCommerce, 'updateSubscriberLastPurchase'] ); } public function setupWooCommerceTracking() { $this->wp->addFilter( 'woocommerce_tracker_data', [$this->hooksWooCommerce, 'addTrackingData'], 10 ); } public function setupImageSize() { $this->wp->addFilter( 'image_size_names_choose', [$this, 'appendImageSize'], 10, 1 ); } public function appendImageSize($sizes) { return array_merge($sizes, [ 'mailpoet_newsletter_max' => __('MailPoet Newsletter', 'mailpoet'), ]); } public function setupListing() { $this->wp->addFilter( 'set-screen-option', [$this, 'setScreenOption'], 10, 3 ); } public function setScreenOption($status, $option, $value) { if (preg_match('/^mailpoet_(.*)_per_page$/', $option)) { return $value; } else { return $status; } } public function setupPostNotifications() { $this->wp->addAction( 'transition_post_status', [$this->postNotificationScheduler, 'transitionHook'], 10, 3 ); } public function setupFooter() { if (!Menu::isOnMailPoetAdminPage()) { return; } $this->wp->addFilter( 'admin_footer_text', [$this, 'setFooter'], 1, 1 ); } public function setFooter(): string { if (Menu::isOnMailPoetAutomationPage()) { return ''; } return '' . esc_html__('Give feedback', 'mailpoet') . ''; } public function setupSettingsLinkInPluginPage() { $this->wp->addFilter( 'plugin_action_links_' . Env::$pluginPath, [$this, 'setSettingsLinkInPluginPage'] ); } /** * @param array $actionLinks * @return array */ public function setSettingsLinkInPluginPage(array $actionLinks): array { $customLinks = [ 'settings' => '' . $this->wp->escHtml(__('Settings', 'mailpoet')) . '', ]; return array_merge($customLinks, $actionLinks); } public function setupChangeNotifications(): void { $this->wp->addAction( 'shutdown', [$this->subscriberChangesNotifier, 'notify'] ); } public function setupLicenseProvisioning(): void { $this->wp->addFilter( 'wpcom_marketplace_webhook_response_mailpoet-business', [$this->dotcomLicenseProvisioner, 'provisionLicense'], 10, 3 ); } }