示例#1
0
 /**
  * Process a subscribe form.
  *
  * @param MC4WP_Form $form
  * @param MC4WP_Request $request
  */
 public function process_subscribe_form(MC4WP_Form $form, MC4WP_Request $request)
 {
     $result = false;
     $mailchimp = new MC4WP_MailChimp();
     $email_type = $form->get_email_type();
     $data = $form->get_data();
     $client_ip = $request->get_client_ip();
     /** @var MC4WP_MailChimp_Subscriber $subscriber */
     $subscriber = null;
     /**
      * @ignore
      * @deprecated 4.0
      */
     $data = apply_filters('mc4wp_merge_vars', $data);
     /**
      * @ignore
      * @deprecated 4.0
      */
     $data = (array) apply_filters('mc4wp_form_merge_vars', $data, $form);
     // create a map of all lists with list-specific data
     $mapper = new MC4WP_List_Data_Mapper($data, $form->get_lists());
     /** @var MC4WP_MailChimp_Subscriber[] $map */
     $map = $mapper->map();
     // loop through lists
     foreach ($map as $list_id => $subscriber) {
         $subscriber->status = $form->settings['double_optin'] ? 'pending' : 'subscribed';
         $subscriber->email_type = $email_type;
         $subscriber->ip_signup = $client_ip;
         /**
          * Filters subscriber data before it is sent to MailChimp. Fires for both form & integration requests.
          *
          * @param MC4WP_MailChimp_Subscriber $subscriber
          */
         $subscriber = apply_filters('mc4wp_subscriber_data', $subscriber);
         /**
          * Filters subscriber data before it is sent to MailChimp. Only fires for form requests.
          *
          * @param MC4WP_MailChimp_Subscriber $subscriber
          */
         $subscriber = apply_filters('mc4wp_form_subscriber_data', $subscriber);
         // send a subscribe request to MailChimp for each list
         $result = $mailchimp->list_subscribe($list_id, $subscriber->email_address, $subscriber->to_array(), $form->settings['update_existing'], $form->settings['replace_interests']);
     }
     $log = $this->get_log();
     // do stuff on failure
     if (!is_object($result) || empty($result->id)) {
         $error_code = $mailchimp->get_error_code();
         $error_message = $mailchimp->get_error_message();
         if ($mailchimp->get_error_code() == 214) {
             $form->add_error('already_subscribed');
             $log->warning(sprintf("Form %d > %s is already subscribed to the selected list(s)", $form->ID, $data['EMAIL']));
         } else {
             $form->add_error('error');
             $log->error(sprintf('Form %d > MailChimp API error: %s %s', $form->ID, $error_code, $error_message));
             /**
              * Fire action hook so API errors can be hooked into.
              *
              * @param MC4WP_Form $form
              * @param string $error_message
              */
             do_action('mc4wp_form_api_error', $form, $error_message);
         }
         // bail
         return;
     }
     // Success! Did we update or newly subscribe?
     if ($result->status === 'subscribed' && $result->was_already_on_list) {
         $form->add_message('updated');
     } else {
         $form->add_message('subscribed');
     }
     $log->info(sprintf("Form %d > Successfully subscribed %s", $form->ID, $data['EMAIL']));
     /**
      * Fires right after a form was used to subscribe.
      *
      * @since 3.0
      *
      * @param MC4WP_Form $form Instance of the submitted form
      * @param string $email
      * @param array $data
      * @param MC4WP_MailChimp_Subscriber[] $subscriber
      */
     do_action('mc4wp_form_subscribed', $form, $subscriber->email_address, $data, $map);
 }
 /**
  * Makes a subscription request
  *
  * @param array $data
  * @param int $related_object_id
  *
  * @return boolean
  */
 protected function subscribe(array $data, $related_object_id = 0)
 {
     $integration = $this;
     $slug = $this->slug;
     $mailchimp = new MC4WP_MailChimp();
     $log = $this->get_log();
     $request = $this->get_request();
     $list_ids = $this->get_lists();
     /** @var MC4WP_MailChimp_Subscriber $subscriber */
     $subscriber = null;
     $result = false;
     // validate lists
     if (empty($list_ids)) {
         $log->warning(sprintf('%s > No MailChimp lists were selected', $this->name));
         return false;
     }
     /**
      * Filters data for integration requests.
      *
      * @param array $data
      */
     $data = apply_filters('mc4wp_integration_data', $data);
     /**
      * Filters data for a specific integration request.
      *
      * The dynamic portion of the hook, `$slug`, refers to the integration slug.
      *
      * @param array $data
      * @param int $related_object_id
      */
     $data = apply_filters("mc4wp_integration_{$slug}_data", $data, $related_object_id);
     /**
      * @ignore
      * @deprecated 4.0
      */
     $data = apply_filters('mc4wp_merge_vars', $data);
     /**
      * @deprecated 4.0
      * @ignore
      */
     $data = apply_filters('mc4wp_integration_merge_vars', $data, $integration);
     /**
      * @deprecated 4.0
      * @ignore
      */
     $data = apply_filters("mc4wp_integration_{$slug}_merge_vars", $data, $integration);
     $email_type = mc4wp_get_email_type();
     $mapper = new MC4WP_List_Data_Mapper($data, $list_ids);
     /** @var MC4WP_MailChimp_Subscriber[] $map */
     $map = $mapper->map();
     foreach ($map as $list_id => $subscriber) {
         $subscriber->status = $this->options['double_optin'] ? 'pending' : 'subscribed';
         $subscriber->email_type = $email_type;
         $subscriber->ip_signup = $request->get_client_ip();
         /** @ignore (documented elsewhere) */
         $subscriber = apply_filters('mc4wp_subscriber_data', $subscriber);
         /**
          * Filters subscriber data before it is sent to MailChimp. Only fires for integration requests.
          *
          * @param MC4WP_MailChimp_Subscriber $subscriber
          */
         $subscriber = apply_filters('mc4wp_integration_subscriber_data', $subscriber);
         /**
          * Filters subscriber data before it is sent to MailChimp. Only fires for integration requests.
          *
          * The dynamic portion of the hook, `$slug`, refers to the integration slug.
          *
          * @param MC4WP_MailChimp_Subscriber $subscriber
          * @param int $related_object_id
          */
         $subscriber = apply_filters("mc4wp_integration_{$slug}_subscriber_data", $subscriber, $related_object_id);
         $result = $mailchimp->list_subscribe($list_id, $subscriber->email_address, $subscriber->to_array(), $this->options['update_existing'], $this->options['replace_interests']);
     }
     // if result failed, show error message
     if (!$result) {
         // log error
         if ($mailchimp->get_error_code() == 214) {
             $log->warning(sprintf("%s > %s is already subscribed to the selected list(s)", $this->name, $subscriber->email_address));
         } else {
             $log->error(sprintf('%s > MailChimp API Error: %s', $this->name, $mailchimp->get_error_message()));
         }
         // bail
         return false;
     }
     $log->info(sprintf('%s > Successfully subscribed %s', $this->name, $subscriber->email_address));
     /**
      * Runs right after someone is subscribed using an integration
      *
      * @since 3.0
      *
      * @param MC4WP_Integration $integration
      * @param string $email_address
      * @param array $merge_vars
      * @param MC4WP_MailChimp_Subscriber[] $subscriber_data
      * @param int $related_object_id
      */
     do_action('mc4wp_integration_subscribed', $integration, $subscriber->email_address, $subscriber->merge_fields, $map, $related_object_id);
     return $result;
 }