description = 'WP Fluent Forms Mailchimp module allows you to create Mailchimp newsletter signup forms in WordPress';
$this->logo = $this->app->url('public/img/integrations/mailchimp.png');
$this->registerAdminHooks();
add_action('wp_ajax_fluentform_mailchimp_interest_groups', array($this, 'fetchInterestGroups'));
// add_filter('fluentform_notifying_async_mailchimp', '__return_false');
}
public function getGlobalFields($fields)
{
return [
'logo' => $this->logo,
'menu_title' => __('Mailchimp Settings', 'fluentform'),
'menu_description' => __('Mailchimp is a marketing platform for small businesses. Send beautiful emails, connect your e-commerce store, advertise, and build your brand. Use Fluent Form to collect customer information and automatically add it to your Mailchimp campaign list. If you don\'t have a Mailchimp account, you can sign up for one here.', 'fluentform'),
'valid_message' => __('Your Mailchimp API Key is valid', 'fluentform'),
'invalid_message' => __('Your Mailchimp API Key is not valid', 'fluentform'),
'save_button_text' => __('Save Settings', 'fluentform'),
'fields' => [
'apiKey' => [
'type' => 'text',
'label_tips' => __("Enter your Mailchimp API Key, if you do not have
Please login to your MailChimp account and go to
Profile -> Extras -> Api Keys", 'fluentform'),
'label' => __('Mailchimp API Key', 'fluentform'),
]
],
'hide_on_valid' => true,
'discard_settings' => [
'section_description' => 'Your Mailchimp API integration is up and running',
'button_text' => 'Disconnect Mailchimp',
'data' => [
'apiKey' => ''
],
'show_verify' => true
]
];
}
public function getGlobalSettings($settings)
{
$globalSettings = get_option($this->optionKey);
if (!$globalSettings) {
$globalSettings = [];
}
$defaults = [
'apiKey' => '',
'status' => ''
];
return wp_parse_args($globalSettings, $defaults);
}
public function saveGlobalSettings($mailChimp)
{
if (!$mailChimp['apiKey']) {
$mailChimpSettings = [
'apiKey' => '',
'status' => false
];
// Update the reCaptcha details with siteKey & secretKey.
update_option($this->optionKey, $mailChimpSettings, 'no');
wp_send_json_success([
'message' => __('Your settings has been updated and disconnected', 'fluentform'),
'status' => false
], 200);
}
// Verify API key now
try {
$MailChimp = new MailChimp($mailChimp['apiKey']);
$result = $MailChimp->get('lists');
if (!$MailChimp->success()) {
throw new \Exception($MailChimp->getLastError());
}
} catch (\Exception $exception) {
wp_send_json_error([
'message' => $exception->getMessage()
], 400);
}
// MailChimp key is verified now, Proceed now
$mailChimpSettings = [
'apiKey' => sanitize_text_field($mailChimp['apiKey']),
'status' => true
];
// Update the reCaptcha details with siteKey & secretKey.
update_option($this->optionKey, $mailChimpSettings, 'no`');
wp_send_json_success([
'message' => __('Your mailchimp api key has been verfied and successfully set', 'fluentform'),
'status' => true
], 200);
}
public function pushIntegration($integrations, $formId)
{
$integrations['mailchimp'] = [
'title' => __('Mailchimp Feed', 'fluentform'),
'logo' => $this->logo,
'is_active' => $this->isConfigured(),
'configure_title' => __('Configuration required!', 'fluentform'),
'global_configure_url' => admin_url('admin.php?page=fluent_forms_settings#mailchimp'),
'configure_message' => __('Mailchimp is not configured yet! Please configure your mailchimp api first', 'fluentform'),
'configure_button_text' => __('Set Mailchimp API', 'fluentform')
];
return $integrations;
}
public function getIntegrationDefaults($settings, $formId)
{
$settings = [
'conditionals' => [
'conditions' => [],
'status' => false,
'type' => 'all'
],
'enabled' => true,
'list_id' => '',
'list_name' => '',
'name' => '',
'merge_fields' => (object)[],
'tags' => '',
'markAsVIP' => false,
'fieldEmailAddress' => '',
'doubleOptIn' => false,
'note' => ''
];
return $settings;
}
public function getSettingsFields($settings, $formId)
{
return [
'fields' => [
[
'key' => 'name',
'label' => 'Name',
'required' => true,
'placeholder' => 'Your Feed Name',
'component' => 'text'
],
[
'key' => 'list_id',
'label' => 'Mailchimp List',
'placeholder' => 'Select Mailchimp List',
'tips' => 'Select the Mailchimp list you would like to add your contacts to.',
'component' => 'list_ajax_options',
'options' => $this->getLists(),
],
[
'key' => 'merge_fields',
'require_list' => true,
'label' => 'Map Fields',
'tips' => 'Associate your Mailchimp merge tags to the appropriate Fluent Form fields by selecting the appropriate form field from the list.',
'component' => 'map_fields',
'field_label_remote' => 'Mailchimp Field',
'field_label_local' => 'Form Field',
'primary_fileds' => [
[
'key' => 'fieldEmailAddress',
'label' => 'Email Address',
'required' => true,
'input_options' => 'emails'
]
]
],
[
'key' => 'interest_group',
'require_list' => true,
'label' => 'Interest Group',
'tips' => 'You can map your mailchimp interest group for this contact',
'component' => 'chained_fields',
'sub_type' => 'radio',
'category_label' => 'Select Interest Category',
'subcategory_label' => 'Select Interest',
'remote_url' => admin_url('admin-ajax.php?action=fluentform_mailchimp_interest_groups'),
'inline_tip' => 'Select the mailchimp interest category and interest'
],
[
'key' => 'tags',
'require_list' => true,
'label' => 'Tags',
'tips' => 'Associate tags to your Mailchimp contacts with a comma separated list (e.g. new lead, FluentForms, web source). Commas within a merge tag value will be created as a single tag.',
'component' => 'value_text',
'inline_tip' => 'Please provide each tag by comma separated value'
],
[
'key' => 'note',
'require_list' => true,
'label' => 'Note',
'tips' => 'You can write a note for this contact',
'component' => 'value_textarea'
],
[
'key' => 'doubleOptIn',
'require_list' => true,
'label' => 'Double Opt-in',
'tips' => 'When the double opt-in option is enabled,
Mailchimp will send a confirmation email
to the user and will only add them to your
'checkbox-single',
'checkbox_label' => 'Enable Double Opt-in'
],
[
'key' => 'markAsVIP',
'require_list' => true,
'label' => 'VIP',
'tips' => 'When enabled,
This contact will be marked as VIP.',
'component' => 'checkbox-single',
'checkbox_label' => 'Mark as VIP Contact'
],
[
'require_list' => true,
'key' => 'conditionals',
'label' => 'Conditional Logics',
'tips' => 'Allow mailchimp integration conditionally based on your submission values',
'component' => 'conditional_block'
],
[
'require_list' => true,
'key' => 'enabled',
'label' => 'Status',
'component' => 'checkbox-single',
'checkbox_label' => 'Enable This feed'
]
],
'button_require_list' => true,
'integration_title' => 'Mailchimp'
];
}
public function setFeedAtributes($feed, $formId)
{
$feed['provider'] = 'mailchimp';
$feed['provider_logo'] = $this->logo;
return $feed;
}
public function prepareIntegrationFeed($setting, $feed, $formId)
{
$defaults = $this->getIntegrationDefaults([], $formId);
foreach ($setting as $settingKey => $settingValue) {
if ($settingValue == 'true') {
$setting[$settingKey] = true;
} else if ($settingValue == 'false') {
$setting[$settingKey] = false;
} else if ($settingKey == 'conditionals') {
if ($settingValue['status'] == 'true') {
$settingValue['status'] = true;
} else if ($settingValue['status'] == 'false') {
$settingValue['status'] = false;
}
$setting['conditionals'] = $settingValue;
}
}
if (!empty($setting['list_id'])) {
$setting['list_id'] = (string)$setting['list_id'];
}
$settings['markAsVIP'] = ArrayHelper::isTrue($setting, 'markAsVIP');
$settings['doubleOptIn'] = ArrayHelper::isTrue($setting, 'doubleOptIn');
return wp_parse_args($setting, $defaults);
}
private function getLists()
{
$settings = get_option('_fluentform_mailchimp_details');
try {
$MailChimp = new MailChimp($settings['apiKey']);
$lists = $MailChimp->get('lists', array('count' => 9999));
if (!$MailChimp->success()) {
return [];
}
} catch (\Exception $exception) {
return [];
}
$formattedLists = [];
foreach ($lists['lists'] as $list) {
$formattedLists[$list['id']] = $list['name'];
}
return $formattedLists;
}
public function getMergeFields($list, $listId, $formId)
{
if (!$this->isConfigured()) {
return false;
}
$settings = get_option('_fluentform_mailchimp_details');
try {
$MailChimp = new MailChimp($settings['apiKey']);
$list = $MailChimp->get('lists/' . $listId . '/merge-fields', array('count' => 9999));
if (!$MailChimp->success()) {
return false;
}
} catch (\Exception $exception) {
return false;
}
$mergedFields = $list['merge_fields'];
$fields = array();
foreach ($mergedFields as $merged_field) {
$fields[$merged_field['tag']] = $merged_field['name'];
}
return $fields;
}
public function fetchInterestGroups()
{
$settings = $_REQUEST['settings'];
$listId = ArrayHelper::get($settings, 'list_id');
if(!$listId) {
wp_send_json_success([
'categories' => [],
'subcategories' => [],
'reset_values' => true
]);
}
$categoryId = ArrayHelper::get($settings, 'interest_group.category');
$categories = $this->getInterestCategories($listId);
$subCategories = [];
if($categoryId) {
$subCategories = $this->getInterestSubCategories($listId, $categoryId);
}
wp_send_json_success([
'categories' => $categories,
'subcategories' => $subCategories,
'reset_values' => !$categories && !$subCategories
]);
}
private function getInterestCategories($listId)
{
$settings = get_option('_fluentform_mailchimp_details');
try {
$MailChimp = new MailChimp($settings['apiKey']);
$categories = $MailChimp->get('/lists/'.$listId.'/interest-categories', array(
'count' => 9999,
'fields' => 'categories.id,categories.title'
));
if (!$MailChimp->success()) {
return [];
}
} catch (\Exception $exception) {
return [];
}
$categories = ArrayHelper::get($categories, 'categories', []);
$formattedLists = [];
foreach ($categories as $list) {
$formattedLists[] = [
'value' => $list['id'],
'label' => $list['title']
];
}
return $formattedLists;
}
private function getInterestSubCategories($listId, $categoryId)
{
$settings = get_option('_fluentform_mailchimp_details');
try {
$MailChimp = new MailChimp($settings['apiKey']);
$categories = $MailChimp->get('/lists/'.$listId.'/interest-categories/'.$categoryId.'/interests', array(
'count' => 9999,
'fields' => 'interests.id,interests.name'
));
if (!$MailChimp->success()) {
return [];
}
} catch (\Exception $exception) {
return [];
}
$categories = ArrayHelper::get($categories, 'interests', []);
$formattedLists = [];
foreach ($categories as $list) {
$formattedLists[] = [
'value' => $list['id'],
'label' => $list['name']
];
}
return $formattedLists;
}
/*
* For Handling Notifications broadcast
*/
public function notify($feed, $formData, $entry, $form)
{
$response = $this->subscribe($feed, $formData, $entry, $form);
if ($response == true) {
do_action('ff_integration_action_result', $feed, 'success', 'MailChimp feed has been successfully initialed and pushed data');
} else {
$message = 'Mailchimp feed has been failed to deliver feed';
if (is_wp_error($response)) {
$message = $response->get_error_message();
}
do_action('ff_integration_action_result', $feed, 'failed', $message);
}
}
}