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 +134 -24 3.6.40 → 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,26 +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 -
81 - if (!is_email($feedData['fieldEmailAddress'])) {
83 + if (! is_email($feedData['fieldEmailAddress'])) {
82 84 $feedData['fieldEmailAddress'] = ArrayHelper::get($formData, $feedData['fieldEmailAddress']);
83 85 }
84 86
85 - if (!is_email($feedData['fieldEmailAddress'])) {
87 + if (! is_email($feedData['fieldEmailAddress'])) {
86 88 return false;
87 89 }
88 90
89 - $mergeFields = array_filter(ArrayHelper::get($feedData, 'merge_fields'));
91 + $mergeFields = array_filter((array) ArrayHelper::get($feedData, 'merge_fields', []));
90 92 $status = ArrayHelper::isTrue($feedData, 'doubleOptIn') ? 'pending' : 'subscribed';
91 93
92 94 $listId = $feedData['list_id'];
93 95
@@ -93,25 +95,103 @@
93 95
94 96 $arguments = [
95 97 'email_address' => $feedData['fieldEmailAddress'],
96 98 'status_if_new' => $status,
97 - 'double_optin' => ArrayHelper::isTrue($feedData, 'doubleOptIn'),
98 - 'vip' => ArrayHelper::isTrue($feedData, 'markAsVIP'),
99 + 'double_optin' => ArrayHelper::isTrue($feedData, 'doubleOptIn'),
100 + 'vip' => ArrayHelper::isTrue($feedData, 'markAsVIP'),
99 101 ];
100 102
101 103 if ($mergeFields) {
102 - $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;
103 155 }
104 156
105 157 if ($entry->ip) {
106 - $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;
107 168 }
108 169
109 - if ($feedData['tags']) {
110 - $providedTags = explode(',', $feedData['tags']);
111 - $arguments['tags'] = array_map('trim', $providedTags);
170 + $tags = $this->getSelectedTagIds($feedData, $formData, 'tags');
171 + if (! is_array($tags)) {
172 + $tags = explode(',', $tags);
112 173 }
113 174
175 + $tags = array_map('trim', $tags);
176 + $tags = array_filter($tags);
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 + }
190 + if ($tags) {
191 + $arguments['tags'] = array_map('trim', $tagsFormatted);
192 + }
193 +
114 194 $note = '';
115 195 if ($feedData['note']) {
116 196 $note = esc_attr($feedData['note']);
117 197 }
@@ -124,15 +204,39 @@
124 204
125 205 $isNew = true;
126 206 if (!empty($existingMember['id'])) {
127 207 $isNew = false;
208 + if (ArrayHelper::isTrue($feedData, 'resubscribe')) {
209 + //for resubscribing unsubscribed contact ; status = subscribed || pending
210 + $arguments['status'] = $status;
211 + }
128 212 // We have members so we can merge the values
129 - 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)) {
130 224 $arguments['interests'] = ArrayHelper::get($existingMember, 'interests', []);
131 225 }
132 226
133 - if ($arguments['tags']) {
134 - 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)) {
135 239 $tags = ArrayHelper::get($existingMember, 'tags', []);
136 240 $tagNames = [];
137 241 foreach ($tags as $tag) {
138 242 $tagNames[] = $tag['name'];
@@ -155,21 +259,28 @@
155 259 $settings = get_option('_fluentform_mailchimp_details');
156 260 $MailChimp = new MailChimp($settings['apiKey']);
157 261 $endPoint = 'lists/' . $listId . '/members/' . $contactHash;
158 262
263 + $result = $MailChimp->put($endPoint, $arguments);
159 264
160 - $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 + }
161 272
162 - if ($result && !is_wp_error($result) && isset($result['id'])) {
273 + if ($result && ! is_wp_error($result) && isset($result['id'])) {
163 274 $noteEnpoint = 'lists/' . $listId . '/members/' . $contactHash . '/notes';
164 275 if ($note) {
165 276 $MailChimp->post($noteEnpoint, [
166 - 'note' => $note
277 + 'note' => $note,
167 278 ]);
168 279 }
169 280
170 281 // Let's sync the tags
171 - if (!$isNew && $arguments['tags']) {
282 + if (! $isNew && ArrayHelper::exists($arguments, 'tags')) {
172 283 $currentTags = [];
173 284 foreach ($result['tags'] as $tag) {
174 285 $currentTags[] = $tag['name'];
175 286 }
@@ -182,19 +293,18 @@
182 293 if ($newTags) {
183 294 $formattedtags = [];
184 295 foreach ($newTags as $tag) {
185 296 $formattedtags[] = [
186 - 'name' => $tag,
187 - 'status' => 'active'
297 + 'name' => $tag,
298 + 'status' => 'active',
188 299 ];
189 300 }
190 301 $MailChimp->post($tagEnpoint, [
191 - 'tags' => $formattedtags
302 + 'tags' => $formattedtags,
192 303 ]);
193 304 }
194 305 }
195 306 }
196 -
197 307 return true;
198 308 }
199 309
200 310 return $result;