'mailchimpSF_options'), admin_url('options-general.php')); $settings_link = ''.__('Settings', 'mailchimp_i18n' ).''; array_unshift($links, $settings_link); return $links; } add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'mailchimpSD_plugin_action_links', 10, 1); /** * Loads the appropriate JS and CSS resources depending on * settings and context (admin or not) * * @return void */ function mailchimpSF_load_resources() { // JS if (get_option('mc_use_javascript') == 'on') { if (!is_admin()) { wp_enqueue_script('jquery_scrollto', MCSF_URL.'js/scrollTo.js', array('jquery'), MCSF_VER); wp_enqueue_script('mailchimpSF_main_js', MCSF_URL.'js/mailchimp.js', array('jquery', 'jquery-form'), MCSF_VER); // some javascript to get ajax version submitting to the proper location global $wp_scripts; $wp_scripts->localize('mailchimpSF_main_js', 'mailchimpSF', array( 'ajax_url' => trailingslashit(home_url()), )); } } if (get_option('mc_use_datepicker') == 'on' && !is_admin()) { // Datepicker theme wp_enqueue_style('flick', MCSF_URL.'/css/flick/flick.css'); // Datepicker JS wp_enqueue_script('datepicker', MCSF_URL.'/js/datepicker.js', array('jquery','jquery-ui-core')); } if(get_option('mc_nuke_all_styles') !== true) { wp_enqueue_style('mailchimpSF_main_css', home_url('?mcsf_action=main_css&ver='.MCSF_VER, 'relative')); wp_enqueue_style('mailchimpSF_ie_css', MCSF_URL.'css/ie.css'); global $wp_styles; $wp_styles->add_data( 'mailchimpSF_ie_css', 'conditional', 'IE' ); } } /** * Loads resources for the MailChimp admin page * * @return void */ function mc_admin_page_load_resources() { wp_enqueue_style('mailchimpSF_admin_css', MCSF_URL.'css/admin.css'); wp_enqueue_script('mailchimpSF_admin_js', MCSF_URL.'js/admin.js'); } add_action('load-settings_page_mailchimpSF_options', 'mc_admin_page_load_resources'); /** * Loads jQuery Datepicker for the date-pick class **/ function mc_datepicker_load() { require_once(MCSF_DIR . '/views/datepicker.php'); } if (get_option('mc_use_datepicker') == 'on' && !is_admin()) { add_action('wp_head', 'mc_datepicker_load'); } /** * Handles requests that as light-weight a load as possible. * typically, JS or CSS **/ function mailchimpSF_early_request_handler() { if (isset($_GET['mcsf_action'])) { switch ($_GET['mcsf_action']) { case 'main_css': header("Content-type: text/css"); mailchimpSF_main_css(); exit; } } } add_action('init', 'mailchimpSF_early_request_handler', 0); /** * Outputs the front-end CSS. This checks several options, so it * was best to put it in a Request-handled script, as opposed to * a static file. */ function mailchimpSF_main_css() { require_once(MCSF_DIR . '/views/css/frontend.php'); } /** * Add our settings page to the admin menu * * @return void */ function mailchimpSF_add_pages(){ // Add settings page for users who can edit plugins add_options_page( __( 'MailChimp Setup', 'mailchimp_i18n' ), __( 'MailChimp Setup', 'mailchimp_i18n' ), MCSF_CAP_THRESHOLD, 'mailchimpSF_options', 'mailchimpSF_setup_page'); } add_action('admin_menu', 'mailchimpSF_add_pages'); function mailchimpSF_request_handler() { if (isset($_POST['mcsf_action'])) { switch ($_POST['mcsf_action']) { case 'login': $key = trim($_POST['mailchimpSF_api_key']); try { $api = new MailChimp_API($key); } catch (Exception $e) { $msg = "" . $e->getMessage() . ""; mailchimpSF_global_msg($msg); break; } $key = mailchimpSF_verify_key($api); if(is_wp_error($key)) { $msg = "" . $key->get_error_message() . ""; mailchimpSF_global_msg($msg); } break; case 'logout': // Check capability & Verify nonce if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'mc_logout')) { wp_die('Cheatin’ huh?'); } // erase auth information $options = array('mc_api_key', 'mc_sopresto_user', 'mc_sopresto_public_key', 'mc_sopresto_secret_key'); mailchimpSF_delete_options($options); break; case 'change_form_settings': if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_general_form_settings')) { wp_die('Cheatin’ huh?'); } // Update the form settings mailchimpSF_save_general_form_settings(); break; case 'mc_submit_signup_form': // Validate nonce if (!wp_verify_nonce($_POST['_mc_submit_signup_form_nonce'], 'mc_submit_signup_form')) { wp_die('Cheatin’ huh?'); } // Attempt the signup mailchimpSF_signup_submit(); // Do a different action for html vs. js switch ($_POST['mc_submit_type']) { case 'html': /* Allow to fall through. The widget will pick up the * global message left over from the signup_submit function */ break; case 'js': if (!headers_sent()){ //just in case... header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT', true, 200); } echo mailchimpSF_global_msg(); // Don't esc_html this, b/c we've already escaped it exit; } } } } add_action('init', 'mailchimpSF_request_handler'); function mailchimpSF_migrate_sopresto() { $sopresto = get_option('mc_sopresto_secret_key'); if(!$sopresto) { return; } // Talk to Sopresto, make exchange, delete old sopresto things. $body = array( 'public_key' => get_option('mc_sopresto_public_key'), 'hash' => sha1(get_option('mc_sopresto_public_key').get_option('mc_sopresto_secret_key')) ); $url = 'https://sopresto.socialize-this.com/mailchimp/exchange'; $args = array( 'method' => 'POST', 'timeout' => 500, 'redirection' => 5, 'httpversion' => '1.0', 'user-agent' => 'MailChimp WordPress Plugin/' . get_bloginfo( 'url' ), 'body' => $body ); //post to sopresto $key = wp_remote_post($url, $args); if(!is_wp_error($key) && $key['response']['code'] == 200) { $key = json_decode($key['body']); try { $api = new MailChimp_API($key->response); } catch (Exception $e) { $msg = "" . $e->getMessage() . ""; mailchimpSF_global_msg($msg); return; } $verify = mailchimpSF_verify_key($api); //something went wrong with the key that we had if(is_wp_error($verify)) { return; } delete_option('mc_sopresto_public_key'); delete_option('mc_sopresto_secret_key'); delete_option('mc_sopresto_user'); return; } // Nothing to do here. return; } function mailchimpSF_auth_nonce_key($salt = null) { if (is_null($salt)) { $salt = mailchimpSF_auth_nonce_salt(); } return 'social_authentication' . md5( AUTH_KEY . $salt ); } function mailchimpSF_auth_nonce_salt() { return md5(microtime().$_SERVER['SERVER_ADDR']); } /** * Creates new MailChimp API v3 object * * @return MailChimp_API | false */ function mailchimpSF_get_api($force = false) { $key = get_option('mc_api_key'); if($key) { return new MailChimp_API($key); } return false; } /** * Checks to see if we're storing a password, if so, we need * to upgrade to the API key * * @return bool **/ function mailchimpSF_needs_upgrade() { $igs = get_option('mc_interest_groups'); if ($igs !== false // we have an option && ( empty($igs) || // it can be an empty array (no interest groups) (is_array($igs) && isset($igs[0]['id'])) // OR it should be a populated array that's well-formed )) { return false; // no need to upgrade } else { return true; // yeah, let's do it } } /** * Deletes all mailchimp options **/ function mailchimpSF_delete_setup() { $options = array('mc_user_id', 'mc_sopresto_user', 'mc_sopresto_public_key', 'mc_sopresto_secret_key', 'mc_rewards', 'mc_use_javascript', 'mc_use_datepicker', 'mc_use_unsub_link', 'mc_list_id', 'mc_list_name', 'mc_interest_groups', 'mc_merge_vars'); $igs = get_option('mc_interest_groups'); if (is_array($igs)) { foreach ($igs as $ig) { $opt = 'mc_show_interest_groups_'.$ig['id']; $options[] = $opt; } } $mv = get_option('mc_merge_vars'); if (is_array($mv)){ foreach($mv as $var){ $opt = 'mc_mv_'.$var['tag']; $options[] = $opt; } } mailchimpSF_delete_options($options); } /** * Gets or sets a global message based on parameter passed to it * * @return string/bool depending on get/set **/ function mailchimpSF_global_msg($msg = null) { global $mcsf_msgs; // Make sure we're formed properly if (!is_array($mcsf_msgs)) { $mcsf_msgs = array(); } // See if we're getting if (is_null($msg)) { return implode('', $mcsf_msgs); } // Must be setting $mcsf_msgs[] = $msg; return true; } /** * Sets the default options for the option form **/ function mailchimpSF_set_form_defaults($list_name = '') { update_option('mc_header_content',__( 'Sign up for', 'mailchimp_i18n' ).' '.$list_name); update_option('mc_submit_text',__( 'Subscribe', 'mailchimp_i18n' )); update_option('mc_use_datepicker', 'on'); update_option('mc_custom_style','off'); update_option('mc_use_javascript','on'); update_option('mc_double_optin', true); update_option('mc_use_unsub_link','off'); update_option('mc_header_border_width','1'); update_option('mc_header_border_color','E3E3E3'); update_option('mc_header_background','FFFFFF'); update_option('mc_header_text_color','CC6600'); update_option('mc_form_border_width','1'); update_option('mc_form_border_color','E0E0E0'); update_option('mc_form_background','FFFFFF'); update_option('mc_form_text_color','3F3F3f'); } /** * Saves the General Form settings on the options page * * @return void **/ function mailchimpSF_save_general_form_settings() { // IF NOT DEV MODE if (isset($_POST['mc_rewards'])){ update_option('mc_rewards', 'on'); $msg = '

'.__('Monkey Rewards turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } else if (get_option('mc_rewards')!='off') { update_option('mc_rewards', 'off'); $msg = '

'.__('Monkey Rewards turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } if (isset($_POST['mc_use_javascript'])){ update_option('mc_use_javascript', 'on'); $msg = '

'.__('Fancy Javascript submission turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } else if (get_option('mc_use_javascript')!='off') { update_option('mc_use_javascript', 'off'); $msg = '

'.__('Fancy Javascript submission turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } if (isset($_POST['mc_use_datepicker'])){ update_option('mc_use_datepicker', 'on'); $msg = '

'.__('Datepicker turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } else if (get_option('mc_use_datepicker')!='off') { update_option('mc_use_datepicker', 'off'); $msg = '

'.__('Datepicker turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } /*Enable double optin toggle*/ if(isset($_POST['mc_double_optin'])) { update_option('mc_double_optin', true); $msg = '

'.__('Double opt-in turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } else if (get_option('mc_double_optin') != false) { update_option('mc_double_optin', false); $msg = '

'.__('Double opt-in turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } /* NUKE the CSS! */ if(isset($_POST['mc_nuke_all_styles'])) { update_option('mc_nuke_all_styles', true); $msg = '

'.__('MailChimp CSS turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); }elseif (get_option('mc_nuke_all_styles') !== false) { update_option('mc_nuke_all_styles', false); $msg = '

'.__('MailChimp CSS turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } if (isset($_POST['mc_use_unsub_link'])){ update_option('mc_use_unsub_link', 'on'); $msg = '

'.__('Unsubscribe link turned On!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } elseif (get_option('mc_use_unsub_link')!='off') { update_option('mc_use_unsub_link', 'off'); $msg = '

'.__('Unsubscribe link turned Off!', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } $content = stripslashes($_POST['mc_header_content']); $content = str_replace("\r\n","
", $content); update_option('mc_header_content', $content ); $content = stripslashes($_POST['mc_subheader_content']); $content = str_replace("\r\n","
", $content); update_option('mc_subheader_content', $content ); $submit_text = stripslashes($_POST['mc_submit_text']); $submit_text = str_replace("\r\n","", $submit_text); update_option('mc_submit_text', $submit_text); // Set Custom Style option update_option('mc_custom_style', isset($_POST['mc_custom_style']) ? 'on' : 'off'); //we told them not to put these things we are replacing in, but let's just make sure they are listening... if(isset($_POST['mc_form_border_width'])) { update_option('mc_form_border_width',str_replace('px', '', $_POST['mc_form_border_width']) ); } if(isset($_POST['mc_form_border_color'])) { update_option('mc_form_border_color', str_replace('#', '', $_POST['mc_form_border_color'])); } if(isset($_POST['mc_form_background'])){ update_option('mc_form_background',str_replace('#', '', $_POST['mc_form_background'])); } if(isset($_POST['mc_form_text_color'])) { update_option('mc_form_text_color', str_replace('#', '', $_POST['mc_form_text_color'])); } // IF NOT DEV MODE $igs = get_option('mc_interest_groups'); if (is_array($igs)) { foreach($igs as $var){ $opt = 'mc_show_interest_groups_'.$var['id']; if (isset($_POST[$opt])){ update_option($opt,'on'); } else { update_option($opt,'off'); } } } $mv = get_option('mc_merge_vars'); if (is_array($mv)) { foreach($mv as $var){ $opt = 'mc_mv_'.$var['tag']; if (isset($_POST[$opt]) || $var['required']=='Y'){ update_option($opt,'on'); } else { update_option($opt,'off'); } } } $msg = '

'.esc_html(__('Successfully Updated your List Subscribe Form Settings!', 'mailchimp_i18n')).'

'; mailchimpSF_global_msg($msg); } /** * Sees if the user changed the list, and updates options accordingly **/ function mailchimpSF_change_list_if_necessary() { // Simple permission check before going through all this if (!current_user_can(MCSF_CAP_THRESHOLD)) { return; } $api = mailchimpSF_get_api(); if (!$api) { return; } //we *could* support paging, but few users have that many lists (and shouldn't) $lists = $api->get('lists',100); $lists = $lists['lists']; if (is_array($lists) && !empty($lists) && isset($_POST['mc_list_id'])) { /* If our incoming list ID (the one chosen in the select dropdown) is in our array of lists, the set it to be the active list */ foreach($lists as $key => $list) { if ($list['id'] == $_POST['mc_list_id']) { $list_id = $_POST['mc_list_id']; $list_name = $list['name']; $list_key = $key; } } $orig_list = get_option('mc_list_id'); if ($list_id != '') { update_option('mc_list_id', $list_id); update_option('mc_list_name', $list_name); update_option('mc_email_type_option', $lists[$list_key]['email_type_option']); // See if the user changed the list $new_list = false; if ($orig_list != $list_id){ // The user changed the list, Reset the Form Defaults mailchimpSF_set_form_defaults($list_name); $new_list = true; } // email_type_option // Grab the merge vars and interest groups $mv = mailchimpSF_get_merge_vars($list_id, $new_list); $igs = mailchimpSF_get_interest_categories($list_id, $new_list); $igs_text = ' '; if (is_array($igs)) { $igs_text .= sprintf(__('and %s Sets of Interest Groups', 'mailchimp_i18n'), count($igs)); } $msg = '

'. sprintf( __('Success! Loaded and saved the info for %d Merge Variables', 'mailchimp_i18n').$igs_text, count($mv) ).' '. __('from your list').' "'.$list_name.'"

'. __('Now you should either Turn On the MailChimp Widget or change your options below, then turn it on.', 'mailchimp_i18n').'

'; mailchimpSF_global_msg($msg); } } } function mailchimpSF_get_merge_vars($list_id, $new_list) { $api = mailchimpSF_get_api(); $mv = $api->get('lists/' . $list_id . '/merge-fields', 80); $mv['merge_fields'] = mailchimpSF_add_email_field($mv['merge_fields']); update_option('mc_merge_vars', $mv['merge_fields']); foreach($mv['merge_fields'] as $var){ $opt = 'mc_mv_'.$var['tag']; //turn them all on by default if ($new_list) { update_option($opt, 'on' ); } } return $mv['merge_fields']; } function mailchimpSF_add_email_field($merge) { $email = array( 'tag' => 'EMAIL', 'name' => __('Email Address', 'mailchimp_i18n'), 'type' => 'email', 'required' => true, 'public' => true, 'display_order' => 1, 'default_value' => null ); array_unshift($merge, $email); return $merge; } function mailchimpSF_get_interest_categories($list_id, $new_list) { $api = mailchimpSF_get_api(); $igs = $api->get('lists/' . $list_id . '/interest-categories', 60); if (is_array($igs)) { $key = 0; foreach($igs['categories'] as $ig) { $groups = $api->get('lists/' . $list_id . '/interest-categories/' . $ig['id'] . '/interests', 60); $igs['categories'][$key]['groups'] = $groups['interests']; $opt = 'mc_show_interest_groups_'.$ig['id']; //turn them all on by default if ($new_list) { update_option($opt, 'on' ); } $key++; } } update_option('mc_interest_groups', $igs['categories']); return $igs['categories']; } /** * Outputs the Settings/Options page */ function mailchimpSF_setup_page() { $path = plugin_dir_path(__FILE__); wp_enqueue_script('showMe', MCSF_URL.'js/hidecss.js', array('jquery'), MCSF_VER); require_once($path.'/views/setup_page.php'); }//mailchimpSF_setup_page() function mailchimpSF_register_widgets() { if (mailchimpSF_get_api()) { register_widget('mailchimpSF_Widget'); } } add_action('widgets_init', 'mailchimpSF_register_widgets'); function mailchimpSF_shortcode($atts){ ob_start(); mailchimpSF_signup_form(); return ob_get_clean(); } add_shortcode('mailchimpsf_form', 'mailchimpSF_shortcode'); /** * Attempts to signup a user, per the $_POST args. * * This sets a global message, that is then used in the widget * output to retrieve and display that message. * * @return bool */ function mailchimpSF_signup_submit() { $mv = get_option('mc_merge_vars', array()); $mv_tag_keys = array(); $igs = get_option('mc_interest_groups', array()); $listId = get_option('mc_list_id'); $email = isset($_POST['mc_mv_EMAIL']) ? strip_tags(stripslashes($_POST['mc_mv_EMAIL'])) : ''; $merge = $errs = $html_errs = array(); // Set up some vars $merge = mailchimpSF_merge_submit($mv); //Catch errors and fail early. if(is_wp_error($merge)) { $msg = "" . $merge->get_error_message() . ""; mailchimpSF_global_msg($msg); return false; } // Head back to the beginning of the merge vars array reset($mv); // Ensure we have an array $igs = !is_array($igs) ? array() : $igs; $igs = mailchimpSF_groups_submit($igs); // Clear out empty merge vars $merge = mailchimpSF_merge_remove_empty($merge); if (isset($_POST['email_type']) && in_array($_POST['email_type'], array('text', 'html', 'mobile'))) { $email_type = $_POST['email_type']; } else { $email_type = 'html'; } $api = mailchimpSF_get_api(); if (!$api) { $url = mailchimpSF_signup_form_url(); $error = ''. __('We encountered a problem adding ' . $email . ' to the list. Please sign up here.') . ''; mailchimpSF_global_msg($error); return false; } $url = 'lists/'. $listId . '/members/' . md5(strtolower($email)); $status = mailchimpSF_check_status($url); $body = mailchimpSF_subscribe_body($merge, $igs, $email_type, $email, $status, get_option('mc_double_optin')); $retval = $api->post($url, $body, 'PUT'); // If we have errors, then show them if(is_wp_error($retval)) { $msg = "" . $retval->get_error_message() . ""; mailchimpSF_global_msg($msg); return false; } if($retval['status'] == 'subscribed') { $esc = __("Success, you've been signed up.", 'mailchimp_i18n'); $msg = "{$esc}"; } else { $esc = __("Success, you've been signed up! Please look for our confirmation email.", 'mailchimp_i18n'); $msg = "{$esc}"; } // Set our global message mailchimpSF_global_msg($msg); return true; } /* Cleans up merge fields and interests to make them API 3.0-friendly. */ function mailchimpSF_subscribe_body($merge, $igs, $email_type, $email, $status, $double_optin) { $body = new stdClass(); $body->email_address = $email; $body->email_type = $email_type; $body->merge_fields = $merge; if (!empty($igs)) { $body->interests = $igs; } // single opt-in that covers new subscribers if (!$status && $double_optin == false) { $body->status = 'subscribed'; } // anyone else else { $body->status = 'pending'; } return $body; } function mailchimpSF_check_status($endpoint) { $endpoint .= '?fields=status'; $api = mailchimpSF_get_api(); $subscriber = $api->get($endpoint, null); if(is_wp_error($subscriber)) { return false; } return $subscriber['status']; } function mailchimpSF_merge_submit($mv) { // Loop through our Merge Vars, and if they're empty, but required, then print an error, and mark as failed $merge = new stdClass(); foreach($mv as $var) { // We also want to create an array where the keys are the tags for easier validation later $mv_tag_keys[$var['tag']] = $var; $opt = 'mc_mv_'.$var['tag']; $opt_val = isset($_POST[$opt]) ? stripslashes_deep($_POST[$opt]) : ''; // Handle phone number logic if ($var['type'] === 'phone' && $var['options']['phone_format'] === 'US') { $opt_val = mailchimpSF_merge_validate_phone($opt_val, $var); if(is_wp_error($opt_val)) { return $opt_val; } } // Handle address logic else if (is_array($opt_val) && $var['type'] == 'address') { $validate = mailchimpSF_merge_validate_address($opt_val, $var); if(is_wp_error($validate)) { return $validate; } if($validate) { $merge->$var['tag'] = $validate; } continue; } else if (is_array($opt_val)) { $keys = array_keys($opt_val); $val = new stdClass(); foreach($keys as $key) { $val->$key = $opt_val[$key]; } $opt_val = $val; } if ($var['required'] == 'Y' && trim($opt_val) == '') { $message = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name'])); $error = new WP_Error('missing_required_field', $message); return $error; } else { if ($var['tag'] != 'EMAIL') { $merge->$var['tag'] = $opt_val; } } } return $merge; } function mailchimpSF_merge_validate_phone($opt_val, $var) { // This filters out all 'falsey' elements $opt_val = array_filter($opt_val); // If they weren't all empty if (!$opt_val) { return false; } $opt_val = implode('-', $opt_val); if (strlen($opt_val) < 12) { $opt_val = ''; } if (!preg_match('/[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,4}/A', $opt_val)) { $message = sprintf(__("%s must consist of only numbers", 'mailchimp_i18n'), esc_html($var['name'])); $error = new WP_Error('mc_phone_validation', $message); return $error; } return $opt_val; } function mailchimpSF_merge_validate_address($opt_val, $var) { if ($var['required'] == 'Y') { if (empty($opt_val['addr1']) || empty($opt_val['city'])) { $message = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name'])); $error = new WP_Error('invalid_address_merge', $message); return $error; } } else { if (empty($opt_val['addr1']) || empty($opt_val['city'])) { return false; } $merge = new stdClass(); $merge->addr1 = $opt_val['addr1']; $merge->addr2 = $opt_val['addr2']; $merge->city = $opt_val['city']; $merge->state = $opt_val['state']; $merge->zip = $opt_val['zip']; $merge->country = $opt_val['country']; return $merge; } } function mailchimpSF_merge_remove_empty($merge) { foreach ($merge as $k => $v) { if (is_object($v) && empty($v)) { unset($merge->$k); } else if (!is_object($v) && trim($v) === '') { unset($merge->$k); } } // If we have an empty $merge, then assign empty string. if (count($merge) == 0 || $merge == '') { $merge = ''; } return $merge; } function mailchimpSF_groups_submit($igs) { if(empty($igs)) { return new StdClass(); } $groups = new stdClass(); foreach ($igs as $ig) { if (get_option('mc_show_interest_groups_'.$ig['id']) == 'on' && $ig['type'] !== 'hidden') { switch ($ig['type']) { case 'dropdown': case 'radio': // there can only be one value submitted for radio/dropdowns, so use that at the group id. if (isset($_POST['group'][$ig['id']])){ $value = $_POST['group'][$ig['id']]; $groups->$value = true; } break; case 'checkboxes': if (isset($_POST['group'][$ig['id']])) { foreach ($_POST['group'][$ig['id']] as $id => $value) { $groups->$id = true; } } break; default: // Nothing break; } } } return $groups; } function mailchimpSF_verify_key($api) { $user = $api->get(''); if (is_wp_error($user)) { return $user; } //Might as well set this data if we have it already. $valid_roles = array('owner', 'admin', 'manager'); if(in_array($user['role'], $valid_roles)) { update_option('mc_api_key', $api->key); update_option('mc_user', $user); update_option('mc_datacenter', $api->datacenter); } else { $msg = __('API Key must belong to "Owner", "Admin", or "Manager."', 'mailchimp_i18n'); return new WP_Error('mc-invalid-role', $msg); } return; } function mailchimpSF_update_profile_url($email) { $dc = get_option('mc_datacenter'); $eid = base64_encode($email); $user = get_option('mc_user'); $list_id = get_option('mc_list_id'); $url = 'http://' . $dc . '.list-manage.com/subscribe/send-email?u=' . $user['account_id'] . '&id=' . $list_id . '&e=' . $eid; return $url; } function mailchimpSF_signup_form_url() { $dc = get_option('mc_datacenter'); $user = get_option('mc_user'); $list_id = get_option('mc_list_id'); $url = 'http://' . $dc . '.list-manage.com/subscribe?u=' . $user['account_id'] . '&id=' . $list_id; return $url; } function mailchimpSF_delete_options($options = array()) { foreach($options as $option) { delete_option($option); } } /********************** * Utility Functions * **********************/ /** * Utility function to allow placement of plugin in plugins, mu-plugins, child or parent theme's plugins folders * * This function must be ran _very early_ in the load process, as it sets up important constants for the rest of the plugin */ function mailchimpSF_where_am_i() { $locations = array( 'plugins' => array( 'dir' => plugin_dir_path(__FILE__), 'url' => plugins_url() ), 'mu_plugins' => array( 'dir' => plugin_dir_path(__FILE__), 'url' => plugins_url(), ), 'template' => array( 'dir' => trailingslashit(get_template_directory()).'plugins/', 'url' => trailingslashit(get_template_directory_uri()).'plugins/', ), 'stylesheet' => array( 'dir' => trailingslashit(get_stylesheet_directory()).'plugins/', 'url' => trailingslashit(get_stylesheet_directory_uri()).'plugins/', ), ); // Set defaults $mscf_dirbase = trailingslashit(basename(dirname(__FILE__))); // Typically wp-mailchimp/ or mailchimp/ $mscf_dir = trailingslashit(plugin_dir_path(__FILE__)); $mscf_url = trailingslashit(plugins_url(null, __FILE__)); // Try our hands at finding the real location foreach ($locations as $key => $loc) { $dir = trailingslashit($loc['dir']).$mscf_dirbase; $url = trailingslashit($loc['url']).$mscf_dirbase; if (is_file($dir.basename(__FILE__))) { $mscf_dir = $dir; $mscf_url = $url; break; } } // Define our complete filesystem path define('MCSF_DIR', $mscf_dir); /* Lang location needs to be relative *from* ABSPATH, so strip it out of our language dir location */ define('MCSF_LANG_DIR', trailingslashit(MCSF_DIR).'po/'); // Define our complete URL to the plugin folder define('MCSF_URL', $mscf_url); } /** * MODIFIED VERSION of wp_verify_nonce from WP Core. Core was not overridden to prevent problems when replacing * something universally. * * Verify that correct nonce was used with time limit. * * The user is given an amount of time to use the token, so therefore, since the * UID and $action remain the same, the independent variable is the time. * * @param string $nonce Nonce that was used in the form to verify * @param string|int $action Should give context to what is taking place and be the same when nonce was created. * @return bool Whether the nonce check passed or failed. */ function mailchimpSF_verify_nonce($nonce, $action = -1) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) { $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); } if ( empty( $nonce ) ) { return false; } $token = 'MAILCHIMP'; $i = wp_nonce_tick(); // Nonce generated 0-12 hours ago $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 ); if ( hash_equals( $expected, $nonce ) ) { return 1; } // Nonce generated 12-24 hours ago $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); if ( hash_equals( $expected, $nonce ) ) { return 2; } // Invalid nonce return false; } /** * MODIFIED VERSION of wp_create_nonce from WP Core. Core was not overridden to prevent problems when replacing * something universally. * * Creates a cryptographic token tied to a specific action, user, and window of time. * * @param string $action Scalar value to add context to the nonce. * @return string The token. */ function mailchimpSF_create_nonce($action = -1) { $user = wp_get_current_user(); $uid = (int) $user->ID; if ( ! $uid ) { /** This filter is documented in wp-includes/pluggable.php */ $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); } $token = 'MAILCHIMP'; $i = wp_nonce_tick(); return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); }