PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Newsletter / Editor / PostTransformerContentsExtractor.php
mailpoet / lib / Newsletter / Editor Last commit date
LayoutHelper.php 3 years ago MetaInformationManager.php 2 months ago PostContentManager.php 10 months ago PostListTransformer.php 3 years ago PostTransformer.php 1 year ago PostTransformerContentsExtractor.php 2 months ago StructureTransformer.php 3 years ago TitleListTransformer.php 1 year ago Transformer.php 3 years ago index.php 3 years ago
PostTransformerContentsExtractor.php
268 lines
1 <?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing
2
3 namespace MailPoet\Newsletter\Editor;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Config\Env;
9 use MailPoet\WooCommerce\Helper as WooCommerceHelper;
10 use MailPoet\WP\Functions as WPFunctions;
11
12 class PostTransformerContentsExtractor {
13
14 private $args;
15
16 /** @var WPFunctions */
17 private $wp;
18
19 /** @var WooCommerceHelper */
20 private $woocommerceHelper;
21
22 public function __construct(
23 $args
24 ) {
25 $this->args = $args;
26 $this->wp = new WPFunctions();
27 $this->woocommerceHelper = new WooCommerceHelper($this->wp);
28 }
29
30 public function getContent($post, $withPostClass, $displayType) {
31 $contentManager = new PostContentManager();
32 $metaManager = new MetaInformationManager();
33
34 $content = $contentManager->getContent($post, $this->args['displayType']);
35 if ($this->isWcProduct($post)) {
36 // For WC_Product objects, we need to get the corresponding post
37 $postId = $post->get_id();
38 $wpPost = $this->wp->getPost($postId);
39 if ($wpPost) {
40 $content = $metaManager->appendMetaInformation($content, $wpPost, $this->args);
41 }
42 } else {
43 $content = $metaManager->appendMetaInformation($content, $post, $this->args);
44 }
45 $content = $contentManager->filterContent($content, $displayType, $withPostClass);
46
47 $structureTransformer = new StructureTransformer();
48 $content = $structureTransformer->transform($content, $this->args['imageFullWidth'] === true);
49
50 if ($this->isProduct($post)) {
51 $content = $this->addProductDataToContent($content, $post);
52 }
53
54 $readMoreBtn = $this->getReadMoreButton($post);
55 $blocksCount = count($content);
56 if (!$readMoreBtn) {
57 // Don't attach a button
58 } else if ($readMoreBtn['type'] === 'text' && $blocksCount > 0 && $content[$blocksCount - 1]['type'] === 'text') {
59 $content[$blocksCount - 1]['text'] .= $readMoreBtn['text'];
60 } else {
61 $content[] = $readMoreBtn;
62 }
63 return $content;
64 }
65
66 private function getImageInfo($id) {
67 /*
68 * In some cases wp_get_attachment_image_src ignore the second parameter
69 * and use global variable $content_width value instead.
70 * By overriding it ourselves when ensure a constant behaviour regardless
71 * of the user setup.
72 *
73 * https://mailpoet.atlassian.net/browse/MAILPOET-1365
74 */
75 global $content_width; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps, default is NULL
76
77 $contentWidthCopy = $content_width; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
78 $content_width = Env::NEWSLETTER_CONTENT_WIDTH; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
79 $imageInfo = $this->wp->wpGetAttachmentImageSrc($id, 'mailpoet_newsletter_max');
80 $content_width = $contentWidthCopy; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
81
82 return $imageInfo;
83 }
84
85 public function getFeaturedImage($post) {
86 if ($this->isWcProduct($post)) {
87 $postId = $post->get_id();
88 $postTitle = $this->sanitizeTitle($post->get_name());
89 } else {
90 $postId = $post->ID;
91 $postTitle = $this->sanitizeTitle($post->post_title); // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
92 }
93 $imageFullWidth = (bool)filter_var($this->args['imageFullWidth'], FILTER_VALIDATE_BOOLEAN);
94
95 if (!has_post_thumbnail($postId)) {
96 return false;
97 }
98
99 $thumbnailId = $this->wp->getPostThumbnailId($postId);
100 $imageInfo = $this->getImageInfo($thumbnailId);
101
102 // get alt text
103 $rawAlt = get_post_meta(
104 $thumbnailId,
105 '_wp_attachment_image_alt',
106 true
107 );
108 $altText = trim(strip_tags(is_string($rawAlt) ? $rawAlt : ''));
109 if (strlen($altText) === 0) {
110 // if the alt text is empty then use the post title
111 $altText = trim(strip_tags($postTitle));
112 }
113
114 return [
115 'type' => 'image',
116 'link' => $this->wp->getPermalink($postId),
117 'src' => $imageInfo[0],
118 'alt' => $altText,
119 'fullWidth' => $imageFullWidth,
120 'width' => $imageInfo[1],
121 'height' => $imageInfo[2],
122 'styles' => [
123 'block' => [
124 'textAlign' => 'center',
125 ],
126 ],
127 ];
128 }
129
130 private function getReadMoreButton($post) {
131 if ($this->args['readMoreType'] === 'none') {
132 return false;
133 }
134
135 $postId = $this->isWcProduct($post) ? $post->get_id() : $post->ID;
136
137 if ($this->args['readMoreType'] === 'button') {
138 $button = $this->args['readMoreButton'];
139 $button['url'] = $this->wp->getPermalink($postId);
140 return $button;
141 }
142
143 $readMoreText = sprintf(
144 '<p><a href="%s">%s</a></p>',
145 $this->wp->getPermalink($postId),
146 $this->args['readMoreText']
147 );
148
149 return [
150 'type' => 'text',
151 'text' => $readMoreText,
152 ];
153 }
154
155 public function getTitle($post) {
156 if ($this->isWcProduct($post)) {
157 $title = $post->get_name();
158 $postId = $post->get_id();
159 } else {
160 $title = $post->post_title; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
161 $postId = $post->ID;
162 }
163
164 if (filter_var($this->args['titleIsLink'], FILTER_VALIDATE_BOOLEAN)) {
165 $title = '<a href="' . $this->wp->getPermalink($postId) . '">' . $title . '</a>';
166 }
167
168 if (in_array($this->args['titleFormat'], ['h1', 'h2', 'h3'])) {
169 $tag = $this->args['titleFormat'];
170 } elseif ($this->args['titleFormat'] === 'ul') {
171 $tag = 'li';
172 } else {
173 $tag = 'h1';
174 }
175
176 $alignment = (in_array($this->args['titleAlignment'], ['left', 'right', 'center'])) ? $this->args['titleAlignment'] : 'left';
177
178 $title = '<' . $tag . ' data-post-id="' . $postId . '" style="text-align: ' . $alignment . ';">' . $title . '</' . $tag . '>';
179
180 // The allowed HTML is based on all the possible ways we might construct a $title above
181 $commonAttributes = [
182 'data-post-id' => [],
183 'style' => [],
184 ];
185
186 $allowedTitleHtml = [
187 'a' => [
188 'href' => [],
189 ],
190 'li' => $commonAttributes,
191 'h1' => $commonAttributes,
192 'h2' => $commonAttributes,
193 'h3' => $commonAttributes,
194 'b' => [],
195 'i' => [],
196 'strong' => [],
197 'em' => [],
198 'small' => [],
199 ];
200
201 return [
202 'type' => 'text',
203 'text' => wp_kses($title, $allowedTitleHtml),
204 ];
205 }
206
207 private function getPrice($post) {
208 $price = null;
209 $product = null;
210 if ($this->woocommerceHelper->isWooCommerceActive()) {
211 if ($this->isWcProduct($post)) {
212 $product = $post;
213 } else {
214 $product = $this->woocommerceHelper->wcGetProduct($post->ID);
215 }
216 }
217 if ($product) {
218 $price = '<h2>' . strip_tags($product->get_price_html(), '<span><del>') . '</h2>';
219 }
220 return $price;
221 }
222
223 private function addProductDataToContent($content, $post) {
224 if (!isset($this->args['pricePosition']) || $this->args['pricePosition'] === 'hidden') {
225 return $content;
226 }
227 $price = $this->getPrice($post);
228 $blocksCount = count($content);
229 if ($blocksCount > 0 && $content[$blocksCount - 1]['type'] === 'text') {
230 if ($this->args['pricePosition'] === 'below') {
231 $content[$blocksCount - 1]['text'] = $content[$blocksCount - 1]['text'] . $price;
232 } else {
233 $content[$blocksCount - 1]['text'] = $price . $content[$blocksCount - 1]['text'];
234 }
235 } else {
236 $content[] = [
237 'type' => 'text',
238 'text' => $price,
239 ];
240 }
241 return $content;
242 }
243
244 public function isProduct($post) {
245 return $this->isWcProduct($post) || $this->isPostTypeProduct($post);
246 }
247
248 public function isWcProduct($post) {
249 return class_exists('\WC_Product') && $post instanceof \WC_Product;
250 }
251
252 public function isPostTypeProduct($post) {
253 return isset($post->post_type) && $post->post_type === 'product'; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
254 }
255
256 /**
257 * Replaces double quote character with a unicode
258 * alternative to avoid problems when inlining CSS.
259 * [MAILPOET-1937]
260 *
261 * @param string $title
262 * @return string
263 */
264 private function sanitizeTitle($title) {
265 return str_replace('"', '', $title);
266 }
267 }
268