• File: wpr-subscribe-mailchimp.php
  • Full Path: /home/bravrvjk/hpgt.org/wp-content/plugins/royal-elementor-addons/classes/modules/forms/wpr-subscribe-mailchimp.php
  • Date Modified: 04/10/2026 2:58 PM
  • File size: 5.05 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
namespace WprAddons\Classes\Modules\Forms;

use Elementor\Utils;
use Elementor\Group_Control_Image_Size;
use WprAddons\Classes\Utilities;


if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}
/**
 * WPR_Subscribe_Mailchimp setup
 *
 * @since 3.4.6
 */

 class WPR_Subscribe_Mailchimp {

    public function __construct() {
        // For form builder
        add_action( 'wp_ajax_wpr_form_builder_mailchimp', [$this, 'wpr_form_builder_mailchimp'] );
        add_action( 'wp_ajax_nopriv_wpr_form_builder_mailchimp', [$this, 'wpr_form_builder_mailchimp'] );
    }

	/**
	** Mailchimp AJAX Subscribe
	*/
	public static function wpr_form_builder_mailchimp() {

        $nonce = $_POST['nonce'];

        if ( !wp_verify_nonce( $nonce, 'wpr-addons-js' ) ) {
            return; // Get out of here, the nonce is rotten!
        }
		
		// API Key
        $api_key = get_option('wpr_mailchimp_api_key') ? get_option('wpr_mailchimp_api_key') : '';
        
        // Validate API key format
        if (!preg_match('/^[0-9a-f]{32}-[a-z]{2}[0-9]{1,2}$/', $api_key)) {
            wp_send_json_error('Invalid API key format');
            return;
        }

        $api_parts = explode('-', $api_key);
        if (count($api_parts) !== 2) {
            wp_send_json_error('Invalid API key format');
            return;
        }

        // Validate datacenter suffix
        $api_key_suffix = $api_parts[1];
        if (!preg_match('/^[a-z]{2}[0-9]{1,2}$/', $api_key_suffix)) {
            wp_send_json_error('Invalid API datacenter');
            return;
        }

        // List ID with sanitization
        $list_id = isset($_POST['listId']) ? sanitize_text_field(wp_unslash($_POST['listId'])) : '';

        // Get Available Fields (PHPCS - fields are sanitized later on input)
        $fields = isset($_POST['form_data']) ? $_POST['form_data'] : []; // phpcs:ignore

        $group_ids = isset($fields['group_id']) ? array_map('sanitize_text_field', array_map('trim', explode(',', wp_unslash($fields['group_id'])))) : [];

        // Merge Additional Fields
        $merge_fields = [
            'FNAME' => !empty( $fields['first_name_field'] ) ? sanitize_text_field($fields['first_name_field']) : '',
            'LNAME' => !empty( $fields['last_name_field'] ) ? sanitize_text_field($fields['last_name_field']) : '',
			'PHONE' => !empty ( $fields['phone_field'] ) ? sanitize_text_field($fields['phone_field']) : '',
			'BIRTHDAY' => !empty ( $fields['birthday_field'] ) ? sanitize_text_field($fields['birthday_field']) : '',
		];

		$requiredKeys = ['address_field', 'country_field', 'city_field', 'state_field', 'zip_field'];
		
		if ( !empty(array_intersect_key($fields, array_flip($requiredKeys))) ) {
			$merge_fields = array_merge($merge_fields, [
				'ADDRESS' => [
					'addr1' => !empty ( $fields['address_field'] ) ? sanitize_text_field($fields['address_field']) : 'none',
					'country' =>  !empty ( $fields['country_field'] ) ? sanitize_text_field($fields['country_field']) : 'none',
					'city' => !empty ( $fields['city_field'] ) ? sanitize_text_field($fields['city_field']) : 'none',
					'state' => !empty ( $fields['state_field'] ) ? sanitize_text_field($fields['state_field']) : 'none',
					'zip' =>!empty ( $fields['zip_field'] ) ? sanitize_text_field($fields['zip_field']) : 'none',
				]
			]);
		}

        // API URL
        $api_url = 'https://'. $api_key_suffix .'.api.mailchimp.com/3.0/lists/'. $list_id .'/members/'. md5(strtolower(sanitize_text_field($fields['email_field'])));
		
		$api_body = [
			'email_address' => sanitize_text_field($fields[ 'email_field' ]),
			'status' => 'subscribed',
			'merge_fields' => $merge_fields
		];
			
		if ( !empty($group_ids) ) {
			$api_body['interests'] = self::group_ids_to_interests_array($group_ids);
		}

        // API Args
        $api_args = [
			'method' => 'PUT',
			'headers' => [
				'Content-Type' => 'application/json',
				'Authorization' => 'apikey '. $api_key,
			],
			'body' => json_encode($api_body),
        ];

        // Send Request
        $request = wp_remote_post( $api_url, $api_args );

		if ( ! is_wp_error($request) ) {
			$request = json_decode( wp_remote_retrieve_body($request) );

			// Set Status
			if ( ! empty($request) ) {
				if ($request->status == 'subscribed') {

					wp_send_json_success(array(
						'action' => 'wpr_form_builder_mailchimp',
						'status' => 'success',
						'message' => 'Mailchimp subscription was successful',
						'request' => $request
					));

				} else {
					wp_send_json_error([ 
						'action' => 'wpr_form_builder_mailchimp',
						'status' => 'error',
						'message' => 'Mailchimp subscription failed',
						'request' => $request
					]);
				}
			}
		} else {

			wp_send_json_error([ 
				'action' => 'wpr_form_builder_mailchimp',
				'status' => 'error',
				'message' => 'Mailchimp subscription failed',
				'request' => $request
			]);
		}
	}

	public static function group_ids_to_interests_array($group_ids) {
		$interests_array = [];
		
		foreach ($group_ids as $group_id) {
			$interests_array[$group_id] = true;
		}
	
		return $interests_array;
	}
	
 }

 new WPR_Subscribe_Mailchimp();