PluginProbe
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress / 11.1.0
AcyMailing – An Ultimate Newsletter Plugin and Marketing Automation Solution for WordPress v11.1.0
11.1.1 11.1.0 11.0.5 11.0.4 11.0.3 11.0.2 11.0.1 11.0.0 10.11.1 10.11.0 10.10.2 10.10.1 10.10.0 10.9.1 trunk 10.0.0 10.0.1 10.1.0 10.1.1 10.1.2 10.1.3 10.1.4 10.2.0 10.2.1 10.2.2 All 62 releases
← All changes | back/dynamics/post/plugin.php +650 -0 10.0.0 → 11.1.0 View file →
@@ -1,0 +1,650 @@
1 +<?php
2 +
3 +use AcyMailing\Core\AcymPlugin;
4 +use AcyMailing\Helpers\TabHelper;
5 +
6 +class plgAcymPost extends AcymPlugin
7 +{
8 + private bool $groupedByCategory = false;
9 + private $currentCategory = null;
10 + private array $acfFields = [];
11 + private array $handledFieldTypes = [
12 + 'text',
13 + 'textarea',
14 + 'number',
15 + 'range',
16 + 'email',
17 + 'url',
18 + 'password',
19 + 'image',
20 + 'file',
21 + 'select',
22 + 'checkbox',
23 + 'radio',
24 + 'true_false',
25 + 'date_picker',
26 + 'date_time_picker',
27 + 'time_picker',
28 + 'color_picker',
29 + 'button_group',
30 + 'link',
31 + ];
32 +
33 + public function __construct()
34 + {
35 + parent::__construct();
36 + $this->cms = 'WordPress';
37 + $this->rootCategoryId = 0;
38 +
39 + $this->pluginDescription->name = acym_translation('ACYM_ARTICLE');
40 + $this->pluginDescription->icon = '<i class="cell acymicon-wordpress"></i>';
41 + $this->pluginDescription->icontype = 'raw';
42 +
43 + if (ACYM_CMS === 'wordpress') {
44 + $this->displayOptions = [
45 + 'title' => ['ACYM_TITLE', true],
46 + 'image' => ['ACYM_FEATURED_IMAGE', true],
47 + 'excerpt' => ['ACYM_EXCERPT', false],
48 + 'intro' => ['ACYM_INTRO_ONLY', true],
49 + 'content' => ['ACYM_FULL_TEXT', false],
50 + 'cats' => ['ACYM_CATEGORIES', false],
51 + 'author' => ['ACYM_AUTHOR', false],
52 + 'readmore' => ['ACYM_READ_MORE', false],
53 + ];
54 +
55 + $this->initCustomView(true);
56 +
57 + $this->settings = [
58 + 'custom_view' => [
59 + 'type' => 'custom_view',
60 + 'tags' => array_merge($this->displayOptions, $this->replaceOptions, $this->customOptions, $this->elementOptions),
61 + ],
62 + ];
63 + }
64 + }
65 +
66 + public function initCustomOptionsCustomView()
67 + {
68 + $customFields = acym_loadObjectList('SELECT post_title, post_excerpt, post_content FROM #__posts WHERE post_status = "publish" AND post_type = "acf-field"');
69 + if (empty($customFields)) {
70 + return;
71 + }
72 +
73 + foreach ($customFields as $customField) {
74 + $settings = unserialize($customField->post_content);
75 + if (!in_array($settings['type'], $this->handledFieldTypes)) {
76 + continue;
77 + }
78 +
79 + $this->customOptions[$customField->post_excerpt] = [$customField->post_title];
80 + }
81 + }
82 +
83 + public function getStandardStructure(string &$customView): void
84 + {
85 + $tag = new stdClass();
86 + $tag->id = 0;
87 +
88 + $format = new stdClass();
89 + $format->tag = $tag;
90 + $format->title = '{title}';
91 + $format->afterTitle = '';
92 + $format->afterArticle = '';
93 + $format->imagePath = '{image}';
94 + $format->description = '{intro}';
95 + $format->link = '{link}';
96 + $format->customFields = [];
97 + $customView = '<div class="acymailing_content">'.$this->pluginHelper->getStandardDisplay($format).'</div>';
98 + }
99 +
100 + public function initReplaceOptionsCustomView(): void
101 + {
102 + $this->replaceOptions = [
103 + 'link' => ['ACYM_LINK'],
104 + 'picthtml' => ['ACYM_IMAGE'],
105 + 'readmore' => ['ACYM_READ_MORE'],
106 + ];
107 + }
108 +
109 + public function initElementOptionsCustomView(): void
110 + {
111 + $query = 'SELECT post.*
112 + FROM #__posts AS post
113 + WHERE post.post_type = "post"
114 + AND post.post_status = "publish"';
115 + $element = acym_loadObject($query);
116 + if (empty($element)) return;
117 + foreach ($element as $key => $value) {
118 + $this->elementOptions[$key] = [$key];
119 + }
120 + }
121 +
122 + public function getPossibleIntegrations(): ?object
123 + {
124 + return $this->pluginDescription;
125 + }
126 +
127 + public function insertionOptions(?object $defaultValues = null): void
128 + {
129 + $this->defaultValues = $defaultValues;
130 + $this->prepareWPCategories('category');
131 +
132 + $tabHelper = new TabHelper();
133 + $identifier = $this->name;
134 + $tabHelper->startTab(acym_translation('ACYM_ONE_BY_ONE'), !empty($this->defaultValues->defaultPluginTab) && $identifier === $this->defaultValues->defaultPluginTab);
135 +
136 + $defaultSizes = ['thumbnail', 'medium', 'medium_large', 'large', 'post-thumbnail'];
137 + $imageFeaturedSize = ['full' => 'ACYM_ORIGINAL_IMAGE_RESOLUTION'];
138 +
139 + foreach (wp_get_registered_image_subsizes() as $sizeName => $sizes) {
140 + if (in_array($sizeName, $defaultSizes) && (!empty($sizes['width']) || !empty($sizes['height']))) {
141 + $imageFeaturedSize[$sizeName] = $sizes['width'].'x'.$sizes['height'].'px';
142 + }
143 + }
144 +
145 + $displayOptions = [
146 + [
147 + 'title' => 'ACYM_DISPLAY',
148 + 'type' => 'checkbox',
149 + 'name' => 'display',
150 + 'options' => $this->displayOptions,
151 + ],
152 + ];
153 +
154 + $this->initAcfData();
155 + if (!empty($this->acfFields)) {
156 + $customFieldsOptions = [];
157 + foreach ($this->acfFields as $field) {
158 + if (!in_array($field['type'], $this->handledFieldTypes)) {
159 + continue;
160 + }
161 + $customFieldsOptions[$field['ID']] = [$field['label'], false];
162 + }
163 + $displayOptions[] = [
164 + 'title' => 'ACF',
165 + 'type' => 'checkbox',
166 + 'name' => 'acf',
167 + 'options' => $customFieldsOptions,
168 + ];
169 + }
170 +
171 + $displayOptions = array_merge(
172 + $displayOptions,
173 + [
174 + [
175 + 'title' => 'ACYM_FEATURED_IMAGE_SIZE',
176 + 'type' => 'select',
177 + 'name' => 'size',
178 + 'options' => $imageFeaturedSize,
179 + 'default' => 'full',
180 + ],
181 + [
182 + 'title' => 'ACYM_CLICKABLE_TITLE',
183 + 'type' => 'boolean',
184 + 'name' => 'clickable',
185 + 'default' => true,
186 + ],
187 + [
188 + 'title' => 'ACYM_CLICKABLE_IMAGE',
189 + 'type' => 'boolean',
190 + 'name' => 'clickableimg',
191 + 'default' => false,
192 + ],
193 + [
194 + 'title' => 'ACYM_REPLACE_SHORTCODES',
195 + 'type' => 'boolean',
196 + 'name' => 'replaceshortcode',
197 + 'default' => false,
198 + ],
199 + [
200 + 'title' => 'ACYM_TRUNCATE',
201 + 'type' => 'intextfield',
202 + 'isNumber' => 1,
203 + 'name' => 'wrap',
204 + 'text' => 'ACYM_TRUNCATE_AFTER',
205 + 'default' => 0,
206 + ],
207 + [
208 + 'title' => 'ACYM_DISPLAY_PICTURES',
209 + 'type' => 'pictures',
210 + 'name' => 'pictures',
211 + ],
212 + ]
213 + );
214 +
215 + $zoneContent = $this->getFilteringZone().$this->prepareListing();
216 + $this->displaySelectionZone($zoneContent);
217 + $this->pluginHelper->displayOptions($displayOptions, $identifier, 'individual', $this->defaultValues);
218 +
219 + $tabHelper->endTab();
220 + $identifier = 'auto'.$this->name;
221 + $tabHelper->startTab(acym_translation('ACYM_BY_CATEGORY'), !empty($this->defaultValues->defaultPluginTab) && $identifier === $this->defaultValues->defaultPluginTab);
222 +
223 + $catOptions = [
224 + [
225 + 'title' => 'ACYM_ORDER_BY',
226 + 'type' => 'select',
227 + 'name' => 'order',
228 + 'options' => [
229 + 'ID' => 'ACYM_ID',
230 + 'post_date' => 'ACYM_PUBLISHING_DATE',
231 + 'post_modified' => 'ACYM_MODIFICATION_DATE',
232 + 'post_title' => 'ACYM_TITLE',
233 + 'menu_order' => 'ACYM_MENU_ORDER',
234 + 'rand' => 'ACYM_RANDOM',
235 + ],
236 + ],
237 + [
238 + 'title' => 'ACYM_GROUP_BY_CATEGORY',
239 + 'type' => 'boolean',
240 + 'name' => 'groupbycat',
241 + 'default' => false,
242 + ],
243 + ];
244 + $this->autoContentOptions($catOptions);
245 +
246 + $this->autoCampaignOptions($catOptions);
247 +
248 + $displayOptions = array_merge($displayOptions, $catOptions);
249 +
250 + ob_start();
251 + acym_display(acym_translation('ACYM_SPECIAL_CONTENT_WARNING'), 'warning', false);
252 + $warningMessage = ob_get_clean();
253 + $this->displaySelectionZone($warningMessage.$this->getCategoryListing());
254 + $this->pluginHelper->displayOptions($displayOptions, $identifier, 'grouped', $this->defaultValues);
255 +
256 + $tabHelper->endTab();
257 +
258 + $tabHelper->display('plugin');
259 + }
260 +
261 + public function prepareListing(): string
262 + {
263 + $this->querySelect = 'SELECT post.ID, post.post_title, post.post_date, post.post_content ';
264 + $this->query = 'FROM #__posts AS post ';
265 + $this->filters = [];
266 + $this->filters[] = 'post.post_type = "post"';
267 + $this->filters[] = 'post.post_status = "publish"';
268 + $this->searchFields = ['post.ID', 'post.post_title'];
269 + $this->pageInfo->order = 'post.ID';
270 + $this->elementIdTable = 'post';
271 + $this->elementIdColumn = 'ID';
272 +
273 + parent::prepareListing();
274 +
275 + //if a category is selected
276 + if (!empty($this->pageInfo->filter_cat)) {
277 + $this->query .= 'JOIN #__term_relationships AS cat ON post.ID = cat.object_id';
278 + $this->filters[] = 'cat.term_taxonomy_id = '.intval($this->pageInfo->filter_cat);
279 + }
280 +
281 + $listingOptions = [
282 + 'header' => [
283 + 'post_title' => [
284 + 'label' => 'ACYM_TITLE',
285 + 'size' => '7',
286 + ],
287 + 'post_date' => [
288 + 'label' => 'ACYM_PUBLISHING_DATE',
289 + 'size' => '4',
290 + 'type' => 'date',
291 + ],
292 + 'ID' => [
293 + 'label' => 'ACYM_ID',
294 + 'size' => '1',
295 + 'class' => 'text-center',
296 + ],
297 + ],
298 + 'id' => 'ID',
299 + 'rows' => $this->getElements(),
300 + ];
301 +
302 + return $this->getElementsListing($listingOptions);
303 + }
304 +
305 + public function replaceContent(object &$email): void
306 + {
307 + $this->initAcfData();
308 + $this->replaceMultiple($email);
309 + $this->replaceOne($email);
310 + }
311 +
312 + public function generateByCategory(object &$email): object
313 + {
314 + $tags = $this->pluginHelper->extractTags($email, 'auto'.$this->name);
315 + $this->tags = [];
316 +
317 + if (empty($tags)) return $this->generateCampaignResult;
318 +
319 + foreach ($tags as $oneTag => $parameter) {
320 + if (isset($this->tags[$oneTag])) continue;
321 +
322 + $query = 'SELECT DISTINCT post.`ID`
323 + FROM #__posts AS post
324 + LEFT JOIN #__term_relationships AS cat ON post.ID = cat.object_id';
325 +
326 + $where = [];
327 +
328 + $selectedArea = $this->getSelectedArea($parameter);
329 + if (!empty($selectedArea)) {
330 + $where[] = 'cat.term_taxonomy_id IN ('.implode(',', $selectedArea).')';
331 + }
332 +
333 + $where[] = 'post.post_type = "post"';
334 + $where[] = 'post.post_status = "publish"';
335 + if (!empty($parameter->min_publish)) {
336 + $parameter->min_publish = acym_date(acym_replaceDate($parameter->min_publish), 'Y-m-d H:i:s', false);
337 + $where[] = 'post.post_date_gmt >= '.acym_escapeDB($parameter->min_publish);
338 + }
339 +
340 + if (!empty($parameter->onlynew)) {
341 + $lastGenerated = $this->getLastGenerated($email->id);
342 + if (!empty($lastGenerated)) {
343 + $where[] = 'post.post_date_gmt > '.acym_escapeDB(acym_date($lastGenerated, 'Y-m-d H:i:s', false));
344 + }
345 + }
346 +
347 + $query .= ' WHERE ('.implode(') AND (', $where).')';
348 +
349 + $this->groupedByCategory = !empty($parameter->groupbycat);
350 + $this->tags[$oneTag] = $this->finalizeCategoryFormat($query, $parameter, 'post');
351 + }
352 +
353 + return $this->generateCampaignResult;
354 + }
355 +
356 + protected function groupByCategory(array $elements): array
357 + {
358 + if (!$this->groupedByCategory || empty($elements)) return $elements;
359 +
360 + acym_arrayToInteger($elements);
361 + $idsWithCatids = acym_loadObjectList(
362 + 'SELECT map.`object_id`, taxonomy.`term_id`
363 + FROM #__term_relationships AS map
364 + JOIN #__term_taxonomy AS taxonomy
365 + ON map.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
366 + WHERE taxonomy.`taxonomy` = "category"
367 + AND map.`object_id` IN ('.implode(', ', $elements).')'
368 + );
369 + usort(
370 + $idsWithCatids,
371 + function ($a, $b) {
372 + return strtolower($a->term_id) > strtolower($b->term_id) ? 1 : -1;
373 + }
374 + );
375 + $elements = [];
376 + foreach ($idsWithCatids as $oneArticle) {
377 + if (in_array($oneArticle->object_id, $elements)) continue;
378 + $elements[] = $oneArticle->object_id;
379 + }
380 +
381 + return $elements;
382 + }
383 +
384 + public function replaceIndividualContent(object $tag): string
385 + {
386 + $allowedStatuses = ['publish'];
387 + $allowedStatuses = acym_triggerCmsHook('onAcymPostInsertion', [$allowedStatuses], false);
388 + if (empty($allowedStatuses) || !is_array($allowedStatuses)) {
389 + $allowedStatuses = ['publish'];
390 + }
391 + $allowedStatuses = array_map('acym_escapeDB', $allowedStatuses);
392 +
393 + $query = 'SELECT post.*, `user`.`user_nicename`, `user`.`display_name`
394 + FROM #__posts AS post
395 + LEFT JOIN #__users AS `user`
396 + ON `user`.`ID` = `post`.`post_author`
397 + WHERE post.post_type = "post"
398 + AND post.post_status IN ('.implode(', ', $allowedStatuses).')
399 + AND post.ID = '.intval($tag->id);
400 +
401 + $element = $this->initIndividualContent($tag, $query);
402 +
403 + if (empty($element)) return '';
404 +
405 + $varFields = $this->getCustomLayoutVars($element);
406 +
407 + $link = get_permalink($element->ID);
408 + $link = $this->getLinkTranslated($link);
409 + $varFields['{link}'] = $link;
410 +
411 + $title = '';
412 + $varFields['{title}'] = $element->post_title;
413 + if (in_array('title', $tag->display)) $title = $varFields['{title}'];
414 +
415 + $afterTitle = '';
416 + $afterArticle = '';
417 +
418 + $imagePath = '';
419 + $imageId = get_post_thumbnail_id($tag->id);
420 + if (!empty($imageId)) {
421 + if (empty($tag->size)) $tag->size = 'full';
422 + $imagePath = get_the_post_thumbnail_url($tag->id, $tag->size);
423 + }
424 + $varFields['{image}'] = $imagePath;
425 + $varFields['{picthtml}'] = '<img class="content_main_image" alt="" src="'.$imagePath.'">';
426 + if (!in_array('image', $tag->display)) $imagePath = '';
427 +
428 + $contentText = '';
429 + $varFields['{excerpt}'] = $this->cleanExtensionContent($element->post_excerpt);
430 + if (in_array('excerpt', $tag->display) && !empty($varFields['{excerpt}'])) {
431 + $contentText .= '<p>'.$varFields['{excerpt}'].'</p>';
432 + }
433 +
434 + $varFields['{content}'] = $this->cleanExtensionContent($element->post_content);
435 + $varFields['{intro}'] = $this->cleanExtensionContent($this->getIntro($element->post_content));
436 + $varFields['{content}'] = !empty($tag->replaceshortcode) ? $this->replaceShortcode($varFields['{content}']) : $varFields['{content}'];
437 + $varFields['{intro}'] = !empty($tag->replaceshortcode) ? $this->replaceShortcode($varFields['{intro}']) : $varFields['{intro}'];
438 + if (in_array('content', $tag->display)) {
439 + $contentText .= $varFields['{content}'];
440 + } elseif (in_array('intro', $tag->display)) {
441 + $contentText .= $varFields['{intro}'];
442 + }
443 +
444 + $customFields = [];
445 + $varFields['{author}'] = empty($element->display_name) ? $element->user_nicename : $element->display_name;
446 + if (in_array('author', $tag->display) && !empty($varFields['{author}'])) {
447 + $customFields[] = [
448 + $varFields['{author}'],
449 + acym_translation('ACYM_AUTHOR'),
450 + ];
451 + }
452 +
453 + $varFields['{cats}'] = get_the_term_list($tag->id, 'category', '', ', ');
454 + if (in_array('cats', $tag->display)) {
455 + $customFields[] = [
456 + $varFields['{cats}'],
457 + acym_translation('ACYM_CATEGORIES'),
458 + ];
459 + }
460 +
461 + $varFields['{readmore}'] = '<a class="acymailing_readmore_link" style="text-decoration:none;" target="_blank" href="'.$link.'"><span class="acymailing_readmore">'.esc_html(
462 + acym_translation('ACYM_READ_MORE')
463 + ).'</span></a>';
464 + if (in_array('readmore', $tag->display)) {
465 + $afterArticle .= $varFields['{readmore}'];
466 + }
467 +
468 + if (!empty($this->acfFields)) {
469 + $tag->acf = empty($tag->acf) ? [] : explode(',', $tag->acf);
470 +
471 + foreach ($this->acfFields as $field) {
472 + $varFields['{'.$field['name'].'}'] = acf_get_value($tag->id, $field);
473 +
474 + if (empty($varFields['{'.$field['name'].'}']) && (!is_string($varFields['{'.$field['name'].'}']) || strlen($varFields['{'.$field['name'].'}']) === 0)) {
475 + continue;
476 + }
477 +
478 + $varFields['{'.$field['name'].'}'] = $this->getFormattedAcfFieldValue($varFields['{'.$field['name'].'}'], $tag->id, $field);
479 +
480 + if (in_array($field['ID'], $tag->acf) && strlen($varFields['{'.$field['name'].'}']) > 0) {
481 + $customFields[] = [
482 + $varFields['{'.$field['name'].'}'],
483 + acf_get_field_label($field),
484 + ];
485 + }
486 + }
487 + }
488 +
489 + $format = new stdClass();
490 + $format->tag = $tag;
491 + $format->title = $title;
492 + $format->afterTitle = $afterTitle;
493 + $format->afterArticle = $afterArticle;
494 + $format->imagePath = $imagePath;
495 + $format->description = $contentText;
496 + $format->link = empty($tag->clickable) && empty($tag->clickableimg) ? '' : $link;
497 + $format->customFields = $customFields;
498 + $result = '<div class="acymailing_content">'.$this->pluginHelper->getStandardDisplay($format).'</div>';
499 +
500 + $categoryTitle = '';
501 + $postCategories = acym_loadObjectList(
502 + 'SELECT terms.`term_id`, terms.`name`
503 + FROM #__terms AS terms
504 + JOIN #__term_taxonomy AS taxonomy
505 + ON terms.`term_id` = taxonomy.`term_id`
506 + JOIN #__term_relationships AS map
507 + ON map.`term_taxonomy_id` = taxonomy.`term_taxonomy_id`
508 + WHERE map.`object_id` = '.intval($element->ID),
509 + 'term_id'
510 + );
511 + $catIds = array_keys($postCategories);
512 + if (!empty($tag->groupbycat) && !in_array($this->currentCategory, $catIds)) {
513 + $this->currentCategory = min($catIds);
514 +
515 + $categoryTitle = '<h1 class="acymailing_category_title">'.$postCategories[$this->currentCategory]->name.'</h1>';
516 + $categoryTitle = '<div class="acymailing_content"><a target="_blank" href="'.get_category_link($this->currentCategory).'">'.$categoryTitle.'</a></div>';
517 + }
518 +
519 + return $categoryTitle.$this->finalizeElementFormat($result, $tag, $varFields);
520 + }
521 +
522 + /**
523 + * Used in Gutenberg block and elementor
524 + *
525 + * @param bool $ajax
526 + * @param int $postPerPage
527 + *
528 + * @return array|array[]|void
529 + */
530 + public function getPosts(bool $ajax = true, int $postPerPage = 20)
531 + {
532 + $return = $ajax ? [] : [0 => [0, acym_translation('ACYM_SELECT_AN_ARTICLE')]];
533 +
534 + $search = acym_getVar('string', 'searchedterm', '');
535 + if (!empty($search)) {
536 + $search = acym_escapeDB('%'.$search.'%');
537 + $search = 'post_title LIKE '.$search.' OR post_name LIKE '.$search.' OR post_content LIKE '.$search;
538 + $search = ' AND ('.$search.')';
539 + }
540 +
541 + $limit = '';
542 + if (!empty($postPerPage)) {
543 + $limit = 'LIMIT '.$postPerPage;
544 + }
545 +
546 + $query = 'SELECT ID, post_title FROM #__posts WHERE post_status = "publish" AND post_type IN ("post", "page") '.$search.' '.$limit;
547 + $posts = acym_loadObjectList($query);
548 + foreach ($posts as $post) {
549 + $return[] = [$post->ID, $post->post_title];
550 + }
551 +
552 + if ($ajax) {
553 + echo json_encode($return);
554 + exit;
555 + } else {
556 + return $return;
557 + }
558 + }
559 +
560 + protected function getTranslationId(int $elementId, string $translationTool, bool $defaultLanguage = false): int
561 + {
562 + $languageCode = $this->emailLanguage;
563 +
564 + if ($defaultLanguage) {
565 + $languageCode = $this->config->get('multilingual_default', ACYM_DEFAULT_LANGUAGE);
566 + } else {
567 + $idDefaultLanguage = $this->getTranslationId($elementId, $translationTool, true);
568 +
569 + // We only translate inserted articles of the default language
570 + if ($idDefaultLanguage !== $elementId) {
571 + return $elementId;
572 + }
573 + }
574 +
575 + $languageCode = substr($languageCode, 0, 2);
576 +
577 + if ($translationTool === 'polylang') {
578 + if (acym_isExtensionActive('polylang/polylang.php') && function_exists('pll_get_post')) {
579 + $translationId = pll_get_post($elementId, $languageCode);
580 + if (!empty($translationId)) $elementId = $translationId;
581 + }
582 + } elseif ($translationTool === 'wpml') {
583 + if (acym_isExtensionActive('sitepress-multilingual-cms/sitepress.php')) {
584 + // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- WPML hook for integration.
585 + $elementId = apply_filters('wpml_object_id', $elementId, 'post', true, $languageCode);
586 + }
587 + }
588 +
589 + return intval($elementId);
590 + }
591 +
592 + private function initAcfData(): void
593 + {
594 + $installed = acym_isExtensionActive('advanced-custom-fields/acf.php') || acym_isExtensionActive('advanced-custom-fields-pro/acf.php');
595 + if (!$installed || !function_exists('acf_get_field_groups')) {
596 + return;
597 + }
598 +
599 + $fieldGroups = acf_get_field_groups(['post_type' => 'post']);
600 + foreach ($fieldGroups as $fieldGroup) {
601 + if (empty($fieldGroup['active'])) {
602 + continue;
603 + }
604 +
605 + $this->acfFields = array_merge($this->acfFields, acf_get_fields($fieldGroup));
606 + }
607 + }
608 +
609 + private function getFormattedAcfFieldValue($value, $postId, $field): string
610 + {
611 + $value = acf_format_value($value, $postId, $field);
612 + if ($field['type'] === 'email') {
613 + $value = '<a href="mailto:'.$value.'">'.$value.'</a>';
614 + } elseif ($field['type'] === 'url') {
615 + $value = '<a href="'.$value.'" target="_blank">'.$value.'</a>';
616 + } elseif ($field['type'] === 'link') {
617 + $value = '<a href="'.$value['url'].'" target="_blank">'.(empty($value['title']) ? $value['url'] : $value['title']).'</a>';
618 + } elseif ($field['type'] === 'image') {
619 + if (empty($value['link'])) {
620 + $value = '';
621 + } else {
622 + $value = '<img alt="'.esc_attr($value['alt']).'" src="'.esc_url($value['link']).'" />';
623 + }
624 + } elseif (in_array($field['type'], ['checkbox', 'select'])) {
625 + if (is_array($value)) {
626 + $value = implode(', ', $value);
627 + }
628 + } elseif ($field['type'] === 'true_false') {
629 + $value = empty($value) ? acym_translation('ACYM_NO') : acym_translation('ACYM_YES');
630 + } elseif ($field['type'] === 'file') {
631 + if (empty($value['link'])) {
632 + $value = '';
633 + } else {
634 + $value = '<a href="'.$value['link'].'" target="_blank">'.esc_html(
635 + $value['filename']
636 + ).'</a>';
637 + }
638 + } elseif ($field['type'] === 'textarea') {
639 + $value = nl2br($value);
640 + } elseif (in_array($field['type'], ['time_picker', 'date_picker', 'date_time_picker'])) {
641 + if ($field['display_format'] !== $field['return_format']) {
642 + $value = gmdate($field['display_format'], strtotime($value));
643 + }
644 + } else {
645 + $value = esc_html($value);
646 + }
647 +
648 + return $value;
649 + }
650 +}