PluginProbe
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder / 6.2.15
Fluent Forms – Customizable Contact Forms, Survey, Quiz, & Conversational Form Builder v6.2.15
6.2.15 6.2.14 6.2.13 6.2.12 6.2.10 6.2.11 6.2.9 6.2.8 6.2.7 6.2.6 6.2.5 6.2.4 6.2.3 6.2.2 3.6.22 3.6.31 3.6.40 3.6.41 3.6.42 3.6.50 3.6.51 3.6.60 3.6.61 3.6.62 3.6.64 All 197 releases
← All changes | app/Services/Integrations/MailChimp/MailChimpSubscriber.php +126 -21 3.6.64 → 6.2.15 View file →
@@ -18,8 +18,9 @@
18 18 protected $feeds = [];
19 19
20 20 /**
21 21 * Required for api response logging
22 + *
22 23 * @var string
23 24 */
24 25 protected $metaKey = 'fluentform_mailchimp_feed';
25 26
@@ -34,9 +35,10 @@
34 35
35 36 foreach ($feeds as $feed) {
36 37 if ($this->isApplicable($feed, $formData)) {
37 38 $email = ArrayHelper::get(
38 - $formData, ArrayHelper::get($feed->formattedValue, 'fieldEmailAddress')
39 + $formData,
40 + ArrayHelper::get($feed->formattedValue, 'fieldEmailAddress')
39 41 );
40 42
41 43 if (is_string($email) && is_email($email)) {
42 44 $feed->formattedValue['fieldEmailAddress'] = $email;
@@ -68,25 +70,26 @@
68 70 * @param $feed
69 71 * @param $formData
70 72 * @param $entry
71 73 * @param $form
74 + *
72 75 * @return array|bool|false
76 + *
73 77 * @throws \Exception
74 78 */
75 79 public function subscribe($feed, $formData, $entry, $form)
76 80 {
77 -
78 81 $feedData = $feed['processedValues'];
79 82
80 - if (!is_email($feedData['fieldEmailAddress'])) {
83 + if (! is_email($feedData['fieldEmailAddress'])) {
81 84 $feedData['fieldEmailAddress'] = ArrayHelper::get($formData, $feedData['fieldEmailAddress']);
82 85 }
83 86
84 - if (!is_email($feedData['fieldEmailAddress'])) {
87 + if (! is_email($feedData['fieldEmailAddress'])) {
85 88 return false;
86 89 }
87 90
88 - $mergeFields = array_filter(ArrayHelper::get($feedData, 'merge_fields'));
91 + $mergeFields = array_filter((array) ArrayHelper::get($feedData, 'merge_fields', []));
89 92 $status = ArrayHelper::isTrue($feedData, 'doubleOptIn') ? 'pending' : 'subscribed';
90 93
91 94 $listId = $feedData['list_id'];
92 95
@@ -92,22 +95,81 @@
92 95
93 96 $arguments = [
94 97 'email_address' => $feedData['fieldEmailAddress'],
95 98 'status_if_new' => $status,
96 - 'double_optin' => ArrayHelper::isTrue($feedData, 'doubleOptIn'),
97 - 'vip' => ArrayHelper::isTrue($feedData, 'markAsVIP'),
99 + 'double_optin' => ArrayHelper::isTrue($feedData, 'doubleOptIn'),
100 + 'vip' => ArrayHelper::isTrue($feedData, 'markAsVIP'),
98 101 ];
99 102
100 103 if ($mergeFields) {
101 - $arguments['merge_fields'] = (object)$mergeFields;
104 + // Process merge field for address
105 + $mergeFieldsSettings = $this->findMergeFields(
106 + ArrayHelper::get($feed, 'settings.list_id')
107 + );
108 +
109 + foreach ($mergeFieldsSettings as $fieldSettings) {
110 + if (
111 + 'address' == $fieldSettings['type'] ||
112 + 'birthday' == $fieldSettings['type'] ||
113 + 'date' == $fieldSettings['type']
114 + ) {
115 + $fieldName = $fieldSettings['tag'];
116 +
117 + $formFieldName = ArrayHelper::get($feed, 'settings.merge_fields.' . $fieldName);
118 +
119 + if ($formFieldName) {
120 + preg_match('/{+(.*?)}/', $formFieldName, $matches);
121 +
122 + $formFieldName = substr($matches[1], strlen('inputs.'));
123 +
124 + $formFieldValue = ArrayHelper::get($formData, $formFieldName);
125 +
126 + if ($formFieldValue) {
127 + if (is_array($formFieldValue) && 'address' == $fieldSettings['type']) {
128 + $mergeFields[$fieldName] = [
129 + 'addr1' => ArrayHelper::get($formFieldValue, 'address_line_1'),
130 + 'city' => ArrayHelper::get($formFieldValue, 'city'),
131 + 'state' => ArrayHelper::get($formFieldValue, 'state'),
132 + 'zip' => ArrayHelper::get($formFieldValue, 'zip'),
133 + 'country' => ArrayHelper::get($formFieldValue, 'country'),
134 + ];
135 +
136 + if (ArrayHelper::exists($formFieldValue, 'address_line_2')) {
137 + $mergeFields[$fieldName]['addr2'] = ArrayHelper::get($formFieldValue, 'address_line_2');
138 + }
139 + }
140 + elseif ('birthday' == $fieldSettings['type']) {
141 + $mergeFields[$fieldName] = date('d/m', strtotime($formFieldValue));
142 + } else {
143 + $date = \DateTime::createFromFormat('d/m/Y', $formFieldValue) ?: \DateTime::createFromFormat('m/d/Y', $formFieldValue);
144 +
145 + if ($date) {
146 + $mergeFields[$fieldName] = $date->format('Y-m-d\T00:00:00.001\Z');
147 + }
148 + }
149 + }
150 + }
151 + }
152 + }
153 +
154 + $arguments['merge_fields'] = (object) $mergeFields;
102 155 }
103 156
104 157 if ($entry->ip) {
105 - $arguments['ip_signup'] = $entry->ip;
158 + $ipAddress = $entry->ip;
159 +
160 + // sometimes server returns multiple IP addresses with comma separated value
161 + // from multiple IP, getting the first one
162 + if (strpos($ipAddress, ',') !== false) {
163 + $ipArray = explode(',', $ipAddress);
164 + $ipAddress = trim($ipArray[0]);
165 + }
166 +
167 + $arguments['ip_signup'] = $ipAddress;
106 168 }
107 169
108 170 $tags = $this->getSelectedTagIds($feedData, $formData, 'tags');
109 - if(!is_array($tags)) {
171 + if (! is_array($tags)) {
110 172 $tags = explode(',', $tags);
111 173 }
112 174
113 175 $tags = array_map('trim', $tags);
@@ -112,10 +174,22 @@
112 174
113 175 $tags = array_map('trim', $tags);
114 176 $tags = array_filter($tags);
115 177
178 + //explode dynamic commas values to array
179 + $tagsFormatted = [];
180 + foreach ($tags as $tag) {
181 + if (false !== strpos($tag, ',')) {
182 + $innerTags = explode(',', $tag);
183 + foreach ($innerTags as $t) {
184 + $tagsFormatted[] = $t;
185 + }
186 + } else {
187 + $tagsFormatted[] = $tag;
188 + }
189 + }
116 190 if ($tags) {
117 - $arguments['tags'] = $tags;
191 + $arguments['tags'] = array_map('trim', $tagsFormatted);
118 192 }
119 193
120 194 $note = '';
121 195 if ($feedData['note']) {
@@ -130,15 +204,39 @@
130 204
131 205 $isNew = true;
132 206 if (!empty($existingMember['id'])) {
133 207 $isNew = false;
208 + if (ArrayHelper::isTrue($feedData, 'resubscribe')) {
209 + //for resubscribing unsubscribed contact ; status = subscribed || pending
210 + $arguments['status'] = $status;
211 + }
134 212 // We have members so we can merge the values
135 - if (apply_filters('fluentform_mailchimp_keep_existing_interests', true, $form->id)) {
213 + $status = apply_filters_deprecated(
214 + 'fluentform_mailchimp_keep_existing_interests',
215 + [
216 + true,
217 + $form->id
218 + ],
219 + FLUENTFORM_FRAMEWORK_UPGRADE,
220 + 'fluentform/mailchimp_keep_existing_interests',
221 + 'Use fluentform/mailchimp_keep_existing_interests instead of fluentform_mailchimp_keep_existing_interests.'
222 + );
223 + if (apply_filters('fluentform/mailchimp_keep_existing_interests', $status, $form->id)) {
136 224 $arguments['interests'] = ArrayHelper::get($existingMember, 'interests', []);
137 225 }
138 226
139 - if ($arguments['tags']) {
140 - if (apply_filters('fluentform_mailchimp_keep_existing_tags', true, $form->id)) {
227 + if (ArrayHelper::exists($arguments, 'tags')) {
228 + $isExistingTags = apply_filters_deprecated(
229 + 'fluentform_mailchimp_keep_existing_tags',
230 + [
231 + true,
232 + $form->id
233 + ],
234 + FLUENTFORM_FRAMEWORK_UPGRADE,
235 + 'fluentform/mailchimp_keep_existing_tags',
236 + 'Use fluentform/mailchimp_keep_existing_tags instead of fluentform_mailchimp_keep_existing_tags.'
237 + );
238 + if (apply_filters('fluentform/mailchimp_keep_existing_tags', $isExistingTags, $form->id)) {
141 239 $tags = ArrayHelper::get($existingMember, 'tags', []);
142 240 $tagNames = [];
143 241 foreach ($tags as $tag) {
144 242 $tagNames[] = $tag['name'];
@@ -161,21 +259,28 @@
161 259 $settings = get_option('_fluentform_mailchimp_details');
162 260 $MailChimp = new MailChimp($settings['apiKey']);
163 261 $endPoint = 'lists/' . $listId . '/members/' . $contactHash;
164 262
263 + $result = $MailChimp->put($endPoint, $arguments);
165 264
166 - $result = $MailChimp->put($endPoint, $arguments);
265 + if (is_array($result) && isset($result['status']) && 400 == $result['status']) {
266 + if (ArrayHelper::exists($result, 'errors')) {
267 + $errors = ArrayHelper::get($result, 'errors');
268 + return new \WP_Error(423, $errors);
269 + }
270 + return new \WP_Error(423, $result['detail']);
271 + }
167 272
168 - if ($result && !is_wp_error($result) && isset($result['id'])) {
273 + if ($result && ! is_wp_error($result) && isset($result['id'])) {
169 274 $noteEnpoint = 'lists/' . $listId . '/members/' . $contactHash . '/notes';
170 275 if ($note) {
171 276 $MailChimp->post($noteEnpoint, [
172 - 'note' => $note
277 + 'note' => $note,
173 278 ]);
174 279 }
175 280
176 281 // Let's sync the tags
177 - if (!$isNew && $arguments['tags']) {
282 + if (! $isNew && ArrayHelper::exists($arguments, 'tags')) {
178 283 $currentTags = [];
179 284 foreach ($result['tags'] as $tag) {
180 285 $currentTags[] = $tag['name'];
181 286 }
@@ -188,14 +293,14 @@
188 293 if ($newTags) {
189 294 $formattedtags = [];
190 295 foreach ($newTags as $tag) {
191 296 $formattedtags[] = [
192 - 'name' => $tag,
193 - 'status' => 'active'
297 + 'name' => $tag,
298 + 'status' => 'active',
194 299 ];
195 300 }
196 301 $MailChimp->post($tagEnpoint, [
197 - 'tags' => $formattedtags
302 + 'tags' => $formattedtags,
198 303 ]);
199 304 }
200 305 }
201 306 }