PluginProbe
Mailchimp List Subscribe Form / 1.2.4
Mailchimp List Subscribe Form v1.2.4
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.2.4, at mailchimp.php

1,166 lines 38.1 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.2.4
7 Author: MailChimp and Crowd Favorite
8 Author URI: http://mailchimp.com/api/
9 */
10 /* Copyright 2008 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.2.4');
29
30 // What's our permission (capability) threshold
31 define('MCSF_CAP_THRESHOLD', 'edit_plugins');
32
33 // Define our location constants, both MCSF_DIR and MCSF_URL
34 mailchimpSF_where_am_i();
35
36 // Get our MailChimp API class in scope
37 if (!class_exists('mailchimpSF_MCAPI')) {
38 require_once('miniMCAPI.class.php');
39 }
40
41 // includes the widget code so it can be easily called either normally or via ajax
42 include_once('mailchimp_widget.php');
43
44 // includes the backwards compatibility functions
45 include_once('mailchimp_compat.php');
46
47
48
49
50 /**
51 * Do the following plugin setup steps here
52 *
53 * Internationalization
54 * Resource (JS & CSS) enqueuing
55 *
56 * @return void
57 */
58 function mailchimpSF_plugin_init() {
59 // Internationalize the plugin
60 load_plugin_textdomain( 'mailchimp_i18n', MCSF_LANG_DIR.'po/');
61
62 // Bring in our appropriate JS and CSS resources
63 mailchimpSF_load_resources();
64 }
65 add_action( 'init', 'mailchimpSF_plugin_init' );
66
67 /**
68 * Loads the appropriate JS and CSS resources depending on
69 * settings and context (admin or not)
70 *
71 * @return void
72 */
73 function mailchimpSF_load_resources() {
74 // JS
75 if (get_option('mc_use_javascript') == 'on') {
76 if (!is_admin()) {
77 wp_enqueue_script('mailchimpSF_main_js', MCSF_URL.'js/mailchimp.js', array('jquery', 'jquery-form'), MCSF_VER);
78 // some javascript to get ajax version submitting to the proper location
79 global $wp_scripts;
80 $wp_scripts->localize('mailchimpSF_main_js', 'mailchimpSF', array(
81 'ajax_url' => trailingslashit(home_url()),
82 ));
83 }
84 }
85
86 // CSS
87 if (is_admin() && $_GET['page'] == 'mailchimpSF_options') {
88 wp_enqueue_style('mailchimpSF_admin_css', MCSF_URL.'css/admin.css');
89 }
90 else {
91 wp_enqueue_style('mailchimpSF_main_css', home_url('?mcsf_action=main_css&ver='.MCSF_VER));
92 wp_enqueue_style('mailchimpSF_ie_css', MCSF_URL.'css/ie.css');
93 global $wp_styles;
94 $wp_styles->add_data( 'mailchimpSF_ie_css', 'conditional', 'IE' );
95 }
96 }
97
98 /**
99 * Handles requests that as light-weight a load as possible.
100 * typically, JS or CSS
101 **/
102 function mailchimpSF_early_request_handler() {
103 if (isset($_GET['mcsf_action'])) {
104 switch ($_GET['mcsf_action']) {
105 case 'main_css':
106 header("Content-type: text/css");
107 mailchimpSF_main_css();
108 exit;
109 }
110 }
111 }
112 add_action('init', 'mailchimpSF_early_request_handler', 0);
113
114 /**
115 * Outputs the front-end CSS. This checks several options, so it
116 * was best to put it in a Request-handled script, as opposed to
117 * a static file.
118 */
119 function mailchimpSF_main_css() {
120 ?>
121 .mc_error_msg {
122 color: red;
123 }
124 .mc_success_msg {
125 color: green;
126 }
127 .mc_merge_var{
128 padding:0;
129 margin:0;
130 }
131 <?php
132 // If we're utilizing custom styles
133 if (get_option('mc_custom_style')=='on'){
134 ?>
135 #mc_signup_form {
136 padding:5px;
137 border-width: <?php echo get_option('mc_form_border_width'); ?>px;
138 border-style: <?php echo (get_option('mc_form_border_width')==0) ? 'none' : 'solid'; ?>;
139 border-color: #<?php echo get_option('mc_form_border_color'); ?>;
140 color: #<?php echo get_option('mc_form_text_color'); ?>;
141 background-color: #<?php echo get_option('mc_form_background'); ?>;
142 }
143
144
145 .mc_custom_border_hdr {
146 border-width: <?php echo get_option('mc_header_border_width'); ?>px;
147 border-style: <?php echo (get_option('mc_header_border_width')==0) ? 'none' : 'solid'; ?>;
148 border-color: #<?php echo get_option('mc_header_border_color'); ?>;
149 color: #<?php echo get_option('mc_header_text_color'); ?>;
150 background-color: #<?php echo get_option('mc_header_background'); ?>;
151 font-size: 1.2em;
152 padding:5px 10px;
153 width: 100%;
154 }
155 <?php
156 }
157 ?>
158 #mc_signup_container {}
159 #mc_signup_form {}
160 #mc_signup_form .mc_var_label {}
161 #mc_signup_form .mc_input {}
162 #mc-indicates-required {
163 width:100%;
164 }
165 #mc_display_rewards {}
166 #mc_interests_header {
167 font-weight:bold;
168 }
169 div.mc_interest{
170 width:100%;
171 }
172 #mc_signup_form input.mc_interest {}
173 #mc_signup_form select {}
174 #mc_signup_form label.mc_interest_label {
175 display:inline;
176 }
177 .mc_signup_submit {
178 text-align:center;
179 }
180 <?php
181 }
182
183
184 /**
185 * Add our settings page to the admin menu
186 *
187 * @return void
188 */
189 function mailchimpSF_add_pages(){
190 // Add settings page for users who can edit plugins
191 add_options_page( __( 'MailChimp Setup', 'mailchimp_i18n' ), __( 'MailChimp Setup', 'mailchimp_i18n' ), MCSF_CAP_THRESHOLD, 'mailchimpSF_options', 'mailchimpSF_setup_page');
192 }
193 add_action('admin_menu', 'mailchimpSF_add_pages');
194
195 function mailchimpSF_request_handler() {
196 if (isset($_POST['mcsf_action'])) {
197 switch ($_POST['mcsf_action']) {
198 case 'logout':
199 // Check capability & Verify nonce
200 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'mc_logout')) {
201 wp_die('Cheatin&rsquo; huh?');
202 }
203
204 // erase API Key
205 update_option('mc_apikey', '');
206 break;
207 case 'update_mc_apikey':
208 // Check capability & Verify nonce
209 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_mc_api_key')) {
210 wp_die('Cheatin&rsquo; huh?');
211 }
212
213 mailchimpSF_set_api_key(strip_tags(stripslashes($_POST['mc_apikey'])));
214 break;
215 case 'reset_list':
216 // Check capability & Verify nonce
217 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'reset_mailchimp_list')) {
218 wp_die('Cheatin&rsquo; huh?');
219 }
220
221 mailchimpSF_reset_list_settings();
222 break;
223 case 'change_form_settings':
224 if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_general_form_settings')) {
225 wp_die('Cheatin&rsquo; huh?');
226 }
227
228 // Update the form settings
229 mailchimpSF_save_general_form_settings();
230 break;
231 case 'mc_submit_signup_form':
232 // Validate nonce
233 if (!wp_verify_nonce($_POST['_mc_submit_signup_form_nonce'], 'mc_submit_signup_form')) {
234 wp_die('Cheatin&rsquo; huh?');
235 }
236
237 // Attempt the signup
238 mailchimpSF_signup_submit();
239
240 // Do a different action for html vs. js
241 switch ($_POST['mc_submit_type']) {
242 case 'html':
243 /* Allow to fall through. The widget will pick up the
244 * global message left over from the signup_submit function */
245 break;
246 case 'js':
247 if (!headers_sent()){ //just in case...
248 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT', true, 200);
249 }
250 echo mailchimpSF_global_msg(); // Don't esc_html this, b/c we've already escaped it
251 exit;
252 }
253 }
254 }
255 }
256 add_action('init', 'mailchimpSF_request_handler');
257
258
259
260 /**
261 * Checks to see if we're storing a password, if so, we need
262 * to upgrade to the API key
263 *
264 * @return bool
265 **/
266 function mailchimpSF_needs_upgrade() {
267 $ig = get_option('mc_interest_groups');
268 return get_option('mc_show_interest_groups') == 'on' && (!is_array($ig['groups']) || !is_array($ig['groups'][0]));
269 }
270
271 /**
272 * MCAPIv1.2 -> MCAPIv1.3 - update interest groups
273 * 2011-02-09 - old password upgrade code deleted as 0.5 is way old
274 */
275 function mailchimpSF_do_upgrade() {
276 //left in just for good measure
277 delete_option('mc_password');
278 $api = new mailchimpSF_MCAPI(get_option('mc_apikey'));
279 $ig = $api->listInterestGroupings(get_option('mc_list_id'));
280 $ig = $ig[0];
281 update_option('mc_interest_groups', $ig);
282
283 }
284
285 /**
286 * Sets the API Key to whatever value was passed to this func
287 *
288 * @return array of vars
289 **/
290 function mailchimpSF_set_api_key($api_key = '') {
291 $delete_setup = false;
292 $api = new mailchimpSF_MCAPI($api_key);
293 $api->ping();
294 if (empty($api->errorCode)) {
295 $msg = "<p class='success_msg'>".esc_html(__("Success! We were able to verify your API Key! Let's continue, shall we?", 'mailchimp_i18n'))."</p>";
296 update_option('mc_apikey', $api_key);
297 $req = $api->getAccountDetails();
298 update_option('mc_username', $req['username']);
299 update_option('mc_user_id', $req['user_id']);
300 $cur_list_id = get_option('mc_list_id');
301 if (!empty($cur_list_id)) {
302 //we *could* support paging, but few users have that many lists (and shouldn't)
303 $lists = $api->lists(array(),0,100);
304 $lists = $lists['data'];
305 //but don't delete if the list still exists...
306 $delete_setup = true;
307 foreach($lists as $list) {
308 if ($list['id'] == $cur_list_id) {
309 $list_id = $_POST['mc_list_id'];
310 $delete_setup = false;
311 }
312 }
313 }
314 } else {
315 $msg = "<p class='error_msg'>".esc_html(__('Uh-oh, we were unable to verify your API Key. Please check them and try again!', 'mailchimp_i18n'))."<br/>";
316 $msg .= __('The server said:', 'mailchimp_i18n')."<em>".esc_html($api->errorMessage)."</em></p>";
317 $username = get_option('mc_username');
318 if (empty($username)) {
319 $delete_setup = true;
320 }
321 }
322
323 // Set a global message
324 mailchimpSF_global_msg($msg);
325
326 // If we need to delete our setup, do it
327 if ($delete_setup){
328 mailchimpSF_delete_setup();
329 }
330
331 //set these for the form fields below
332 $user = $_REQUEST['mc_username'];
333
334 // return compact('user', 'delete_setup', 'list_id')
335 }
336
337 /**
338 * Deletes all mailchimp options
339 **/
340 function mailchimpSF_delete_setup() {
341 delete_option('mc_user_id');
342 delete_option('mc_rewards');
343 delete_option('mc_use_javascript');
344 delete_option('mc_use_unsub_link');
345 delete_option('mc_list_id');
346 delete_option('mc_list_name');
347 delete_option('mc_interest_groups');
348 delete_option('mc_show_interest_groups');
349 $mv = get_option('mc_merge_vars');
350 if (is_array($mv)){
351 foreach($mv as $var){
352 $opt = 'mc_mv_'.$var['tag'];
353 delete_option($opt);
354 }
355 }
356 delete_option('mc_merge_vars');
357 }
358
359 /**
360 * Resets the list settings, there's only one list
361 * that can have settings at a time, so no list_id
362 * parameter is necessary.
363 **/
364 function mailchimpSF_reset_list_settings() {
365
366 delete_option('mc_list_id');
367 delete_option('mc_list_name');
368 delete_option('mc_merge_vars');
369 delete_option('mc_interest_groups');
370
371 delete_option('mc_use_javascript');
372 delete_option('mc_use_unsub_link');
373
374 delete_option('mc_header_content');
375 delete_option('mc_subheader_content');
376 delete_option('mc_submit_text');
377
378 delete_option('mc_custom_style');
379
380 delete_option('mc_header_border_width');
381 delete_option('mc_header_border_color');
382 delete_option('mc_header_background');
383 delete_option('mc_header_text_color');
384
385 delete_option('mc_form_border_width');
386 delete_option('mc_form_border_color');
387 delete_option('mc_form_background');
388 delete_option('mc_form_text_color');
389
390 $msg = '<p class="success_msg">'.esc_html(__('Successfully Reset your List selection... Now you get to pick again!', 'mailchimp_i18n')).'</p>';
391 mailchimpSF_global_msg($msg);
392 }
393
394 /**
395 * Gets or sets a global message based on parameter passed to it
396 *
397 * @return string/bool depending on get/set
398 **/
399 function mailchimpSF_global_msg($msg = null) {
400 global $mcsf_msgs;
401
402 // Make sure we're formed properly
403 if (!is_array($mcsf_msgs)) {
404 $mcsf_msgs = array();
405 }
406
407 // See if we're getting
408 if (is_null($msg)) {
409 return implode('', $mcsf_msgs);
410 }
411
412 // Must be setting
413 $mcsf_msgs[] = $msg;
414 return true;
415 }
416
417 /**
418 * Sets the default options for the option form
419 **/
420 function mailchimpSF_set_form_defaults($list_name = '') {
421 update_option('mc_header_content',__( 'Sign up for', 'mailchimp_i18n' ).' '.$list_name);
422 update_option('mc_submit_text',__( 'Subscribe', 'mailchimp_i18n' ));
423
424 update_option('mc_custom_style','on');
425 update_option('mc_use_javascript','on');
426 update_option('mc_use_unsub_link','off');
427 update_option('mc_header_border_width','1');
428 update_option('mc_header_border_color','E3E3E3');
429 update_option('mc_header_background','FFFFFF');
430 update_option('mc_header_text_color','CC6600');
431
432 update_option('mc_form_border_width','1');
433 update_option('mc_form_border_color','C4D3EA');
434 update_option('mc_form_background','EEF3F8');
435 update_option('mc_form_text_color','555555');
436
437 update_option('mc_show_interest_groups', 'on' );
438 }
439
440 /**
441 * Saves the General Form settings on the options page
442 *
443 * @return void
444 **/
445 function mailchimpSF_save_general_form_settings() {
446 if (isset($_POST['mc_rewards'])){
447 update_option('mc_rewards', 'on');
448 $msg = '<p class="success_msg">'.__('Monkey Rewards turned On!', 'mailchimp_i18n').'</p>';
449 mailchimpSF_global_msg($msg);
450 } else if (get_option('mc_rewards')!='off') {
451 update_option('mc_rewards', 'off');
452 $msg = '<p class="success_msg">'.__('Monkey Rewards turned Off!', 'mailchimp_i18n').'</p>';
453 mailchimpSF_global_msg($msg);
454 }
455 if (isset($_POST['mc_use_javascript'])){
456 update_option('mc_use_javascript', 'on');
457 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned On!', 'mailchimp_i18n').'</p>';
458 mailchimpSF_global_msg($msg);
459 } else if (get_option('mc_use_javascript')!='off') {
460 update_option('mc_use_javascript', 'off');
461 $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned Off!', 'mailchimp_i18n').'</p>';
462 mailchimpSF_global_msg($msg);
463 }
464
465 if (isset($_POST['mc_use_unsub_link'])){
466 update_option('mc_use_unsub_link', 'on');
467 $msg = '<p class="success_msg">'.__('Unsubscribe link turned On!', 'mailchimp_i18n').'</p>';
468 mailchimpSF_global_msg($msg);
469 } else if (get_option('mc_use_unsub_link')!='off') {
470 update_option('mc_use_unsub_link', 'off');
471 $msg = '<p class="success_msg">'.__('Unsubscribe link turned Off!', 'mailchimp_i18n').'</p>';
472 mailchimpSF_global_msg($msg);
473 }
474
475 $content = stripslashes($_POST['mc_header_content']);
476 $content = str_replace("\r\n","<br/>", $content);
477 update_option('mc_header_content', $content );
478
479 $content = stripslashes($_POST['mc_subheader_content']);
480 $content = str_replace("\r\n","<br/>", $content);
481 update_option('mc_subheader_content', $content );
482
483
484 $submit_text = stripslashes($_POST['mc_submit_text']);
485 $submit_text = str_replace("\r\n","", $submit_text);
486 update_option('mc_submit_text', $submit_text);
487
488 // Set Custom Style option
489 update_option('mc_custom_style', (isset($_POST['mc_custom_style'])) ? 'on' : 'off');
490
491 //we told them not to put these things we are replacing in, but let's just make sure they are listening...
492 update_option('mc_header_border_width',str_replace('px','',$_POST['mc_header_border_width']) );
493 update_option('mc_header_border_color', str_replace('#','',$_POST['mc_header_border_color']));
494 update_option('mc_header_background',str_replace('#','',$_POST['mc_header_background']));
495 update_option('mc_header_text_color', str_replace('#','',$_POST['mc_header_text_color']));
496
497 update_option('mc_form_border_width',str_replace('px','',$_POST['mc_form_border_width']) );
498 update_option('mc_form_border_color', str_replace('#','',$_POST['mc_form_border_color']));
499 update_option('mc_form_background',str_replace('#','',$_POST['mc_form_background']));
500 update_option('mc_form_text_color', str_replace('#','',$_POST['mc_form_text_color']));
501
502 update_option('mc_show_interest_groups', (isset($_POST['mc_show_interest_groups'])) ? 'on' : 'off');
503
504 $mv = get_option('mc_merge_vars');
505 if (is_array($mv)) {
506 foreach($mv as $var){
507 $opt = 'mc_mv_'.$var['tag'];
508 if (isset($_POST[$opt]) || $var['req']=='Y'){
509 update_option($opt,'on');
510 } else {
511 update_option($opt,'off');
512 }
513 }
514 }
515 $msg = '<p class="success_msg">'.esc_html(__('Successfully Updated your List Subscribe Form Settings!', 'mailchimp_i18n')).'</p>';
516 mailchimpSF_global_msg($msg);
517 }
518
519 /**
520 * Sees if the user changed the list, and updates options accordingly
521 **/
522 function mailchimpSF_change_list_if_necessary($api_key) {
523 // Simple permission check before going through all this
524 if (!current_user_can(MCSF_CAP_THRESHOLD)) { return; }
525
526 $api = new mailchimpSF_MCAPI($api_key);
527 //we *could* support paging, but few users have that many lists (and shouldn't)
528 $lists = $api->lists(array(),0,100);
529 $lists = $lists['data'];
530
531 /* If our incoming list ID (the one chosen in the select dropdown)
532 is in our array of lists, the set it to be the active list */
533 foreach($lists as $list) {
534 if ($list['id'] == $_POST['mc_list_id']) {
535 $list_id = $_POST['mc_list_id'];
536 $list_name = $list['name'];
537 }
538 }
539
540 $orig_list = get_option('mc_list_id');
541 if ($list_id != '') {
542 update_option('mc_list_id', $list_id);
543 update_option('mc_list_name', $list_name);
544
545 // See if the user changed the list
546 if ($orig_list != $list_id){
547 // The user changed the list, Reset the Form Defaults
548 mailchimpSF_set_form_defaults($list_name);
549 }
550
551 // Grab the merge vars and interest groups
552 $mv = $api->listMergeVars($list_id);
553 $ig = $api->listInterestGroupings($list_id);
554 $ig = $ig[0];
555 update_option('mc_merge_vars', $mv);
556 foreach($mv as $var){
557 $opt = 'mc_mv_'.$var['tag'];
558 //turn them all on by default
559 if ($orig_list != $list_id){
560 update_option($opt, 'on' );
561 }
562 }
563 update_option('mc_interest_groups', $ig);
564
565 $msg = '<p class="success_msg">'.
566 sprintf(
567 __('Success! Loaded and saved the info for %d Merge Variables and %d Interest Groups from your list', 'mailchimp_i18n'),
568 count($mv),
569 count($ig['groups'])
570 ).
571 ' "'.$list_name.'"<br/><br/>'.
572 __('Now you should either Turn On the MailChimp Widget or change your options below, then turn it on.', 'mailchimp_i18n').'</p>';
573 mailchimpSF_global_msg($msg);
574 }
575 }
576
577 /**
578 * Outputs the Settings/Options page
579 */
580 function mailchimpSF_setup_page() {
581
582 // See if we need an upgrade
583 if (mailchimpSF_needs_upgrade()) {
584 // remove password option if it's set
585 mailchimpSF_do_upgrade();
586 }
587
588 ?>
589 <div class="wrap">
590
591 <h2><?php esc_html_e('MailChimp List Setup', 'mailchimp_i18n');?> </h2>
592
593 <?php
594
595 $user = get_option('mc_username');
596 $api_key = get_option('mc_apikey');
597
598 // If we have an API Key, see if we need to change the lists and its options
599 if (!empty($api_key)){
600 mailchimpSF_change_list_if_necessary($api_key);
601 }
602
603
604
605 // Display our success/error message(s) if have them
606 if (mailchimpSF_global_msg() != ''){
607 // Message has already been html escaped, so we don't want to 2x escape it here
608 ?>
609 <div id="mc_message" class=""><?php echo mailchimpSF_global_msg(); ?></div>
610 <?php
611 }
612
613
614 // If we don't have an API Key, do a login form
615 if (get_option('mc_apikey') == '') {
616 ?>
617 <div>
618 <form method="post" action="options-general.php?page=mailchimpSF_options">
619 <h3><?php esc_html_e('Login Info', 'mailchimp_i18n');?></h3>
620 <?php esc_html_e('To start using the MailChimp plugin, we first need to login and get your API Key. Please enter your MailChimp API Key below.', 'mailchimp_i18n'); ?>
621
622 <br/>
623
624 <?php
625 echo sprintf(
626 '%1$s <a href="http://www.mailchimp.com/signup/" target="_blank">%2$s</a>',
627 esc_html(__("Don't have a MailChimp account?", 'mailchimp_i18n')),
628 esc_html(__('Try one for Free!', 'mailchimp_i18n'))
629 );
630 ?>
631
632 <br/>
633
634 <table class="form-table">
635 <tr valign="top">
636 <th scope="row"><?php esc_html_e('API Key', 'mailchimp_i18n'); ?>:</th>
637 <td>
638 <input name="mc_apikey" type="text" id="mc_apikey" class="code" value="<?php echo esc_attr($apikey); ?>" size="32" />
639 <br/>
640 <a href="http://admin.mailchimp.com/account/api-key-popup" target="_blank">get your API Key here</a>
641 </td>
642 </tr>
643 </table>
644
645 <input type="hidden" name="mcsf_action" value="update_mc_apikey"/>
646 <input type="submit" name="Submit" value="<?php esc_attr_e('Save & Check', 'mailchimp_i18n');?>" class="button" />
647 <?php wp_nonce_field('update_mc_api_key', '_mcsf_nonce_action'); ?>
648 </form>
649 </div>
650
651 <?php
652 if (get_option('mc_username')!=''){
653 ?>
654 <strong><?php esc_html_e('Notes', 'mailchimp_i18n'); ?>:</strong>
655 <ul>
656 <li><em><?php esc_html_e('Changing your settings at MailChimp.com may cause this to stop working.', 'mailchimp_i18n'); ?></em></li>
657 <li><em><?php esc_html_e('If you change your login to a different account, the info you have setup below will be erased.', 'mailchimp_i18n'); ?></em></li>
658 <li><em><?php esc_html_e('If any of that happens, no biggie - just reconfigure your login and the items below...', 'mailchimp_i18n'); ?></em></li>
659 </ul>
660 <br/>
661 <?php
662 }
663 } // End of login form
664
665 // Start logout form
666 else {
667 ?>
668 <table style="min-width:400px;">
669 <tr>
670 <td><h3><?php esc_html_e('Logged in as', 'mailchimp_i18n');?>: <?php echo esc_html(get_option('mc_username')); ?></h3>
671 </td>
672 <td>
673 <form method="post" action="options-general.php?page=mailchimpSF_options">
674 <input type="hidden" name="mcsf_action" value="logout"/>
675 <input type="submit" name="Submit" value="<?php esc_attr_e('Logout', 'mailchimp_i18n');?>" class="button" />
676 <?php wp_nonce_field('mc_logout', '_mcsf_nonce_action'); ?>
677 </form>
678 </td>
679 </tr>
680 </table>
681 <?php
682 } // End Logout form
683
684
685
686 //Just get out if nothing else matters...
687 if (get_option('mc_apikey') == '') return;
688
689 if (get_option('mc_apikey')!=''){
690 ?>
691 <h3><?php esc_html_e('Your Lists', 'mailchimp_i18n'); ?></h3>
692
693 <div>
694
695 <p><?php esc_html_e('Please select the List you wish to create a Signup Form for.', 'mailchimp_i18n'); ?></p>
696
697 <form method="post" action="options-general.php?page=mailchimpSF_options">
698 <?php
699 $api = new mailchimpSF_MCAPI(get_option('mc_apikey'));
700 //we *could* support paging, but few users have that many lists (and shouldn't)
701 $lists = $api->lists(array(),0,100);
702 $lists = $lists['data'];
703
704 if (count($lists) == 0) {
705 ?>
706 <span class='error_msg'>
707 <?php
708 echo sprintf(
709 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')),
710 "<a href='http://www.mailchimp.com/'>MailChimp</a>"
711 );
712 ?>
713 </span>
714 <?php
715 }
716 else {
717 ?>
718 <table style="min-width:400px">
719 <tr>
720 <td>
721 <select name="mc_list_id" style="min-width:200px;">
722 <option value=""> &mdash; <?php esc_html_e('Select A List','mailchimp_i18n'); ?> &mdash; </option>
723 <?php
724 foreach ($lists as $list) {
725 $option = get_option('mc_list_id');
726 ?>
727 <option value="<?php echo esc_attr($list['id']); ?>"<?php selected($list['id'], $option); ?>><?php echo esc_html($list['name']); ?></option>
728 <?php
729 }
730 ?>
731 </select>
732 </td>
733 <td>
734 <input type="hidden" name="mcsf_action" value="update_mc_list_id" />
735 <input type="submit" name="Submit" value="<?php esc_attr_e('Update List', 'mailchimp_i18n'); ?>" class="button" />
736 </td>
737 </tr>
738 <tr>
739 <td colspan="2">
740 <strong><?php esc_html_e('Note:', 'mailchimp_i18n'); ?></strong> <em><?php esc_html_e('Updating your list will not cause settings below to be lost. Changing to a new list will.', 'mailchimp_i18n'); ?></em>
741 </td>
742 </tr>
743 </table>
744 <?php
745 } //end select list
746 ?>
747 </form>
748 </div>
749
750 <br/>
751
752 <?php
753 }
754 else {
755 //display the selected list...
756 ?>
757
758 <p class="submit">
759 <form method="post" action="options-general.php?page=mailchimpSF_options">
760 <input type="hidden" name="mcsf_action" value="reset_list" />
761 <input type="submit" name="reset_list" value="<?php esc_attr_e('Reset List Options and Select again', 'mailchimp_i18n'); ?>" class="button" />
762 <?php wp_nonce_field('reset_mailchimp_list', '_mcsf_nonce_action'); ?>
763 </form>
764 </p>
765 <h3><?php esc_html_e('Subscribe Form Widget Settings for this List', 'mailchimp_i18n'); ?>:</h3>
766 <h4><?php esc_html_e('Selected MailChimp List', 'mailchimp_i18n'); ?>: <?php echo esc_html(get_option('mc_list_name')); ?></h4>
767 <?php
768 }
769 //Just get out if nothing else matters...
770 if (get_option('mc_list_id') == '') return;
771
772
773 // The main Settings form
774 ?>
775
776 <div>
777 <form method="post" action="options-general.php?page=mailchimpSF_options">
778 <div style="width:600px;">
779 <input type="hidden" name="mcsf_action" value="change_form_settings">
780 <?php wp_nonce_field('update_general_form_settings', '_mcsf_nonce_action'); ?>
781 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button" />
782 <table class="widefat">
783 <tr valign="top">
784 <th scope="row"><?php esc_html_e('Monkey Rewards', 'mailchimp_i18n'); ?>:</th>
785 <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" />
786 <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>
787 </td>
788 </tr>
789 <tr valign="top">
790 <th scope="row"><?php esc_html_e('Use Javascript Support?', 'mailchimp_i18n'); ?>:</th>
791 <td><input name="mc_use_javascript" type="checkbox" <?php checked(get_option('mc_use_javascript'), 'on'); ?> id="mc_use_javascript" class="code" />
792 <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>
793 </td>
794 </tr>
795 <tr valign="top">
796 <th scope="row"><?php esc_html_e('Include Unsubscribe link?', 'mailchimp_i18n'); ?>:</th>
797 <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" />
798 <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>
799 </td>
800 </tr>
801 <tr valign="top">
802 <th scope="row"><?php esc_html_e('Header content', 'mailchimp_i18n'); ?>:</th>
803 <td>
804 <textarea name="mc_header_content" rows="2" cols="50"><?php echo esc_html(get_option('mc_header_content')); ?></textarea><br/>
805 <em><?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?></em>
806 </td>
807 </tr>
808
809 <tr valign="top">
810 <th scope="row"><?php esc_html_e('Sub-header content', 'mailchimp_i18n'); ?>:</th>
811 <td>
812 <textarea name="mc_subheader_content" rows="2" cols="50"><?php echo esc_html(get_option('mc_subheader_content')); ?></textarea><br/>
813 <em><?php esc_html_e('You can fill this with your own Text, HTML markup (including image links), or Nothing!', 'mailchimp_i18n'); ?></em>.
814 <?php esc_html_e('This will be displayed under the heading and above the form.', 'mailchimp_i18n'); ?>
815 </td>
816 </tr>
817
818
819 <tr valign="top">
820 <th scope="row"><?php esc_html_e('Submit Button text', 'mailchimp_i18n'); ?>:</th>
821 <td>
822 <input type="text" name="mc_submit_text" size="30" value="<?php echo esc_attr(get_option('mc_submit_text')); ?>"/>
823 </td>
824 </tr>
825
826 <tr valign="top">
827 <th scope="row"><?php esc_html_e('Custom Styling', 'mailchimp_i18n'); ?>:</th>
828 <td>
829 <table class="widefat">
830
831 <tr><th><label for="mc_custom_style"><?php esc_html_e('Turned On?', 'mailchimp_i18n'); ?></label></th><td><input type="checkbox" name="mc_custom_style" id="mc_custom_style"<?php checked(get_option('mc_custom_style'), 'on'); ?> /></td></tr>
832 <tr><th colspan="2"><?php esc_html_e('Header Settings (only applies if there are no HTML tags in the Header Content area above)', 'mailchimp_i18n'); ?>:</th></tr>
833 <tr><th><?php esc_html_e('Border Width', 'mailchimp_i18n'); ?>:</th><td><input type="text" name="mc_header_border_width" size="3" maxlength="3" value="<?php echo esc_attr(get_option('mc_header_border_width')); ?>"/> px<br/>
834 <em><?php esc_html_e('Set to 0 for no border, do not enter', 'mailchimp_i18n'); ?> <strong>px</strong>!</em>
835 </td></tr>
836 <tr><th><?php esc_html_e('Border Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_header_border_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_header_border_color')); ?>"/><br/>
837 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
838 </td></tr>
839 <tr><th><?php esc_html_e('Text Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_header_text_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_header_text_color')); ?>"/><br/>
840 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
841 </td></tr>
842 <tr><th><?php esc_html_e('Background Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_header_background" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_header_background')); ?>"/><br/>
843 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
844 </td></tr>
845
846 <tr><th colspan="2"><?php esc_html_e('Form Settings', 'mailchimp_i18n'); ?>:</th></tr>
847 <tr><th><?php esc_html_e('Border Width', 'mailchimp_i18n'); ?>:</th><td><input type="text" name="mc_form_border_width" size="3" maxlength="3" value="<?php echo esc_attr(get_option('mc_form_border_width')); ?>"/> px<br/>
848 <em><?php esc_html_e('Set to 0 for no border, do not enter', 'mailchimp_i18n'); ?> <strong>px</strong>!</em>
849 </td></tr>
850 <tr><th><?php esc_html_e('Border Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_form_border_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_border_color')); ?>"/><br/>
851 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
852 </td></tr>
853 <tr><th><?php esc_html_e('Text Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_form_text_color" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_text_color')); ?>"/><br/>
854 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
855 </td></tr>
856 <tr><th><?php esc_html_e('Background Color', 'mailchimp_i18n'); ?>:</th><td>#<input type="text" name="mc_form_background" size="7" maxlength="6" value="<?php echo esc_attr(get_option('mc_form_background')); ?>"/><br/>
857 <em><?php esc_html_e('do not enter initial', 'mailchimp_i18n'); ?> <strong>#</strong></em>
858 </td></tr>
859 </table>
860 </td>
861 </tr>
862 </table>
863 </div>
864 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button" />
865
866 <?php
867 // Merge Variables Table
868 ?>
869 <div style="width:400px;">
870
871 <h4><?php esc_html_e('Merge Variables Included', 'mailchimp_i18n'); ?></h4>
872
873 <?php
874 $mv = get_option('mc_merge_vars');
875
876 if (count($mv) == 0 || !is_array($mv)){
877 ?>
878 <em><?php esc_html_e('No Merge Variables found.', 'mailchimp_i18n'); ?></em>
879 <?php
880 } else {
881 ?>
882
883 <table class='widefat'>
884 <tr valign="top">
885 <th><?php esc_html_e('Name', 'mailchimp_i18n');?></th>
886 <th><?php esc_html_e('Tag', 'mailchimp_i18n');?></th>
887 <th><?php esc_html_e('Required?', 'mailchimp_i18n');?></th>
888 <th><?php esc_html_e('Include?', 'mailchimp_i18n');?></th>
889 </tr>
890 <?php
891 foreach($mv as $var){
892 ?>
893 <tr valign="top">
894 <td><?php echo esc_html($var['name']); ?></td>
895 <td><?php echo esc_html($var['tag']); ?></td>
896 <td><?php echo esc_html(($var['req'] == 1) ? 'Y' : 'N'); ?></td>
897 <td>
898 <?php
899 if (!$var['req']){
900 $opt = 'mc_mv_'.$var['tag'];
901 ?>
902 <input name="<?php echo esc_attr($opt); ?>" type="checkbox" id="<?php echo esc_attr($opt); ?>" class="code"<?php checked(get_option($opt), 'on'); ?> />
903 <?php
904 } else {
905 ?>
906 &nbsp;&mdash;&nbsp;
907 <?php
908 }
909 ?>
910 </td>
911 </tr>
912 <?php
913 }
914 ?>
915 </table>
916 <?php
917 }
918
919 ?>
920
921 <h4><?php esc_html_e('Interest Groups', 'mailchimp_i18n'); ?></h4>
922
923 <?php
924 // Interest Groups Table
925 $ig = get_option('mc_interest_groups');
926
927 if (!is_array($ig) || empty($ig) || $ig == 'N') {
928 ?>
929 <em><?php esc_html_e('No Interest Groups Setup for this List', 'mailchimp_i18n'); ?></em>
930 <?php
931 }
932 else {
933 ?>
934 <table class='widefat'>
935 <tr valign="top">
936 <th width="75px">
937 <label for="mc_show_interest_groups"><?php esc_html_e('Show?', 'mailchimp_i18n'); ?></label>
938 </th>
939 <th>
940 <input name="mc_show_interest_groups" id="mc_show_interest_groups" type="checkbox" id="mc_show_interest_groups" class="code"<?php checked('on', get_option('mc_show_interest_groups')); ?> />
941 </th>
942 </tr>
943 <tr valign="top">
944 <th><?php esc_html_e('Name', 'mailchimp_i18n'); ?>:</th>
945 <th><?php echo esc_html($ig['name']); ?></th>
946 </tr>
947 <tr valign="top">
948 <th><?php esc_html_e('Input Type', 'mailchimp_i18n'); ?>:</th>
949 <td><?php echo esc_html($ig['form_field']); ?></td>
950 </tr>
951 <tr valign="top">
952 <th><?php esc_html_e('Options', 'mailchimp_i18n'); ?>:</th>
953 <td>
954 <ul>
955 <?php
956 foreach($ig['groups'] as $interest){
957 ?>
958 <li><?php echo esc_html($interest['name']); ?></li>
959 <?php
960 }
961 ?>
962 </ul>
963 </td>
964 </tr>
965 </table>
966 <?php
967 }
968 ?>
969 <p class="submit">
970 <input type="submit" value="<?php esc_attr_e('Update Subscribe Form Settings', 'mailchimp_i18n'); ?>" class="button" />
971 </p>
972 </div>
973 </form>
974 </div>
975 </div><!--wrap-->
976 <?php
977 }//mailchimpSF_setup_page()
978
979
980 function mailchimpSF_register_widgets() {
981 register_widget('mailchimpSF_Widget');
982 }
983 add_action('widgets_init', 'mailchimpSF_register_widgets');
984
985 function mailchimpSF_shortcode($atts){
986 ob_start();
987 mailchimpSF_signup_form();
988 return ob_get_clean();
989 }
990 add_shortcode('mailchimpsf_form', 'mailchimpSF_shortcode');
991
992 /**
993 * Attempts to signup a user, per the $_POST args.
994 *
995 * This sets a global message, that is then used in the widget
996 * output to retrieve and display that message.
997 *
998 * @return bool
999 */
1000 function mailchimpSF_signup_submit() {
1001 $mv = get_option('mc_merge_vars');
1002 $ig = get_option('mc_interest_groups');
1003
1004 $success = true;
1005 $listId = get_option('mc_list_id');
1006 $email = $_POST['mc_mv_EMAIL'];
1007 $merge = $errs = array(); // Set up some vars
1008
1009 // Loop through our Merge Vars, and if they're empty, but required, then print an error, and mark as failed
1010 foreach($mv as $var) {
1011 $opt = 'mc_mv_'.$var['tag'];
1012 if ($var['req'] == 'Y' && trim($_POST[$opt]) == '') {
1013 $success = false;
1014 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name']));
1015 }
1016 else {
1017 if ($var['tag'] != 'EMAIL') {
1018 $merge[$var['tag']] = $_POST[$opt];
1019 }
1020 }
1021 }
1022
1023 // Head back to the beginning of the merge vars array
1024 reset($mv);
1025
1026
1027 if (get_option('mc_show_interest_groups')=='on') {
1028 switch ($ig['form_field']) {
1029 case 'select':
1030 case 'dropdown':
1031 case 'radio':
1032 $merge['INTERESTS'] = str_replace(',', '\,', $_POST['interests']);
1033 break;
1034 case 'checkbox':
1035 if (isset($_POST['interests'])) {
1036 foreach ($_POST['interests'] as $i => $nothing) {
1037 $merge['INTERESTS'] .= str_replace(',', '\,', $i).',';
1038 }
1039 }
1040 break;
1041 default:
1042 // Nothing
1043 break;
1044 }
1045 }
1046
1047
1048 // If we're good
1049 if ($success) {
1050 // Clear out empty merge vars
1051 foreach ($merge as $k => $v) {
1052 if (trim($v) === '') {
1053 unset($merge[$k]);
1054 }
1055 }
1056
1057 // If we have an empty $merge, then assign empty string.
1058 if (count($merge) == 0 || $merge == '') {
1059 $merge = '';
1060 }
1061
1062 $api = new mailchimpSF_MCAPI(get_option('mc_apikey'));
1063 $retval = $api->listSubscribe( $listId, $email, $merge);
1064 if (!$retval) {
1065 switch($api->errorCode) {
1066 case '214' :
1067 $errs[] = __("That email address is already subscribed to the list", 'mailchimp_i18n').'.';
1068 break;
1069 case '250' :
1070 list($field, $rest) = explode(' ', $api->errorMessage, 2);
1071 $errs[] = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($field));
1072 break;
1073 case '254' :
1074 list($i1, $i2, $i3, $field, $rest) = explode(' ',$api->errorMessage,5);
1075 $errs[] = sprintf(__("%s has invalid content.", 'mailchimp_i18n'), esc_html($field));
1076 break;
1077 case '270' :
1078 $errs[] = __("An invalid Interest Group was selected", 'mailchimp_i18n').'.';
1079 break;
1080 case '502' :
1081 $errs[] = __("That email address is invalid", 'mailchimp_i18n').'.';
1082 break;
1083 default:
1084 $errs[] = $api->errorCode.":".$api->errorMessage;
1085 break;
1086 }
1087 $success = false;
1088 }
1089 else {
1090 $msg = "<strong class='mc_success_msg'>".esc_html(__("Success, you've been signed up! Please look for our confirmation email!", 'mailchimp_i18n'))."</strong>";
1091 }
1092 }
1093
1094 // If we have errors, then show them
1095 if (count($errs) > 0) {
1096 $msg = '<span class="mc_error_msg">';
1097 foreach($errs as $error){
1098 $msg .= '&raquo; '.esc_html($error).'<br />';
1099 }
1100 $msg .= '</span>';
1101 }
1102
1103 // Set our global message
1104 mailchimpSF_global_msg($msg);
1105
1106 return $success;
1107 }
1108
1109
1110
1111 /**********************
1112 * Utility Functions *
1113 **********************/
1114 /**
1115 * Utility function to allow placement of plugin in plugins, mu-plugins, child or parent theme's plugins folders
1116 *
1117 * This function must be ran _very early_ in the load process, as it sets up important constants for the rest of the plugin
1118 */
1119 function mailchimpSF_where_am_i() {
1120 $locations = array(
1121 'plugins' => array(
1122 'dir' => WP_PLUGIN_DIR,
1123 'url' => plugins_url()
1124 ),
1125 'mu_plugins' => array(
1126 'dir' => WPMU_PLUGIN_DIR,
1127 'url' => plugins_url(),
1128 ),
1129 'template' => array(
1130 'dir' => trailingslashit(get_template_directory()).'plugins/',
1131 'url' => trailingslashit(get_template_directory_uri()).'plugins/',
1132 ),
1133 'stylesheet' => array(
1134 'dir' => trailingslashit(get_stylesheet_directory()).'plugins/',
1135 'url' => trailingslashit(get_stylesheet_directory_uri()).'plugins/',
1136 ),
1137 );
1138
1139 // Set defaults
1140 $mscf_dir = trailingslashit(WP_PLUGIN_DIR).'mailchimp/';
1141 $mscf_url = trailingslashit(WP_PLUGIN_URL).'mailchimp/';
1142
1143 // Try our hands at finding the real location
1144 foreach ($locations as $key => $loc) {
1145 $dir = trailingslashit($loc['dir']).'mailchimp/';
1146 $url = trailingslashit($loc['url']).'mailchimp/';
1147 if (is_file($dir.basename(__FILE__))) {
1148 $mscf_dir = $dir;
1149 $mscf_url = $url;
1150 break;
1151 }
1152 }
1153 // Define our complete filesystem path
1154 define('MCSF_DIR', $mscf_dir);
1155
1156 /* Lang location needs to be relative *from* ABSPATH,
1157 so strip it out of our language dir location */
1158 define('MCSF_LANG_DIR', str_replace(ABSPATH, '', MCSF_DIR));
1159
1160 // Define our complete URL to the plugin folder
1161 define('MCSF_URL', $mscf_url);
1162 }
1163
1164
1165 ?>
1166