暂无描述

TransactionalEmailHooks.php 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace MailPoet\WooCommerce;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\InvalidStateException;
  6. use MailPoet\Models\Newsletter;
  7. use MailPoet\Newsletter\NewslettersRepository;
  8. use MailPoet\Settings\SettingsController;
  9. use MailPoet\WooCommerce\TransactionalEmails\Renderer;
  10. use MailPoet\WP\Functions as WPFunctions;
  11. class TransactionalEmailHooks {
  12. /** @var WPFunctions */
  13. private $wp;
  14. /** @var SettingsController */
  15. private $settings;
  16. /** @var Renderer */
  17. private $renderer;
  18. /** @var NewslettersRepository */
  19. private $newsletterRepository;
  20. /** @var TransactionalEmails */
  21. private $transactionalEmails;
  22. public function __construct(
  23. WPFunctions $wp,
  24. SettingsController $settings,
  25. Renderer $renderer,
  26. NewslettersRepository $newsletterRepository,
  27. TransactionalEmails $transactionalEmails
  28. ) {
  29. $this->wp = $wp;
  30. $this->settings = $settings;
  31. $this->renderer = $renderer;
  32. $this->newsletterRepository = $newsletterRepository;
  33. $this->transactionalEmails = $transactionalEmails;
  34. }
  35. public function useTemplateForWoocommerceEmails() {
  36. $this->wp->addAction('woocommerce_email', function($wcEmails) {
  37. /** @var callable */
  38. $emailHeaderCallback = [$wcEmails, 'email_header'];
  39. /** @var callable */
  40. $emailFooterCallback = [$wcEmails, 'email_footer'];
  41. $this->wp->removeAction('woocommerce_email_header', $emailHeaderCallback);
  42. $this->wp->removeAction('woocommerce_email_footer', $emailFooterCallback);
  43. $this->wp->addAction('woocommerce_email_header', function($emailHeading) {
  44. $newsletterEntity = $this->getNewsletter();
  45. if ($newsletterEntity) {
  46. // Temporary load old model until we refactor renderer
  47. $newsletterModel = Newsletter::findOne($newsletterEntity->getId());
  48. if (!$newsletterModel instanceof Newsletter) {
  49. throw new InvalidStateException('WooCommerce email template is missing!');
  50. }
  51. $this->renderer->render($newsletterModel, $emailHeading);
  52. echo $this->renderer->getHTMLBeforeContent();
  53. }
  54. });
  55. $this->wp->addAction('woocommerce_email_footer', function() {
  56. echo $this->renderer->getHTMLAfterContent();
  57. });
  58. $this->wp->addAction('woocommerce_email_styles', [$this->renderer, 'prefixCss']);
  59. });
  60. }
  61. private function getNewsletter(): ?NewsletterEntity {
  62. if (empty($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID))) {
  63. return null;
  64. }
  65. $newsletter = $this->newsletterRepository->findOneById($this->settings->get(TransactionalEmails::SETTING_EMAIL_ID));
  66. if (!$newsletter) {
  67. // the newsletter should always be present in the database, if it s not we shouldn't keep using this feature
  68. // we need to recreate the newsletter and turn off the feature
  69. $this->transactionalEmails->init();
  70. $this->settings->set('woocommerce.use_mailpoet_editor', false);
  71. }
  72. return $newsletter;
  73. }
  74. public function overrideStylesForWooEmails() {
  75. $this->wp->addAction('option_woocommerce_email_background_color', function($value) {
  76. $newsletter = $this->getNewsletter();
  77. if (!$newsletter instanceof NewsletterEntity) return $value;
  78. return $newsletter->getGlobalStyle('body', 'backgroundColor') ?? $value;
  79. });
  80. $this->wp->addAction('option_woocommerce_email_base_color', function($value) {
  81. $newsletter = $this->getNewsletter();
  82. if (!$newsletter instanceof NewsletterEntity) return $value;
  83. return $newsletter->getGlobalStyle('woocommerce', 'brandingColor') ?? $value;
  84. });
  85. $this->wp->addAction('option_woocommerce_email_body_background_color', function($value) {
  86. $newsletter = $this->getNewsletter();
  87. if (!$newsletter instanceof NewsletterEntity) return $value;
  88. return $newsletter->getGlobalStyle('wrapper', 'backgroundColor') ?? $value;
  89. });
  90. $this->wp->addAction('option_woocommerce_email_text_color', function($value) {
  91. $newsletter = $this->getNewsletter();
  92. if (!$newsletter instanceof NewsletterEntity) return $value;
  93. return $newsletter->getGlobalStyle('text', 'fontColor') ?? $value;
  94. });
  95. }
  96. }