← All changes
|
app/Services/Integrations/MailChimp/MailChimpSubscriber.php
+126
-21
3.6.60
→
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 | } |