PluginProbe
Mailchimp List Subscribe Form / 1.4.2
Mailchimp List Subscribe Form v1.4.2
1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 All 55 releases
mailchimp / mailchimp.php

mailchimp.php in Mailchimp List Subscribe Form 1.4.2, at mailchimp.php

1,592 lines 50.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: MailChimp
4 Plugin URI: http://www.mailchimp.com/plugins/mailchimp-wordpress-plugin/
5 Description: The MailChimp plugin allows you to quickly and easily add a signup form for your MailChimp list.
6 Version: 1.4.2
7 Author: MailChimp and Crowd Favorite
8 Author URI: http://mailchimp.com/api/
9 */
10 /* Copyright 2008-2012 MailChimp.com (email : api@mailchimp.com)
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 */
26
27 // Version constant for easy CSS refreshes
28 define('MCSF_VER', '1.4.2');
29
30 // What's our permission (capability) threshold
31 define('MCSF_CAP_THRESHOLD', 'manage_options');
32
33 // If Developer mode not defined, make it false
34 if (! defined('MAILCHIMP_DEV_MODE') ) {
35 define('MAILCHIMP_DEV_MODE', false);
36 }
37
38 // Define our location constants, both MCSF_DIR and MCSF_URL
39 mailchimpSF_where_am_i();
40
41 // Get our MailChimp API class in scope
42 if (!class_exists('Sopresto_MailChimp')) {
43 require_once(MCSF_DIR.'lib/sopresto/sopresto.php');
44 }
45
46 // includes the widget code so it can be easily called either normally or via ajax
47 include_once('mailchimp_widget.php');
48
49 // includes the backwards compatibility functions
50 include_once('mailchimp_compat.php');
51
52 /**
53 * Do the following plugin setup steps here
54 *
55 * Internationalization
56 * Resource (JS & CSS) enqueuing
57 *
58 * @return void
59 */
60 function mailchimpSF_plugin_init() {
61 // Internationalize the plugin
62 $textdomain = 'mailchimp_i18n';
63 $locale = apply_filters( 'plugin_locale', get_locale(), $textdomain);
64 load_textdomain('mailchimp_i18n', MCSF_LANG_DIR.$textdomain.'-'.$locale.'.mo');
65
66 // Bring in our appropriate JS and CSS resources
67 mailchimpSF_load_resources();
68 }
69 add_action( 'init', 'mailchimpSF_plugin_init' );
70
71
72 /**
73 * Add the settings link to the MailChimp plugin row
74 *
75 * @param array $links - Links for the plugin
76 * @return array - Links
77 */
78 function mailchimpSD_plugin_action_links($links) {
79 $settings_page = add_query_arg(array('page' => 'mailchimpSF_options'), admin_url('options-general.php'));
80 $settings_link = '<a href="'.esc_url($settings_page).'">'.__('Settings', 'mailchimp_i18n' ).'</a>';
81 array_unshift($links, $settings_link);
82 return $links;
83 }
84 add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'mailchimpSD_plugin_action_links', 10, 1);
85
86 /**
87 * Loads the appropriate JS and CSS resources depending on
88 * settings and context (admin or not)
89 *
90 * @return void
91 */
92 function mailchimpSF_load_resources() {
93 // JS
94 if (get_option('mc_use_javascript') == 'on') {
95 if (!is_admin()) {
96 wp_enqueue_script('jquery_scrollto', MCSF_URL.'js/scrollTo.js', array('jquery'), MCSF_VER);
97 wp_enqueue_script('mailchimpSF_main_js', MCSF_URL.'js/mailchimp.js', array('jquery', 'jquery-form'), MCSF_VER);
98 // some javascript to get ajax version submitting to the proper location
99 global $wp_scripts;
100 $wp_scripts->localize('mailchimpSF_main_js', 'mailchimpSF', array(
101 'ajax_url' => trailingslashit(home_url()),
102 ));
103 }
104 }
105
106 if (get_option('mc_use_datepicker') == 'on' && !is_admin()) {
107 // Datepicker theme
108 wp_enqueue_style('flick', MCSF_URL.'/css/flick/flick.css');
109 // Datepicker JS
110 wp_enqueue_script('datepicker', MCSF_URL.'/js/datepicker.js', array('jquery','jquery-ui-core'));
111 }
112
113 wp_enqueue_style('mailchimpSF_main_css', home_url('?mcsf_action=main_css&ver='.MCSF_VER));
114 wp_enqueue_style('mailchimpSF_ie_css', MCSF_URL.'css/ie.css');
115 global $wp_styles;
116 $wp_styles->add_data( 'mailchimpSF_ie_css', 'conditional', 'IE' );
117 }
118
119
120 /**
121 * Loads resources for the MailChimp admin page
122 *
123 * @return void
124 */
125 function mc_admin_page_load_resources() {
126 wp_enqueue_style('mailchimpSF_admin_css', MCSF_URL.'css/admin.css');
127 wp_enqueue_script('mailchimpSF_admin_js', MCSF_URL.'js/admin.js');
128 }
129 add_action('load-settings_page_mailchimpSF_options', 'mc_admin_page_load_resources');
130
131
132 /**
133 * Loads jQuery Datepicker for the date-pick class
134 **/
135 function mc_datepicker_load() {
136 ?>
137 <script type="text/javascript">
138 jQuery(function($) {
139 $('.date-pick').each(function() {
140 var format = $(this).data('format') || 'mm/dd/yyyy';
141 format = format.replace(/yyyy/i, 'yy');
142 $(this).datepicker({
143 autoFocusNextInput: true,
144 constrainInput: false,
145 changeMonth: true,
146 changeYear: true,
147 beforeShow: function(input, inst) { $('#ui-datepicker-div').addClass('show'); },
148 dateFormat: format.toLowerCase(),
149 });
150 });
151 d = new Date();
152 $('.birthdate-pick').each(function() {
153 var format = $(this).data('format') || 'mm/dd';
154 format = format.replace(/yyyy/i, 'yy');
155 $(this).datepicker({
156 autoFocusNextInput: true,
157 constrainInput: false,
158 changeMonth: true,
159 changeYear: false,
160 minDate: new Date(d.getFullYear(), 1-1, 1),
161 maxDate: new Date(d.getFullYear(), 12-1, 31),
162 beforeShow: function(input, inst) { $('#ui-datepicker-div').removeClass('show'); },
163 dateFormat: format.toLowerCase(),
164 });
165
166 });
167
168 });
169 </script>
170 <?php
171 }
172 if (get_option('mc_use_datepicker') == 'on' && !is_admin()) {
173 add_action('wp_head', 'mc_datepicker_load');
174 }
175
176 /**
177 * Handles requests that as light-weight a load as possible.
178 * typically, JS or CSS
179 **/
180 function mailchimpSF_early_request_handler() {
181 if (isset($_GET['mcsf_action'])) {
182 switch ($_GET['mcsf_action']) {
183 case 'main_css':
184 header("Content-type: text/css");
185 mailchimpSF_main_css();
186 exit;
187 case 'authorize':
188 mailchimpSF_authorize();
189 break;
190 case 'authorized':
191 mailchimpSF_authorized();
192 break;
193 }
194 }
195 }
196 add_action('init', 'mailchimpSF_early_request_handler', 0);
197
198 /**
199 * Outputs the front-end CSS. This checks several options, so it
200 * was best to put it in a Request-handled script, as opposed to
201 * a static file.
202 */
203 function mailchimpSF_main_css() {
204 ?>
205 .mc_error_msg {
206 color: red;
207 margin-bottom: 1.0em;
208 }
209 .mc_success_msg {
210 color: green;
211 margin-bottom: 1.0em;
212 }
213 .mc_merge_var{
214 padding:0;
215 margin:0;
216 }
217 <?php
218 // If we're utilizing custom styles
219 if (get_option('mc_custom_style')=='on'){
220 ?>
221 #mc_signup_form {
222 padding:5px;
223 border-width: <?php echo get_option('mc_form_border_width'); ?>px;
224 border-style: <?php echo (get_option('mc_form_border_width')==0) ? 'none' : 'solid'; ?>;
225 border-color: #<?php echo get_option('mc_form_border_color'); ?>;
226 color: #<?php echo get_option('mc_form_text_color'); ?>;
227 background-color: #<?php echo get_option('mc_form_background'); ?>;
228 }
229
230
231 .mc_custom_border_hdr {
232 border-width: <?php echo get_option('mc_header_border_width'); ?>px;
233 border-style: <?php echo (get_option('mc_header_border_width')==0) ? 'none' : 'solid'; ?>;
234 border-color: #<?php echo get_option('mc_header_border_color'); ?>;
235 color: #<?php echo get_option('mc_header_text_color'); ?>;
236 background-color: #<?php echo get_option('mc_header_background'); ?>;
237 <!-- font-size: 1.2em;-->
238 padding:5px 10px;
239 width: 100%;
240 }
241 <?php
242 }
243 ?>
244 #mc_signup_container {}
245 #mc_signup_form {}
246 #mc_signup_form .mc_var_label {}
247 #mc_signup_form .mc_input {}
248 #mc-indicates-required {
249 width:100%;
250 }
251 #mc_display_rewards {}
252 .mc_interests_header {
253 font-weight:bold;
254 }
255 div.mc_interest{
256 width:100%;
257 }
258 #mc_signup_form input.mc_interest {}
259 #mc_signup_form select {}
260 #mc_signup_form label.mc_interest_label {
261 display:inline;
262 }
263 .mc_signup_submit {
264 text-align:center;
265 }
266 ul.mc_list {
267 list-style-type: none;
268 }
269 ul.mc_list li {
270 font-size: 12px;
271 }
272 #ui-datepicker-div .ui-datepicker-year {
273 display: none;
274 }
275 #ui-datepicker-div.show .ui-datepicker-year {
276 display: inline;
277 padding-left: 3px
278 }
279 <?php
280 }
281
282
283 /**
284 * Add our settings page to the admin menu
285 *
286 * @return void
287 */
288 function mailchimpSF_add_pages(){
289 // Add settings page for users who can edit plugins
290 add_options_page( __( 'MailChimp Setup', 'mailchimp_i18n' ), __( 'MailChimp Setup', 'mailchimp_i18n' ), MCSF_CAP_THRESHOLD, 'mailchimpSF_options', 'mailchimpSF_setup_page');
291 }
292 add_action('admin_menu', 'mailchimpSF_add_pages');
293
294 function mailchimpSF_request_handler() {
295 if (isset($_POST['mcsf_action'])) {
296 switch ($_POST['mcsf_action']) {
297 case 'logout':
298 // Check capability & Verify nonce
299 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'mc_logout')) {
300 wp_die('Cheatin&rsquo; huh?');
301 }
302
303 // erase auth information
304 delete_option('mc_sopresto_user');
305 delete_option('mc_sopresto_public_key');
306 delete_option('mc_sopresto_secret_key');
307 break;
308 case 'reset_list':
309 // Check capability & Verify nonce
310 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'reset_mailchimp_list')) {
311 wp_die('Cheatin&rsquo; huh?');
312 }
313
314 mailchimpSF_reset_list_settings();
315 break;
316 case 'change_form_settings':
317 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_general_form_settings')) {
318 wp_die('Cheatin&rsquo; huh?');
319 }
320
321 // Update the form settings
322 mailchimpSF_save_general_form_settings();
323 break;
324 case 'mc_submit_signup_form':
325 // Validate nonce
326 if (!wp_verify_nonce($_POST['_mc_submit_signup_form_nonce'], 'mc_submit_signup_form')) {
327 wp_die('Cheatin&rsquo; huh?');
328 }
329
330 // Attempt the signup
331 mailchimpSF_signup_submit();
332
333 // Do a different action for html vs. js
334 switch ($_POST['mc_submit_type']) {
335 case 'html':
336 /* Allow to fall through. The widget will pick up the
337 * global message left over from the signup_submit function */
338 break;
339 case 'js':
340 if (!headers_sent()){ //just in case...
341 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT', true, 200);
342 }
343 echo mailchimpSF_global_msg(); // Don't esc_html this, b/c we've already escaped it
344 exit;
345 }
346 }
347 }
348 }
349 add_action('init', 'mailchimpSF_request_handler');
350
351 function mailchimpSF_auth_nonce_key($salt = null) {
352 if (is_null($salt)) {
353 $salt = mailchimpSF_auth_nonce_salt();
354 }
355 return 'social_authentication' . md5( AUTH_KEY . $salt );
356 }
357
358 function mailchimpSF_auth_nonce_salt() {
359 return md5(microtime().$_SERVER['SERVER_ADDR']);
360 }
361
362 function mailchimpSF_authorize() {
363 $api = mailchimpSF_get_api(true);
364 $proxy = apply_filters('mailchimp_authorize_url', $api->getApiUrl('authorize'));
365 if (strpos($proxy, 'socialize-this') !== false) {
366 $salt = mailchimpSF_auth_nonce_salt();
367 $id = mailchimpSF_create_nonce( mailchimpSF_auth_nonce_key( $salt ) );
368
369 $url = home_url('index.php');
370 $args = array(
371 'mcsf_action' => 'authorized',
372 'salt' => $salt,
373 'user_id' => get_current_user_id(),
374 );
375
376 $proxy = add_query_arg(array(
377 'id' => $id,
378 'response_url' => urlencode(add_query_arg($args, $url))
379 ), $proxy);
380
381 $proxy = apply_filters('mailchimp_proxy_url', $proxy);
382 }
383
384 wp_redirect($proxy);
385 exit;
386 }
387
388 function mailchimpSF_authorized() {
389 // User ID on the request? Must be set before nonce comparison
390 $user_id = stripslashes($_GET['user_id']);
391 if ($user_id !== null) {
392 wp_set_current_user($user_id);
393 }
394
395 $nonce = stripslashes($_POST['id']);
396 $salt = stripslashes($_GET['salt']);
397
398 if (mailchimpSF_verify_nonce( $nonce, mailchimpSF_auth_nonce_key( $salt ) ) === false) {
399 wp_die('Cheatin&rsquo; huh?');
400 }
401
402 $response = stripslashes_deep($_POST['response']);
403
404 if (!isset($response['keys']) || !isset($response['user'])) {
405 wp_die('Something went wrong, please try again');
406 }
407
408 update_option('mc_sopresto_user', $response['user']);
409 update_option('mc_sopresto_dc', $response['dc']);
410 update_option('mc_sopresto_public_key', $response['keys']['public']);
411 update_option('mc_sopresto_secret_key', $response['keys']['secret']);
412 exit;
413 }
414
415 /**
416 * Upgrades data if it needs to. Checks on admin_init
417 *
418 * @return void
419 */
420 function mailchimpSF_upgrade() {
421 // See if we need an upgrade
422 if (mailchimpSF_needs_upgrade()) {
423 // remove password option if it's set (0.5)
424 // Update interest group data
425 mailchimpSF_do_upgrade();
426 }
427 }
428 add_action('admin_init', 'mailchimpSF_upgrade');
429
430 /**
431 * Creates new Sopresto API object
432 *
433 * @return Sopresto_MailChimp|false
434 */
435 function mailchimpSF_get_api($force = false) {
436 $public_key = get_option('mc_sopresto_public_key');
437 $secret_key = get_option('mc_sopresto_secret_key');
438
439 if ($public_key && $secret_key || $force) {
440 return new Sopresto_MailChimp($public_key, $secret_key, '1.3');
441 }
442
443 return false;
444 }
445
446 /**
447 * Checks to see if we're storing a password, if so, we need
448 * to upgrade to the API key
449 *
450 * @return bool
451 **/
452 function mailchimpSF_needs_upgrade() {
453 $igs = get_option('mc_interest_groups');
454
455 if ($igs !== false // we have an option
456 && (
457 empty($igs) || // it can be an empty array (no interest groups)
458 (is_array($igs) && isset($igs[0]['id'])) // OR it should be a populated array that's well-formed
459 )) {
460 return false; // no need to upgrade
461 }
462 else {
463 return true; // yeah, let's do it
464 }
465 }
466
467 /**
468 * 1.2.4 -> 1.2.5 - Update to support multiple interest groups
469 * MCAPIv1.2 -> MCAPIv1.3 - update interest groups
470 * 2011-02-09 - old password upgrade code deleted as 0.5 is way old
471 */
472 function mailchimpSF_do_upgrade() {
473 # TODO: reload this
474 }
475
476 /**
477 * Deletes all mailchimp options
478 **/
479 function mailchimpSF_delete_setup() {
480 delete_option('mc_user_id');
481 delete_option('mc_sopresto_user');
482 delete_option('mc_sopresto_public_key');
483 delete_option('mc_sopresto_secret_key');
484 delete_option('mc_rewards');
485 delete_option('mc_use_javascript');
486 delete_option('mc_use_datepicker');
487 delete_option('mc_use_unsub_link');
488 delete_option('mc_list_id');
489 delete_option('mc_list_name');
490 $igs = get_option('mc_interest_groups');
491 if (is_array($igs)) {
492 foreach ($igs as $ig) {
493 $opt = 'mc_show_interest_groups_'.$ig['id'];
494 delete_option($opt);
495 }
496 }
497 delete_option('mc_interest_groups');
498 $mv = get_option('mc_merge_vars');
499 if (is_array($mv)){
500 foreach($mv as $var){
501 $opt = 'mc_mv_'.$var['tag'];
502 delete_option($opt);
503 }
504 }
505 delete_option('mc_merge_vars');
506 }
507
508 /**
509 * Resets the list settings, there's only one list
510 * that can have settings at a time, so no list_id
511 * parameter is necessary.
512 **/
513 function mailchimpSF_reset_list_settings() {
514
515 delete_option('mc_list_id');
516 delete_option('mc_list_name');
517 delete_option('mc_merge_vars');
518 delete_option('mc_interest_groups');
519
520 delete_option('mc_use_javascript');
521 delete_option('mc_use_unsub_link');
522 delete_option('mc_use_datepicker');
523
524 delete_option('mc_header_content');
525 delete_option('mc_subheader_content');
526 delete_option('mc_submit_text');
527
528 delete_option('mc_custom_style');
529
530 delete_option('mc_header_border_width');
531 delete_option('mc_header_border_color');
532 delete_option('mc_header_background');
533 delete_option('mc_header_text_color');
534
535 delete_option('mc_form_border_width');
536 delete_option('mc_form_border_color');
537 delete_option('mc_form_background');
538 delete_option('mc_form_text_color');
539
540 $msg = '<p class="success_msg">'.esc_html(__('Successfully Reset your List selection... Now you get to pick again!', 'mailchimp_i18n')).'</p>';
541 mailchimpSF_global_msg($msg);
542 }
543
544 /**
545 * Gets or sets a global message based on parameter passed to it
546 *
547 * @return string/bool depending on get/set
548 **/
549 function mailchimpSF_global_msg($msg = null) {
550 global $mcsf_msgs;
551
552 // Make sure we're formed properly
553 if (!is_array($mcsf_msgs)) {
554 $mcsf_msgs = array();
555 }
556
557 // See if we're getting
558 if (is_null($msg)) {
559 return implode('', $mcsf_msgs);
560 }
561
562 // Must be setting
563 $mcsf_msgs[] = $msg;
564 return true;
565 }
566
567 /**
568 * Sets the default options for the option form
569 **/
570 function mailchimpSF_set_form_defaults($list_name = '') {
571 update_option('mc_header_content',__( 'Sign up for', 'mailchimp_i18n' ).' '.$list_name);
572 update_option('mc_submit_text',__( 'Subscribe', 'mailchimp_i18n' ));
573
574 update_option('mc_use_datepicker', 'on');
575 update_option('mc_custom_style','off');
576 update_option('mc_use_javascript','on');
577 update_option('mc_use_unsub_link','off');
578 update_option('mc_header_border_width','1');
579 update_option('mc_header_border_color','E3E3E3');
580 update_option('mc_header_background','FFFFFF');
581 update_option('mc_header_text_color','CC6600');
582
583 update_option('mc_form_border_width','1');
584 update_option('mc_form_border_color','E0E0E0');
585 update_option('mc_form_background','FFFFFF');
586 update_option('mc_form_text_color','3F3F3f');
587 }
588
589 /**
590 * Saves the General Form settings on the options page
591 *
592 * @return void
593 **/
594 function mailchimpSF_save_general_form_settings() {
595
596 if (MAILCHIMP_DEV_MODE == false) {
597 if (isset($_POST['mc_rewards'])){
598 update_option('mc_rewards', 'on');
599 $msg = '<p class="success_msg">'.__('Monkey Rewards turned On!', 'mailchimp_i18n').'</p>';
600 mailchimpSF_global_msg($msg);
601 } else if (get_option('mc_rewards')!='off') {
602 update_option('mc_rewards', 'off');
603 $msg = '<p class="success_msg">'.__('Monkey Rewards turned Off!', 'mailchimp_i18n').'</p>';
604 mailchimpSF_global_msg($msg);
605 }
606 if (isset($_POST['mc_use_javascript'])){
607 update_option('mc_use_javascript', 'on');
608 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned On!', 'mailchimp_i18n').'</p>';
609 mailchimpSF_global_msg($msg);
610 } else if (get_option('mc_use_javascript')!='off') {
611 update_option('mc_use_javascript', 'off');
612 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned Off!', 'mailchimp_i18n').'</p>';
613 mailchimpSF_global_msg($msg);
614 }
615
616 if (isset($_POST['mc_use_datepicker'])){
617 update_option('mc_use_datepicker', 'on');
618 $msg = '<p class="success_msg">'.__('Datepicker turned On!', 'mailchimp_i18n').'</p>';
619 mailchimpSF_global_msg($msg);
620 } else if (get_option('mc_use_datepicker')!='off') {
621 update_option('mc_use_datepicker', 'off');
622 $msg = '<p class="success_msg">'.__('Datepicker turned Off!', 'mailchimp_i18n').'</p>';
623 mailchimpSF_global_msg($msg);
624 }
625
626 if (isset($_POST['mc_use_unsub_link'])){
627 update_option('mc_use_unsub_link', 'on');
628 $msg = '<p class="success_msg">'.__('Unsubscribe link turned On!', 'mailchimp_i18n').'</p>';
629 mailchimpSF_global_msg($msg);
630 } else if (get_option('mc_use_unsub_link')!='off') {
631 update_option('mc_use_unsub_link', 'off');
632 $msg = '<p class="success_msg">'.__('Unsubscribe link turned Off!', 'mailchimp_i18n').'</p>';
633 mailchimpSF_global_msg($msg);
634 }
635
636 $content = stripslashes($_POST['mc_header_content']);
637 $content = str_replace("\r\n","<br/>", $content);
638 update_option('mc_header_content', $content );
639
640 $content = stripslashes($_POST['mc_subheader_content']);
641 $content = str_replace("\r\n","<br/>", $content);
642 update_option('mc_subheader_content', $content );
643
644
645 $submit_text = stripslashes($_POST['mc_submit_text']);
646 $submit_text = str_replace("\r\n","", $submit_text);
647 update_option('mc_submit_text', $submit_text);
648 }
649
650 // Set Custom Style option
651 update_option('mc_custom_style', isset($_POST['mc_custom_style']) ? 'on' : 'off');
652
653 if (MAILCHIMP_DEV_MODE == false) {
654 //we told them not to put these things we are replacing in, but let's just make sure they are listening...
655 update_option('mc_header_border_width',str_replace('px','',$_POST['mc_header_border_width']) );
656 update_option('mc_header_border_color', str_replace('#','',$_POST['mc_header_border_color']));
657 update_option('mc_header_background',str_replace('#','',$_POST['mc_header_background']));
658 update_option('mc_header_text_color', str_replace('#','',$_POST['mc_header_text_color']));
659 }
660
661 update_option('mc_form_border_width',str_replace('px','',$_POST['mc_form_border_width']) );
662 update_option('mc_form_border_color', str_replace('#','',$_POST['mc_form_border_color']));
663 update_option('mc_form_background',str_replace('#','',$_POST['mc_form_background']));
664 update_option('mc_form_text_color', str_replace('#','',$_POST['mc_form_text_color']));
665
666 if (MAILCHIMP_DEV_MODE == false) {
667 $igs = get_option('mc_interest_groups');
668 if (is_array($igs)) {
669 foreach($igs as $var){
670 $opt = 'mc_show_interest_groups_'.$var['id'];
671 if (isset($_POST[$opt])){
672 update_option($opt,'on');
673 } else {
674 update_option($opt,'off');
675 }
676 }
677 }
678
679 $mv = get_option('mc_merge_vars');
680 if (is_array($mv)) {
681 foreach($mv as $var){
682 $opt = 'mc_mv_'.$var['tag'];
683 if (isset($_POST[$opt]) || $var['req']=='Y'){
684 update_option($opt,'on');
685 } else {
686 update_option($opt,'off');
687 }
688 }
689 }
690 }
691 $msg = '<p class="success_msg">'.esc_html(__('Successfully Updated your List Subscribe Form Settings!', 'mailchimp_i18n')).'</p>';
692 mailchimpSF_global_msg($msg);
693 }
694
695 /**
696 * Sees if the user changed the list, and updates options accordingly
697 **/
698 function mailchimpSF_change_list_if_necessary() {
699 // Simple permission check before going through all this
700 if (!current_user_can(MCSF_CAP_THRESHOLD)) { return; }
701
702 $api = mailchimpSF_get_api();
703 if (!$api) { return; }
704
705 //we *could* support paging, but few users have that many lists (and shouldn't)
706 $lists = $api->lists(array(),0,100);
707 $lists = $lists['data'];
708
709 if (is_array($lists) && !empty($lists) && isset($_POST['mc_list_id'])) {
710
711 /* If our incoming list ID (the one chosen in the select dropdown)
712 is in our array of lists, the set it to be the active list */
713 foreach($lists as $key => $list) {
714 if ($list['id'] == $_POST['mc_list_id']) {
715 $list_id = $_POST['mc_list_id'];
716 $list_name = $list['name'];
717 $list_key = $key;
718 }
719 }
720
721 $orig_list = get_option('mc_list_id');
722 if ($list_id != '') {
723 update_option('mc_list_id', $list_id);
724 update_option('mc_list_name', $list_name);
725 update_option('mc_email_type_option', $lists[$list_key]['email_type_option']);
726
727
728 // See if the user changed the list
729 if ($orig_list != $list_id){
730 // The user changed the list, Reset the Form Defaults
731 mailchimpSF_set_form_defaults($list_name);
732 }
733 // email_type_option
734
735 // Grab the merge vars and interest groups
736 $mv = $api->listMergeVars($list_id);
737 $igs = $api->listInterestGroupings($list_id);
738
739 update_option('mc_merge_vars', $mv);
740 foreach($mv as $var){
741 $opt = 'mc_mv_'.$var['tag'];
742 //turn them all on by default
743 if ($orig_list != $list_id) {
744 update_option($opt, 'on' );
745 }
746 }
747 update_option('mc_interest_groups', $igs);
748 if (is_array($igs)) {
749 foreach ($igs as $var){
750 $opt = 'mc_show_interest_groups_'.$var['id'];
751 //turn them all on by default
752 if ($orig_list != $list_id) {
753 update_option($opt, 'on' );
754 }
755 }
756 }
757 $igs_text = ' ';
758 if (is_array($igs)) {
759 $igs_text .= sprintf(__('and %s Sets of Interest Groups', 'mailchimp_i18n'), count($igs));
760 }
761
762 $msg = '<p class="success_msg">'.
763 sprintf(
764 __('<b>Success!</b> Loaded and saved the info for %d Merge Variables', 'mailchimp_i18n').$igs_text,
765 count($mv)
766 ).' '.
767 __('from your list').' "'.$list_name.'"<br/><br/>'.
768 __('Now you should either Turn On the MailChimp Widget or change your options below, then turn it on.', 'mailchimp_i18n').'</p>';
769 mailchimpSF_global_msg($msg);
770 }
771 }
772 }
773
774
775 /**
776 * Outputs the Settings/Options page
777 */
778 function mailchimpSF_setup_page() {
779 ?>
780 <div class="wrap">
781
782 <div class="mailchimp-header">
783 <h2><?php esc_html_e('MailChimp List Setup', 'mailchimp_i18n');?> </h2>
784 </div>
785 <?php
786
787 // Display Developer mode active.
788 if (MAILCHIMP_DEV_MODE == true) { ?>
789 <p class="error_msg">Developer mode active.</p>
790 <?php }
791
792 $user = get_option('mc_sopresto_user');
793
794 // If we have an API Key, see if we need to change the lists and its options
795 mailchimpSF_change_list_if_necessary();
796
797 // Display our success/error message(s) if have them
798 if (mailchimpSF_global_msg() != ''){
799 // Message has already been html escaped, so we don't want to 2x escape it here
800 ?>
801 <div id="mc_message" class=""><?php echo mailchimpSF_global_msg(); ?></div>
802 <?php
803 }
804
805 // If we don't have an API Key, do a login form
806 if (!$user && MAILCHIMP_DEV_MODE == false) {
807 ?>
808 <div>
809 <h3 class="mc-h2"><?php esc_html_e('Log In', 'mailchimp_i18n');?></h3>
810 <p class="mc-p" style="width: 40%;line-height: 21px;"><?php esc_html_e('To start using the MailChimp plugin, we first need to connect your MailChimp account. Click login below to connect.', 'mailchimp_i18n'); ?></p>
811 <p class="mc-a">
812 <?php
813 echo sprintf(
814 '%1$s <a href="http://www.mailchimp.com/signup/" target="_blank">%2$s</a>',
815 esc_html(__("Don't have a MailChimp account?", 'mailchimp_i18n')),
816 esc_html(__('Try one for Free!', 'mailchimp_i18n'))
817 );
818 ?>
819 </p>
820
821 <div style="width: 900px;">
822 <table class="widefat mc-widefat mc-api">
823 <tr valign="top">
824 <th scope="row" class="mailchimp-connect"><?php esc_html_e('Connect to MailChimp', 'mailchimp_i18n'); ?></th>
825 <td>
826 <a href="<?php echo add_query_arg(array("mcsf_action" => "authorize"), home_url('index.php')) ?>" class="mailchimp-login">Connect</a>
827 </td>
828 </tr>
829 </table>
830 </div>
831 </div>
832
833 <br/>
834 <?php
835 if ($user && $user['username'] != '') {
836 ?>
837 <!--<div class="notes_msg">
838 <strong><?php esc_html_e('Notes', 'mailchimp_i18n'); ?>:</strong>
839 <ul>
840 <li><?php esc_html_e('Changing your settings at MailChimp.com may cause this to stop working.', 'mailchimp_i18n'); ?></li>
841 <li><?php esc_html_e('If you change your login to a different account, the info you have setup below will be erased.', 'mailchimp_i18n'); ?></li>
842 <li><?php esc_html_e('If any of that happens, no biggie - just reconfigure your login and the items below...', 'mailchimp_i18n'); ?></li>
843 </ul>
844 </div>-->
845 <?php
846 }
847 } // End of login form
848
849 // Start logout form
850 elseif (MAILCHIMP_DEV_MODE == false) {
851 ?>
852 <table style="min-width:400px;" class="mc-user" cellspacing="0">
853 <tr>
854 <td><h3><?php esc_html_e('Logged in as', 'mailchimp_i18n');?>: <?php echo esc_html($user['username']); ?></h3>
855 </td>
856 <td>
857 <form method="post" action="options-general.php?page=mailchimpSF_options">
858 <input type="hidden" name="mcsf_action" value="logout"/>
859 <input type="submit" name="Submit" value="<?php esc_attr_e('Logout', 'mailchimp_i18n');?>" class="button" />
860 <?php wp_nonce_field('mc_logout', '_mcsf_nonce_action'); ?>
861 </form>
862 </td>
863 </tr>
864 </table>
865 <?php
866 } // End Logout form
867
868 //Just get out if nothing else matters...
869 $api = mailchimpSF_get_api();
870 if (!$api && MAILCHIMP_DEV_MODE == false) { return; }
871
872 if ($api){
873 ?>
874 <h3 class="mc-h2"><?php esc_html_e('Your Lists', 'mailchimp_i18n'); ?></h3>
875
876 <div>
877
878 <p class="mc-p"><?php esc_html_e('Please select the List you wish to create a Signup Form for.', 'mailchimp_i18n'); ?></p>
879 <p class="mc-list-note"><strong><?php esc_html_e('Note:', 'mailchimp_i18n'); ?></strong> <?php esc_html_e('Updating your list will not cause settings below to be lost. Changing to a new list will.', 'mailchimp_i18n'); ?></p>
880
881 <form method="post" action="options-general.php?page=mailchimpSF_options">
882 <?php
883 //we *could* support paging, but few users have that many lists (and shouldn't)
884 $lists = $api->lists(array(),0,100);
885 $lists = $lists['data'];
886
887 if (count($lists) == 0) {
888 ?>
889 <span class='error_msg'>
890 <?php
891 echo sprintf(
892 esc_html(__("Uh-oh, you don't have any lists defined! Please visit %s, login, and setup a list before using this tool!", 'mailchimp_i18n')),
893 "<a href='http://www.mailchimp.com/'>MailChimp</a>"
894 );
895 ?>
896 </span>
897 <?php
898 }
899 else {
900 ?>
901 <table style="min-width:400px" class="mc-list-select" cellspacing="0">
902 <tr class="mc-list-row">
903 <td>
904 <select name="mc_list_id" style="min-width:200px;">
905 <option value=""> &mdash; <?php esc_html_e('Select A List','mailchimp_i18n'); ?> &mdash; </option>
906 <?php
907 foreach ($lists as $list) {
908 $option = get_option('mc_list_id');
909 ?>
910 <option value="<?php echo esc_attr($list['id']); ?>"<?php selected($list['id'], $option); ?>><?php echo esc_html($list['name']); ?></option>
911 <?php
912 }
913 ?>
914 </select>
915 </td>
916 <td>
917 <input type="hidden" name="mcsf_action" value="update_mc_list_id" />
918 <input type="submit" name="Submit" value="<?php esc_attr_e('Update List', 'mailchimp_i18n'); ?>" class="button" />
919 </td>
920 </tr>
921 </table>
922 <?php
923 } //end select list
924 ?>
925 </form>
926 </div>
927
928 <br/>
929
930 <?php
931 }
932 elseif (MAILCHIMP_DEV_MODE == false) {
933 //display the selected list...
934 ?>
935
936 <p class="submit">
937 <form method="post" action="options-general.php?page=mailchimpSF_options">
938 <input type="hidden" name="mcsf_action" value="reset_list" />
939 <input type="submit" name="reset_list" value="<?php esc_attr_e('Reset List Options and Select again', 'mailchimp_i18n'); ?>" class="button" />
940 <?php wp_nonce_field('reset_mailchimp_list', '_mcsf_nonce_action'); ?>
941 </form>
942 </p>
943 <h3><?php esc_html_e('Subscribe Form Widget Settings for this List', 'mailchimp_i18n'); ?>:</h3>
944 <h4><?php esc_html_e('Selected MailChimp List', 'mailchimp_i18n'); ?>: <?php echo esc_html(get_option('mc_list_name')); ?></h4>
945 <?php
946 }
947
948 //Just get out if nothing else matters...
949 if (get_option('mc_list_id') == '' && MAILCHIMP_DEV_MODE == false) return;
950
951
952 // The main Settings form
953 ?>
954
955 <div>
956 <form method="post" action="options-general.php?page=mailchimpSF_options">
957 <div style="width:900px;">
958 <input type="hidden" name="mcsf_action" value="change_form_settings">
959 <?php wp_nonce_field('update_general_form_settings', '_mcsf_nonce_action'); ?>
960
961 <?php if (MAILCHIMP_DEV_MODE == false) { ?>
962 <!--<input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button" />-->
963 <table class="widefat mc-widefat mc-label-options">
964 <tr><th colspan="2">Content Options</th></tr>
965 <tr valign="top">
966 <th scope="row"><?php esc_html_e('Header', 'mailchimp_i18n'); ?></th>
967 <td>
968 <textarea name="mc_header_content" rows="2" cols="70"><?php echo esc_html(get_option('mc_header_content')); ?></textarea><br/>
969 <?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?>
970 </td>
971 </tr>
972
973 <tr valign="top">
974 <th scope="row"><?php esc_html_e('Sub-header', 'mailchimp_i18n'); ?></th>
975 <td>
976 <textarea name="mc_subheader_content" rows="2" cols="70"><?php echo esc_html(get_option('mc_subheader_content')); ?></textarea><br/>
977 <?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?>.<br/>
978 <?php esc_html_e('This will be displayed under the heading and above the form.', 'mailchimp_i18n'); ?>
979 </td>
980 </tr>
981
982 <tr valign="top" class="last-row">
983 <th scope="row"><?php esc_html_e('Submit Button', 'mailchimp_i18n'); ?></th>
984 <td>
985 <input type="text" name="mc_submit_text" size="70" value="<?php echo esc_attr(get_option('mc_submit_text')); ?>"/>
986 </td>
987 </tr>
988 </table>
989
990 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
991 <?php } ?>
992
993 <table class="widefat mc-widefat mc-custom-styling">
994 <tr><th colspan="2">Custom Styling</th></tr>
995 <tr class="mc-turned-on"><th><label for="mc_custom_style"><?php esc_html_e('Enabled?', 'mailchimp_i18n'); ?></label></th><td><span class="mc-pre-input"></span><input type="checkbox" name="mc_custom_style" id="mc_custom_style"<?php checked(get_option('mc_custom_style'), 'on'); ?> /></td></tr>
996
997 <tr class="mc-internal-heading"><th colspan="2"><?php esc_html_e('Form Settings', 'mailchimp_i18n'); ?></th></tr>
998 <tr><th><?php esc_html_e('Border Width', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input"></span><input type="text" name="mc_form_border_width" size="3" maxlength="3" value="<?php echo esc_attr(get_option('mc_form_border_width')); ?>"/>
999 <em>px <?php esc_html_e('Set to 0 for no border, do not enter', 'mailchimp_i18n'); ?> <strong>px</strong>!</em>
1000 </td></tr>
1001 <tr><th><?php esc_html_e('Border Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_border_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_border_color')); ?>"/>
1002 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1003 </td></tr>
1004 <tr><th><?php esc_html_e('Text Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_text_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_text_color')); ?>"/>
1005 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1006 </td></tr>
1007 <tr class="last-row"><th><?php esc_html_e('Background Color', 'mailchimp_i18n'); ?></th><td><span class="mc-pre-input">#</span><input type="text" name="mc_form_background" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_background')); ?>"/>
1008 <em><?php esc_html_e('Do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
1009 </td></tr>
1010 </table>
1011
1012 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1013
1014 <?php if (MAILCHIMP_DEV_MODE == false) { ?>
1015 <table class="widefat mc-widefat">
1016 <tr><th colspan="2">List Options</th></tr>
1017 <tr valign="top">
1018 <th scope="row"><?php esc_html_e('Monkey Rewards', 'mailchimp_i18n'); ?>?</th>
1019 <td><input name="mc_rewards" type="checkbox"<?php if (get_option('mc_rewards')=='on' || get_option('mc_rewards')=='' ) { echo ' checked="checked"'; } ?> id="mc_rewards" class="code" />
1020 <em><label for="mc_rewards"><?php esc_html_e('Turning this on will place a "powered by MailChimp" link in your form that will earn you credits with us. It is optional and can be turned on or off at any time.', 'mailchimp_i18n'); ?></label></em>
1021 </td>
1022 </tr>
1023
1024 <tr valign="top">
1025 <th scope="row"><?php esc_html_e('Use Javascript Support?', 'mailchimp_i18n'); ?></th>
1026 <td><input name="mc_use_javascript" type="checkbox" <?php checked(get_option('mc_use_javascript'), 'on'); ?> id="mc_use_javascript" class="code" />
1027 <em><label for="mc_use_javascript"><?php esc_html_e('Turning this on will use fancy javascript submission and should degrade gracefully for users not using javascript. It is optional and can be turned on or off at any time.', 'mailchimp_i18n'); ?></label></em>
1028 </td>
1029 </tr>
1030
1031 <tr valign="top">
1032 <th scope="row"><?php esc_html_e('Use Javascript Datepicker?', 'mailchimp_i18n'); ?></th>
1033 <td><input name="mc_use_datepicker" type="checkbox" <?php checked(get_option('mc_use_datepicker'), 'on'); ?> id="mc_use_datepicker" class="code" />
1034 <em><label for="mc_use_datepicker"><?php esc_html_e('Turning this on will use the jQuery UI Datepicker for dates.', 'mailchimp_i18n'); ?></label></em>
1035 </td>
1036 </tr>
1037 <tr valign="top" class="last-row">
1038 <th scope="row"><?php esc_html_e('Include Unsubscribe link?', 'mailchimp_i18n'); ?></th>
1039 <td><input name="mc_use_unsub_link" type="checkbox"<?php checked(get_option('mc_use_unsub_link'), 'on'); ?> id="mc_use_unsub_link" class="code" />
1040 <em><label for="mc_use_unsub_link"><?php esc_html_e('Turning this on will add a link to your host unsubscribe form', 'mailchimp_i18n'); ?></label></em>
1041 </td>
1042 </tr>
1043 </table>
1044
1045 <?php } ?>
1046
1047 </div>
1048
1049 <?php
1050 // Merge Variables Table
1051 if (MAILCHIMP_DEV_MODE == false) { ?>
1052 <div style="width:900px;">
1053
1054 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1055
1056 <table class='widefat mc-widefat'>
1057 <tr>
1058 <th colspan="4">
1059 <?php esc_html_e('Merge Variables Included', 'mailchimp_i18n'); ?>
1060
1061 <?php
1062 $mv = get_option('mc_merge_vars');
1063
1064 if (count($mv) == 0 || !is_array($mv)){
1065 ?>
1066 <em><?php esc_html_e('No Merge Variables found.', 'mailchimp_i18n'); ?></em>
1067 <?php
1068 } else {
1069 ?>
1070 </th>
1071 </tr>
1072 <tr valign="top">
1073 <th><?php esc_html_e('Name', 'mailchimp_i18n');?></th>
1074 <th><?php esc_html_e('Tag', 'mailchimp_i18n');?></th>
1075 <th><?php esc_html_e('Required?', 'mailchimp_i18n');?></th>
1076 <th><?php esc_html_e('Include?', 'mailchimp_i18n');?></th>
1077 </tr>
1078 <?php
1079 foreach($mv as $var){
1080 ?>
1081 <tr valign="top">
1082 <td><?php echo esc_html($var['name']); ?></td>
1083 <td><?php echo esc_html($var['tag']); ?></td>
1084 <td><?php echo esc_html(($var['req'] == 1) ? 'Y' : 'N'); ?></td>
1085 <td>
1086 <?php
1087 if (!$var['req']){
1088 $opt = 'mc_mv_'.$var['tag'];
1089 ?>
1090 <input name="<?php echo esc_attr($opt); ?>" type="checkbox" id="<?php echo esc_attr($opt); ?>" class="code"<?php checked(get_option($opt), 'on'); ?> />
1091 <?php
1092 } else {
1093 ?>
1094 &nbsp;&mdash;&nbsp;
1095 <?php
1096 }
1097 ?>
1098 </td>
1099 </tr>
1100 <?php
1101 }
1102 ?>
1103 </table>
1104 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button mc-submit" /><br/>
1105 </div>
1106 <?php
1107 }
1108 ?>
1109
1110
1111
1112 <?php
1113 // Interest Groups Table
1114 $igs = get_option('mc_interest_groups');
1115 if (is_array($igs) && !isset($igs['id'])) { ?>
1116 <h3 class="mc-h3"><?php esc_html_e('Group Settings', 'mailchimp_i18n'); ?></h3> <?php
1117 // Determines whether or not to continue processing. Only false if there was an error.
1118 $continue = true;
1119 foreach ($igs as $ig) {
1120 if ($continue) {
1121 if (!is_array($ig) || empty($ig) || $ig == 'N' ) {
1122 ?>
1123 <em><?php esc_html_e('No Interest Groups Setup for this List', 'mailchimp_i18n'); ?></em>
1124 <?php
1125 $continue = false;
1126 }
1127 else {
1128 ?>
1129 <table class='mc-widefat mc-blue' width="450px" cellspacing="0">
1130 <tr valign="top">
1131 <th colspan="2"><?php echo esc_html($ig['name']); ?></th>
1132 </tr>
1133 <tr valign="top">
1134 <th>
1135 <label for="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>"><?php esc_html_e('Show?', 'mailchimp_i18n'); ?></label>
1136 </th>
1137 <th>
1138 <input name="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>" id="<?php echo esc_attr('mc_show_interest_groups_'.$ig['id']); ?>" type="checkbox" class="code"<?php checked('on', get_option('mc_show_interest_groups_'.$ig['id'])); ?> />
1139 </th>
1140 </tr>
1141 <tr valign="top">
1142 <th><?php esc_html_e('Input Type', 'mailchimp_i18n'); ?></th>
1143 <td><?php echo esc_html($ig['form_field']); ?></td>
1144 </tr>
1145 <tr valign="top" class="last-row">
1146 <th><?php esc_html_e('Options', 'mailchimp_i18n'); ?></th>
1147 <td>
1148 <ul>
1149 <?php
1150 foreach($ig['groups'] as $interest){
1151 ?>
1152 <li><?php echo esc_html($interest['name']); ?></li>
1153 <?php
1154 }
1155 ?>
1156 </ul>
1157 </td>
1158 </tr>
1159 </table>
1160 <?php
1161 }
1162 }
1163 }
1164 }
1165 } // end dev mode check
1166 ?>
1167 <div style="width: 900px; margin-top: 35px;">
1168 <table class="widefat mc-widefat mc-yellow">
1169 <tr><th colspan="2">CSS Cheat Sheet</th></tr>
1170 <tr valign="top">
1171 <th scope="row">.widget_mailchimpsf_widget </th>
1172 <td>This targets the entire widget container.</td>
1173 </tr>
1174 <tr valign="top">
1175 <th scope="row">.widget-title</th>
1176 <td>This styles the title of your MailChimp widget. <i>Modifying this class will affect your other widget titles.</i></td>
1177 </tr>
1178 <tr valign="top">
1179 <th scope="row">#mc_signup</th>
1180 <td>This targets the entirity of the widget beneath the widget title.</td>
1181 </tr>
1182 <tr valign="top">
1183 <th scope="row">#mc_subheader</th>
1184 <td>This styles the subheader text.</td>
1185 </tr>
1186 <tr valign="top">
1187 <th scope="row">.mc_form_inside</th>
1188 <td>The guts and main container for the all of the form elements (the entirety of the widget minus the header and the sub header).</td>
1189 </tr>
1190 <tr valign="top">
1191 <th scope="row">.mc_header</th>
1192 <td>This targets the label above the input fields.</td>
1193 </tr>
1194 <tr valign="top">
1195 <th scope="row">.mc_input</th>
1196 <td>This attaches to the input fields.</td>
1197 </tr>
1198 <tr valign="top">
1199 <th scope="row">.mc_header_address</th>
1200 <td>This is the label above an address group.</td>
1201 </tr>
1202 <tr valign="top">
1203 <th scope="row">.mc_radio_label</th>
1204 <td>These are the labels associated with radio buttons.</td>
1205 </tr>
1206 <tr valign="top">
1207 <th scope="row">#mc-indicates-required</th>
1208 <td>This targets the “Indicates Required Field” text.</td>
1209 </tr>
1210 <tr valign="top">
1211 <th scope="row">#mc_signup_submit</th>
1212 <td>Use this to style the submit button.</td>
1213 </tr>
1214 </table>
1215 </div>
1216
1217 </form>
1218 <?php
1219 }//mailchimpSF_setup_page()
1220
1221
1222 function mailchimpSF_register_widgets() {
1223 if (mailchimpSF_get_api() || MAILCHIMP_DEV_MODE == true) {
1224 register_widget('mailchimpSF_Widget');
1225 }
1226 }
1227 add_action('widgets_init', 'mailchimpSF_register_widgets');
1228
1229 function mailchimpSF_shortcode($atts){
1230 ob_start();
1231 mailchimpSF_signup_form();
1232 return ob_get_clean();
1233 }
1234 add_shortcode('mailchimpsf_form', 'mailchimpSF_shortcode');
1235
1236 /**
1237 * Attempts to signup a user, per the $_POST args.
1238 *
1239 * This sets a global message, that is then used in the widget
1240 * output to retrieve and display that message.
1241 *
1242 * @return bool
1243 */
1244 function mailchimpSF_signup_submit() {
1245 $mv = get_option('mc_merge_vars', array());
1246 $mv_tag_keys = array();
1247
1248 $igs = get_option('mc_interest_groups', array());
1249
1250 $success = true;
1251 $listId = get_option('mc_list_id');
1252 $email = isset($_POST['mc_mv_EMAIL']) ? strip_tags(stripslashes($_POST['mc_mv_EMAIL'])) : '';
1253 $merge = $errs = $html_errs = array(); // Set up some vars
1254
1255 // Loop through our Merge Vars, and if they're empty, but required, then print an error, and mark as failed
1256 foreach($mv as $var) {
1257 $opt = 'mc_mv_'.$var['tag'];
1258
1259 $opt_val = isset($_POST[$opt]) ? $_POST[$opt] : '';
1260
1261 if (is_array($opt_val) && isset($opt_val['area'])) {
1262 // This filters out all 'falsey' elements
1263 $opt_val = array_filter($opt_val);
1264
1265 // If they weren't all empty
1266 if ($opt_val) {
1267 $opt_val = implode('-', $opt_val);
1268 if (strlen($opt_val) < 12) {
1269 $opt_val = '';
1270 }
1271 }
1272 else {
1273 $opt_val = '';
1274 }
1275 }
1276 else if (is_array($opt_val) && $var['field_type'] == 'address') {
1277 if ($var['req'] == 'Y') {
1278 if (empty($opt_val['addr1']) || empty($opt_val['city'])) {
1279 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name']));
1280 $success = false;
1281 }
1282 }
1283 $merge[$var['tag']] = $opt_val;
1284 continue;
1285 }
1286 else if (is_array($opt_val)) {
1287 $opt_val = implode($opt_val);
1288 }
1289
1290 if ($var['req'] == 'Y' && trim($opt_val) == '') {
1291 $success = false;
1292 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name']));
1293 }
1294 else {
1295 if ($var['tag'] != 'EMAIL') {
1296 $merge[$var['tag']] = $opt_val;
1297 }
1298 }
1299
1300 // We also want to create an array where the keys are the tags for easier validation later
1301 $mv_tag_keys[$var['tag']] = $var;
1302
1303 }
1304
1305 // Head back to the beginning of the merge vars array
1306 reset($mv);
1307
1308 // Ensure we have an array
1309 $igs = !is_array($igs) ? array() : $igs;
1310 foreach ($igs as $ig) {
1311 $groups = '';
1312 if (get_option('mc_show_interest_groups_'.$ig['id']) == 'on') {
1313 $groupings = array();
1314 switch ($ig['form_field']) {
1315 case 'select':
1316 case 'dropdown':
1317 case 'radio':
1318 if (isset($_POST['group'][$ig['id']])) {
1319 $groupings = array(
1320 'id' => $ig['id'],
1321 'groups' => str_replace(',', '\,', stripslashes($_POST['group'][$ig['id']])),
1322 );
1323 }
1324 break;
1325 case 'checkboxes':
1326 case 'checkbox':
1327 if (isset($_POST['group'][$ig['id']])) {
1328 foreach ($_POST['group'][$ig['id']] as $i => $value) {
1329 // Escape
1330 $groups .= str_replace(',', '\,', stripslashes($value)).',';
1331 }
1332 $groupings = array(
1333 'id' => $ig['id'],
1334 'groups' => $groups,
1335 );
1336 }
1337 break;
1338 default:
1339 // Nothing
1340 break;
1341 }
1342 if (!isset($merge['GROUPINGS']) || !is_array($merge['GROUPINGS'])) {
1343 $merge['GROUPINGS'] = array();
1344 }
1345 if (!empty($groupings)) {
1346 $merge['GROUPINGS'][] = $groupings;
1347 }
1348 }
1349 }
1350
1351 // If we're good
1352 if ($success) {
1353 // Clear out empty merge vars
1354 foreach ($merge as $k => $v) {
1355 if (is_array($v) && empty($v)) {
1356 unset($merge[$k]);
1357 }
1358 else if (!is_array($v) && trim($v) === '') {
1359 unset($merge[$k]);
1360 }
1361 }
1362
1363 // If we have an empty $merge, then assign empty string.
1364 if (count($merge) == 0 || $merge == '') {
1365 $merge = '';
1366 }
1367
1368 if (isset($_POST['email_type']) && in_array($_POST['email_type'], array('text', 'html', 'mobile'))) {
1369 $email_type = $_POST['email_type'];
1370 }
1371 else {
1372 $email_type = 'html';
1373 }
1374
1375 // Custom validation based on type
1376 if (is_array($merge) && !empty($merge)) {
1377 foreach ($merge as $merge_key => $merge_value) {
1378 if ($merge_key !== 'GROUPINGS') {
1379 switch ($mv_tag_keys[$merge_key]['field_type']) {
1380 case 'phone':
1381 if ($mv_tag_keys[$merge_key]['phoneformat'] == 'US') {
1382 $phone = $merge_value;
1383 if (!empty($phone)) {
1384 if (!preg_match('/[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,4}/', $phone)) {
1385 $errs[] = sprintf(__("%s must consist of only numbers", 'mailchimp_i18n'), esc_html($mv_tag_keys[$merge_key]['name']));
1386 $success = false;
1387 }
1388 }
1389 }
1390 break;
1391
1392 default:
1393 break;
1394 }
1395 }
1396 }
1397 }
1398 if ($success) {
1399 $api = mailchimpSF_get_api();
1400 if (!$api) { return; }
1401
1402 $retval = $api->listSubscribe( $listId, $email, $merge, $email_type);
1403 if (!$retval) {
1404 switch($api->errorCode) {
1405 case '105' :
1406 $errs[] = __("Please try again later", 'mailchimp_i18n').'.';
1407 break;
1408 case '214' :
1409 $msg = __("That email address is already subscribed to the list", 'mailchimp_i18n') . '.';
1410
1411 $account = $api->getAccountDetails(array("modules", "orders", "rewards-credits", "rewards-inspections", "rewards-referrals", "rewards-applied"));
1412 if (!$api->errorCode) {
1413 $dc = get_option('mc_sopresto_dc');
1414 $uid = $account['user_id'];
1415 $username = preg_replace('/\s+/', '-', $account['username']);
1416 $eid = base64_encode($email);
1417 $msg .= ' ' . sprintf(__('<a href="%s">Click here to update your profile.</a>', 'mailchimp_i18n'), "http://$username.$dc.list-manage.com/subscribe/send-email?u=$uid&id=$listId&e=$eid");
1418 }
1419
1420 $errs[] = $msg;
1421 $html_errs[] = count($errs)-1;
1422 break;
1423 case '250' :
1424 list($field, $rest) = explode(' ', $api->errorMessage, 2);
1425 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($mv_tag_keys[$field]['name']));
1426 break;
1427 case '254' :
1428 list($i1, $i2, $i3, $field, $rest) = explode(' ',$api->errorMessage,5);
1429 $errs[] = sprintf(__("%s has invalid content.", 'mailchimp_i18n'), esc_html($mv_tag_keys[$field]['name']));
1430 break;
1431 case '270' :
1432 $errs[] = __("An invalid Interest Group was selected", 'mailchimp_i18n').'.';
1433 break;
1434 case '502' :
1435 $errs[] = __("That email address is invalid", 'mailchimp_i18n').'.';
1436 break;
1437 default:
1438 $errs[] = $api->errorCode.":".$api->errorMessage;
1439 break;
1440 }
1441 $success = false;
1442 }
1443 }
1444 }
1445
1446 // If we have errors, then show them
1447 if (count($errs) > 0) {
1448 $msg = '<span class="mc_error_msg">';
1449 foreach($errs as $error_index => $error){
1450 if (!in_array($error_index, $html_errs)) {
1451 $error = esc_html($error);
1452 }
1453 $msg .= '&raquo; '.$error.'<br />';
1454 }
1455 $msg .= '</span>';
1456 }
1457 else {
1458 $msg = "<strong class='mc_success_msg'>".esc_html(__("Success, you've been signed up! Please look for our confirmation email!", 'mailchimp_i18n'))."</strong>";
1459 }
1460
1461 // Set our global message
1462 mailchimpSF_global_msg($msg);
1463
1464 return $success;
1465 }
1466
1467
1468
1469 /**********************
1470 * Utility Functions *
1471 **********************/
1472 /**
1473 * Utility function to allow placement of plugin in plugins, mu-plugins, child or parent theme's plugins folders
1474 *
1475 * This function must be ran _very early_ in the load process, as it sets up important constants for the rest of the plugin
1476 */
1477 function mailchimpSF_where_am_i() {
1478 $locations = array(
1479 'plugins' => array(
1480 'dir' => WP_PLUGIN_DIR,
1481 'url' => plugins_url()
1482 ),
1483 'mu_plugins' => array(
1484 'dir' => WPMU_PLUGIN_DIR,
1485 'url' => plugins_url(),
1486 ),
1487 'template' => array(
1488 'dir' => trailingslashit(get_template_directory()).'plugins/',
1489 'url' => trailingslashit(get_template_directory_uri()).'plugins/',
1490 ),
1491 'stylesheet' => array(
1492 'dir' => trailingslashit(get_stylesheet_directory()).'plugins/',
1493 'url' => trailingslashit(get_stylesheet_directory_uri()).'plugins/',
1494 ),
1495 );
1496
1497 // Set defaults
1498 $mscf_dirbase = trailingslashit(basename(dirname(__FILE__))); // Typically wp-mailchimp/ or mailchimp/
1499 $mscf_dir = trailingslashit(WP_PLUGIN_DIR).$mscf_dirbase;
1500 $mscf_url = trailingslashit(WP_PLUGIN_URL).$mscf_dirbase;
1501
1502 // Try our hands at finding the real location
1503 foreach ($locations as $key => $loc) {
1504 $dir = trailingslashit($loc['dir']).$mscf_dirbase;
1505 $url = trailingslashit($loc['url']).$mscf_dirbase;
1506 if (is_file($dir.basename(__FILE__))) {
1507 $mscf_dir = $dir;
1508 $mscf_url = $url;
1509 break;
1510 }
1511 }
1512
1513 // Define our complete filesystem path
1514 define('MCSF_DIR', $mscf_dir);
1515
1516 /* Lang location needs to be relative *from* ABSPATH,
1517 so strip it out of our language dir location */
1518 define('MCSF_LANG_DIR', trailingslashit(MCSF_DIR).'po/');
1519
1520 // Define our complete URL to the plugin folder
1521 define('MCSF_URL', $mscf_url);
1522 }
1523
1524
1525 /**
1526 * MODIFIED VERSION of wp_verify_nonce from WP Core. Core was not overridden to prevent problems when replacing
1527 * something universally.
1528 *
1529 * Verify that correct nonce was used with time limit.
1530 *
1531 * The user is given an amount of time to use the token, so therefore, since the
1532 * UID and $action remain the same, the independent variable is the time.
1533 *
1534 * @param string $nonce Nonce that was used in the form to verify
1535 * @param string|int $action Should give context to what is taking place and be the same when nonce was created.
1536 * @return bool Whether the nonce check passed or failed.
1537 */
1538 function mailchimpSF_verify_nonce($nonce, $action = -1) {
1539 $user = wp_get_current_user();
1540 $uid = (int) $user->ID;
1541 if ( ! $uid ) {
1542 $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
1543 }
1544
1545 if ( empty( $nonce ) ) {
1546 return false;
1547 }
1548
1549 $token = 'MAILCHIMP';
1550 $i = wp_nonce_tick();
1551
1552 // Nonce generated 0-12 hours ago
1553 $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
1554 if ( hash_equals( $expected, $nonce ) ) {
1555 return 1;
1556 }
1557
1558 // Nonce generated 12-24 hours ago
1559 $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
1560 if ( hash_equals( $expected, $nonce ) ) {
1561 return 2;
1562 }
1563
1564 // Invalid nonce
1565 return false;
1566 }
1567
1568
1569 /**
1570 * MODIFIED VERSION of wp_create_nonce from WP Core. Core was not overridden to prevent problems when replacing
1571 * something universally.
1572 *
1573 * Creates a cryptographic token tied to a specific action, user, and window of time.
1574 *
1575 * @param string $action Scalar value to add context to the nonce.
1576 * @return string The token.
1577 */
1578 function mailchimpSF_create_nonce($action = -1) {
1579 $user = wp_get_current_user();
1580 $uid = (int) $user->ID;
1581 if ( ! $uid ) {
1582 /** This filter is documented in wp-includes/pluggable.php */
1583 $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );
1584 }
1585
1586 $token = 'MAILCHIMP';
1587 $i = wp_nonce_tick();
1588
1589 return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
1590 }
1591
1592