| @@ -1,93 +1,179 @@ | ||
| 1 | 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.5.2 | |
| 7 | -Author: MailChimp | |
| 8 | -Author URI: https://mailchimp.com/ | |
| 9 | -*/ | |
| 10 | -/* Copyright 2008-2012 MailChimp.com (email : api@mailchimp.com) | |
| 2 | +/** | |
| 3 | + * Plugin Name: Mailchimp | |
| 4 | + * Plugin URI: https://mailchimp.com/help/connect-or-disconnect-list-subscribe-for-wordpress/ | |
| 5 | + * Description: Add a Mailchimp signup form block, widget or shortcode to your WordPress site. | |
| 6 | + * Text Domain: mailchimp | |
| 7 | + * Version: 2.1.0 | |
| 8 | + * Requires at least: 6.6 | |
| 9 | + * Requires PHP: 7.4 | |
| 10 | + * PHP tested up to: 8.3 | |
| 11 | + * Author: Mailchimp | |
| 12 | + * Author URI: https://mailchimp.com/ | |
| 13 | + * License: GPL-2.0-or-later | |
| 14 | + * License URI: https://spdx.org/licenses/GPL-2.0-or-later.html | |
| 15 | + * | |
| 16 | + * @package Mailchimp | |
| 17 | + **/ | |
| 11 | 18 | |
| 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. | |
| 19 | +/** | |
| 20 | + * Copyright 2008-2012 Mailchimp.com (email : api@mailchimp.com) | |
| 21 | + * | |
| 22 | + * This program is free software; you can redistribute it and/or modify | |
| 23 | + * it under the terms of the GNU General Public License as published by | |
| 24 | + * the Free Software Foundation; either version 2 of the License, or | |
| 25 | + * (at your option) any later version. | |
| 26 | + * | |
| 27 | + * This program is distributed in the hope that it will be useful, | |
| 28 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 29 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 30 | + * GNU General Public License for more details. | |
| 31 | + * | |
| 32 | + * You should have received a copy of the GNU General Public License | |
| 33 | + * along with this program; if not, write to the Free Software | |
| 34 | + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 35 | + */ | |
| 16 | 36 | |
| 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. | |
| 37 | +// Check if the autoload file exists | |
| 38 | +if ( is_readable( __DIR__ . '/vendor/autoload.php' ) ) { | |
| 39 | + require_once __DIR__ . '/vendor/autoload.php'; | |
| 40 | +} else { | |
| 41 | + add_action( | |
| 42 | + 'admin_notices', | |
| 43 | + function () { | |
| 44 | + ?> | |
| 45 | + <div class="notice notice-error"> | |
| 46 | + <p> | |
| 47 | + <?php | |
| 48 | + echo wp_kses_post( | |
| 49 | + sprintf( | |
| 50 | + /* translators: 1: Command to run, e.g., <code>composer install</code>, 2: Support URL, e.g., https://wordpress.org/support/plugin/mailchimp/. */ | |
| 51 | + __( 'The composer autoload file is not found or not readable. Please contact <a href="%2$s" target="_blank">support</a> if you\'re a user. Please run %1$s if you\'re a developer in a development environment.', 'mailchimp' ), | |
| 52 | + '<code>composer install</code>', | |
| 53 | + 'https://wordpress.org/support/plugin/mailchimp/' | |
| 54 | + ) | |
| 55 | + ); | |
| 56 | + ?> | |
| 57 | + </p> | |
| 58 | + </div> | |
| 59 | + <?php | |
| 60 | + } | |
| 61 | + ); | |
| 21 | 62 | |
| 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 | -*/ | |
| 63 | + // Exit early. | |
| 64 | + return; | |
| 65 | +} | |
| 26 | 66 | |
| 67 | +use function Mailchimp\WordPress\Includes\Admin\{admin_notice_error, admin_notice_success}; | |
| 68 | + | |
| 27 | 69 | // Version constant for easy CSS refreshes |
| 28 | -define('MCSF_VER', '1.5.2'); | |
| 70 | +define( 'MCSF_VER', '2.1.0' ); | |
| 29 | 71 | |
| 30 | 72 | // What's our permission (capability) threshold |
| 31 | -define('MCSF_CAP_THRESHOLD', 'manage_options'); | |
| 73 | +define( 'MCSF_CAP_THRESHOLD', 'manage_options' ); | |
| 32 | 74 | |
| 33 | 75 | // Define our location constants, both MCSF_DIR and MCSF_URL |
| 34 | -mailchimpSF_where_am_i(); | |
| 76 | +mailchimp_sf_where_am_i(); | |
| 35 | 77 | |
| 36 | -// Get our MailChimp API class in scope | |
| 37 | -if (!class_exists('MailChimp_API')) { | |
| 38 | - $path = plugin_dir_path(__FILE__); | |
| 39 | - require_once($path . 'lib/mailchimp/mailchimp.php'); | |
| 78 | +// Get our Mailchimp API class in scope | |
| 79 | +if ( ! class_exists( 'MailChimp_API' ) ) { | |
| 80 | + $path = plugin_dir_path( __FILE__ ); | |
| 81 | + require_once $path . 'lib/mailchimp/mailchimp.php'; | |
| 40 | 82 | } |
| 41 | 83 | |
| 84 | +// Encryption utility class. | |
| 85 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-data-encryption.php'; | |
| 86 | + | |
| 42 | 87 | // includes the widget code so it can be easily called either normally or via ajax |
| 43 | -include_once('mailchimp_widget.php'); | |
| 88 | +require_once 'mailchimp_widget.php'; | |
| 44 | 89 | |
| 45 | 90 | // includes the backwards compatibility functions |
| 46 | -include_once('mailchimp_compat.php'); | |
| 91 | +require_once 'mailchimp_compat.php'; | |
| 47 | 92 | |
| 93 | +// Upgrade routines. | |
| 94 | +require_once 'mailchimp_upgrade.php'; | |
| 95 | + | |
| 96 | +// Init Admin functions. | |
| 97 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-user-sync-backgroud-process.php'; | |
| 98 | +require_once plugin_dir_path( __FILE__ ) . 'includes/admin/class-mailchimp-user-sync.php'; | |
| 99 | +require_once plugin_dir_path( __FILE__ ) . 'includes/admin/class-mailchimp-admin-notices.php'; | |
| 100 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-admin.php'; | |
| 101 | +$admin = new Mailchimp_Admin(); | |
| 102 | +$admin->init(); | |
| 103 | + | |
| 104 | +// Init the blocks. | |
| 105 | +require_once plugin_dir_path( __FILE__ ) . 'includes/blocks/class-mailchimp-list-subscribe-form-blocks.php'; | |
| 106 | +$block = new Mailchimp_List_Subscribe_Form_Blocks(); | |
| 107 | +$block->init(); | |
| 108 | + | |
| 109 | +// Form submission handler class. | |
| 110 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-form-submission.php'; | |
| 111 | +$form_submission = new Mailchimp_Form_Submission(); | |
| 112 | +$form_submission->init(); | |
| 113 | + | |
| 114 | +// Shared bucketing helpers used by both analytics chart data providers. | |
| 115 | +require_once plugin_dir_path( __FILE__ ) . 'includes/trait-mailchimp-analytics-bucketing.php'; | |
| 116 | + | |
| 117 | +// Init Analytics page. | |
| 118 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-analytics.php'; | |
| 119 | +$analytics = new Mailchimp_Analytics(); | |
| 120 | +$analytics->init(); | |
| 121 | + | |
| 122 | +// Analytics data class. | |
| 123 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-analytics-data.php'; | |
| 124 | +$analytics_data = new Mailchimp_Analytics_Data(); | |
| 125 | +$analytics_data->init(); | |
| 126 | + | |
| 127 | +// Subscriber activity (Mailchimp Activity API) data class. | |
| 128 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-subscriber-activity.php'; | |
| 129 | +$subscriber_activity = new Mailchimp_Subscriber_Activity(); | |
| 130 | +$subscriber_activity->init(); | |
| 131 | + | |
| 132 | +// Form performance (local analytics DB) data class. | |
| 133 | +require_once plugin_dir_path( __FILE__ ) . 'includes/class-mailchimp-form-performance.php'; | |
| 134 | +$form_performance = new Mailchimp_Form_Performance(); | |
| 135 | +$form_performance->init(); | |
| 136 | + | |
| 137 | +// Deprecated functions. | |
| 138 | +require_once plugin_dir_path( __FILE__ ) . 'includes/mailchimp-deprecated-functions.php'; | |
| 139 | + | |
| 48 | 140 | /** |
| 49 | 141 | * Do the following plugin setup steps here |
| 50 | 142 | * |
| 51 | - * Internationalization | |
| 52 | 143 | * Resource (JS & CSS) enqueuing |
| 53 | 144 | * |
| 54 | 145 | * @return void |
| 55 | 146 | */ |
| 56 | -function mailchimpSF_plugin_init() { | |
| 57 | - // Internationalize the plugin | |
| 58 | - $textdomain = 'mailchimp_i18n'; | |
| 59 | - $locale = apply_filters( 'plugin_locale', get_locale(), $textdomain); | |
| 60 | - load_textdomain('mailchimp_i18n', MCSF_LANG_DIR.$textdomain.'-'.$locale.'.mo'); | |
| 147 | +function mailchimp_sf_plugin_init() { | |
| 61 | 148 | |
| 62 | - // Check for mc_api_key or sopresto key and continue if neither | |
| 63 | - mailchimpSF_migrate_sopresto(); | |
| 149 | + if ( get_option( 'mc_list_id' ) && get_option( 'mc_merge_field_migrate' ) !== '1' && mailchimp_sf_get_api() !== false ) { | |
| 150 | + mailchimp_sf_update_merge_fields(); | |
| 151 | + } | |
| 64 | 152 | |
| 65 | - if (get_option('mc_list_id') && get_option('mc_merge_field_migrate') != true && mailchimpSF_get_api() !== false) { | |
| 66 | - mailchimpSF_update_merge_fields(get_option('mc_list_id')); | |
| 67 | - } | |
| 68 | - | |
| 69 | - // Bring in our appropriate JS and CSS resources | |
| 70 | - mailchimpSF_load_resources(); | |
| 153 | + if ( mailchimp_sf_should_display_form() ) { | |
| 154 | + // Bring in our appropriate JS and CSS resources | |
| 155 | + add_action( 'wp_enqueue_scripts', 'mailchimp_sf_load_resources' ); | |
| 156 | + } | |
| 71 | 157 | } |
| 72 | 158 | |
| 73 | -add_action( 'init', 'mailchimpSF_plugin_init' ); | |
| 159 | +add_action( 'init', 'mailchimp_sf_plugin_init' ); | |
| 74 | 160 | |
| 75 | - | |
| 76 | 161 | /** |
| 77 | - * Add the settings link to the MailChimp plugin row | |
| 162 | + * Add the settings link to the Mailchimp plugin row | |
| 78 | 163 | * |
| 79 | 164 | * @param array $links - Links for the plugin |
| 80 | 165 | * @return array - Links |
| 81 | 166 | */ |
| 82 | -function mailchimpSD_plugin_action_links($links) { | |
| 83 | - $settings_page = add_query_arg(array('page' => 'mailchimpSF_options'), admin_url('options-general.php')); | |
| 84 | - $settings_link = '<a href="'.esc_url($settings_page).'">'.__('Settings', 'mailchimp_i18n' ).'</a>'; | |
| 85 | - array_unshift($links, $settings_link); | |
| 86 | - return $links; | |
| 167 | +function mailchimp_sf_plugin_action_links( $links ) { | |
| 168 | + $settings_page = add_query_arg( array( 'page' => 'mailchimp_sf_options' ), admin_url( 'admin.php' ) ); | |
| 169 | + $settings_link = '<a href="' . esc_url( $settings_page ) . '">' . esc_html__( 'Settings', 'mailchimp' ) . '</a>'; | |
| 170 | + array_unshift( $links, $settings_link ); | |
| 171 | + return $links; | |
| 87 | 172 | } |
| 88 | -add_filter('plugin_action_links_'.plugin_basename(__FILE__), 'mailchimpSD_plugin_action_links', 10, 1); | |
| 89 | 173 | |
| 174 | +add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), 'mailchimp_sf_plugin_action_links', 10, 1 ); | |
| 175 | + | |
| 90 | 176 | /** |
| 91 | 177 | * Loads the appropriate JS and CSS resources depending on |
| 92 | 178 | * settings and context (admin or not) |
| 93 | 179 | * |
| @@ -92,249 +178,158 @@ | ||
| 92 | 178 | * settings and context (admin or not) |
| 93 | 179 | * |
| 94 | 180 | * @return void |
| 95 | 181 | */ |
| 96 | -function mailchimpSF_load_resources() { | |
| 97 | - // JS | |
| 98 | - if (get_option('mc_use_javascript') == 'on') { | |
| 99 | - if (!is_admin()) { | |
| 100 | - wp_enqueue_script('jquery_scrollto', MCSF_URL.'js/scrollTo.js', array('jquery'), MCSF_VER); | |
| 101 | - wp_enqueue_script('mailchimpSF_main_js', MCSF_URL.'js/mailchimp.js', array('jquery', 'jquery-form'), MCSF_VER); | |
| 102 | - // some javascript to get ajax version submitting to the proper location | |
| 103 | - global $wp_scripts; | |
| 104 | - $wp_scripts->localize('mailchimpSF_main_js', 'mailchimpSF', array( | |
| 105 | - 'ajax_url' => trailingslashit(home_url()), | |
| 106 | - )); | |
| 107 | - } | |
| 108 | - } | |
| 182 | +function mailchimp_sf_load_resources() { | |
| 183 | + // JS | |
| 184 | + wp_enqueue_script( 'mailchimp_sf_main_js', MCSF_URL . 'assets/js/mailchimp.js', array( 'jquery', 'jquery-form', 'jquery-ui-datepicker' ), MCSF_VER, true ); | |
| 185 | + // some javascript to get ajax version submitting to the proper location | |
| 186 | + global $wp_scripts; | |
| 187 | + $localize_data = array( | |
| 188 | + 'ajax_url' => trailingslashit( home_url() ), | |
| 189 | + 'phone_validation_error' => esc_html__( 'Please enter a valid phone number.', 'mailchimp' ), | |
| 190 | + ); | |
| 109 | 191 | |
| 110 | - if (get_option('mc_use_datepicker') == 'on' && !is_admin()) { | |
| 111 | - // Datepicker theme | |
| 112 | - wp_enqueue_style('flick', MCSF_URL.'/css/flick/flick.css'); | |
| 113 | - // Datepicker JS | |
| 114 | - wp_enqueue_script('datepicker', MCSF_URL.'/js/datepicker.js', array('jquery','jquery-ui-core')); | |
| 115 | - } | |
| 192 | + if ( ! is_admin() ) { | |
| 193 | + $localize_data['analytics_ajax_url'] = admin_url( 'admin-ajax.php' ); | |
| 194 | + $localize_data['analytics_nonce'] = wp_create_nonce( 'mailchimp_sf_analytics_nonce' ); | |
| 195 | + } | |
| 116 | 196 | |
| 117 | - if(get_option('mc_nuke_all_styles') !== true) { | |
| 118 | - wp_enqueue_style('mailchimpSF_main_css', home_url('?mcsf_action=main_css&ver='.MCSF_VER, 'relative')); | |
| 119 | - wp_enqueue_style('mailchimpSF_ie_css', MCSF_URL.'css/ie.css'); | |
| 120 | - global $wp_styles; | |
| 121 | - $wp_styles->add_data( 'mailchimpSF_ie_css', 'conditional', 'IE' ); | |
| 122 | - } | |
| 197 | + $wp_scripts->localize( | |
| 198 | + 'mailchimp_sf_main_js', | |
| 199 | + 'mailchimpSF', | |
| 200 | + $localize_data | |
| 201 | + ); | |
| 202 | + | |
| 203 | + // Datepicker theme | |
| 204 | + wp_enqueue_style( 'flick', MCSF_URL . 'assets/css/flick/flick.css', array(), MCSF_VER ); | |
| 205 | + | |
| 206 | + // CSS | |
| 207 | + if ( get_option( 'mc_nuke_all_styles' ) !== '1' ) { | |
| 208 | + wp_enqueue_style( 'mailchimp_sf_main_css', MCSF_URL . 'assets/css/frontend.css', array(), MCSF_VER ); | |
| 209 | + | |
| 210 | + // Backwards compatibility. TODO: Remove this in a future version. | |
| 211 | + if ( get_option( 'mc_custom_style' ) === 'on' ) { | |
| 212 | + $custom_css = mailchimp_sf_custom_style_css(); | |
| 213 | + wp_add_inline_style( 'mailchimp_sf_main_css', $custom_css ); | |
| 214 | + } | |
| 215 | + } | |
| 123 | 216 | } |
| 124 | 217 | |
| 218 | +/** | |
| 219 | + * Custom styles CSS | |
| 220 | + * | |
| 221 | + * @return string | |
| 222 | + */ | |
| 223 | +function mailchimp_sf_custom_style_css() { | |
| 224 | + ob_start(); | |
| 225 | + ?> | |
| 226 | + .mc_signup_form { | |
| 227 | + padding:5px; | |
| 228 | + border-width: <?php echo absint( get_option( 'mc_form_border_width' ) ); ?>px; | |
| 229 | + border-style: <?php echo ( get_option( 'mc_form_border_width' ) === 0 ) ? 'none' : 'solid'; ?>; | |
| 230 | + border-color: #<?php echo esc_attr( get_option( 'mc_form_border_color' ) ); ?>; | |
| 231 | + color: #<?php echo esc_attr( get_option( 'mc_form_text_color' ) ); ?>; | |
| 232 | + background-color: #<?php echo esc_attr( get_option( 'mc_form_background' ) ); ?>; | |
| 233 | + } | |
| 234 | + <?php | |
| 235 | + return ob_get_clean(); | |
| 236 | +} | |
| 125 | 237 | |
| 126 | 238 | /** |
| 127 | - * Loads resources for the MailChimp admin page | |
| 239 | + * Request handler | |
| 128 | 240 | * |
| 129 | 241 | * @return void |
| 130 | 242 | */ |
| 131 | -function mc_admin_page_load_resources() { | |
| 132 | - wp_enqueue_style('mailchimpSF_admin_css', MCSF_URL.'css/admin.css'); | |
| 133 | -} | |
| 134 | -add_action('load-settings_page_mailchimpSF_options', 'mc_admin_page_load_resources'); | |
| 243 | +function mailchimp_sf_request_handler() { | |
| 244 | + if ( isset( $_POST['mcsf_action'] ) ) { | |
| 245 | + switch ( $_POST['mcsf_action'] ) { | |
| 246 | + case 'logout': | |
| 247 | + // Check capability & Verify nonce | |
| 248 | + if ( | |
| 249 | + ! current_user_can( MCSF_CAP_THRESHOLD ) || | |
| 250 | + ! isset( $_POST['_mcsf_nonce_action'] ) || | |
| 251 | + ! wp_verify_nonce( sanitize_key( $_POST['_mcsf_nonce_action'] ), 'mc_logout' ) | |
| 252 | + ) { | |
| 253 | + wp_die( 'Cheatin’ huh?' ); | |
| 254 | + } | |
| 135 | 255 | |
| 256 | + // erase auth information | |
| 257 | + $options = array( 'mc_api_key', 'mailchimp_sf_access_token', 'mc_datacenter', 'mailchimp_sf_auth_error', 'mailchimp_sf_waiting_for_login' ); | |
| 258 | + mailchimp_sf_delete_options( $options ); | |
| 259 | + break; | |
| 260 | + case 'change_form_settings': | |
| 261 | + if ( | |
| 262 | + ! current_user_can( MCSF_CAP_THRESHOLD ) || | |
| 263 | + ! isset( $_POST['_mcsf_nonce_action'] ) || | |
| 264 | + ! wp_verify_nonce( sanitize_key( $_POST['_mcsf_nonce_action'] ), 'update_general_form_settings' ) | |
| 265 | + ) { | |
| 266 | + wp_die( 'Cheatin’ huh?' ); | |
| 267 | + } | |
| 136 | 268 | |
| 137 | -/** | |
| 138 | - * Loads jQuery Datepicker for the date-pick class | |
| 139 | - **/ | |
| 140 | -function mc_datepicker_load() { | |
| 141 | - require_once(MCSF_DIR . '/views/datepicker.php'); | |
| 269 | + // Update the form settings | |
| 270 | + mailchimp_sf_save_general_form_settings(); | |
| 271 | + break; | |
| 272 | + } | |
| 273 | + } | |
| 142 | 274 | } |
| 143 | -if (get_option('mc_use_datepicker') == 'on' && !is_admin()) { | |
| 144 | - add_action('wp_head', 'mc_datepicker_load'); | |
| 145 | -} | |
| 275 | +add_action( 'init', 'mailchimp_sf_request_handler' ); | |
| 146 | 276 | |
| 147 | 277 | /** |
| 148 | - * Handles requests that as light-weight a load as possible. | |
| 149 | - * typically, JS or CSS | |
| 150 | - **/ | |
| 151 | -function mailchimpSF_early_request_handler() { | |
| 152 | - if (isset($_GET['mcsf_action'])) { | |
| 153 | - switch ($_GET['mcsf_action']) { | |
| 154 | - case 'main_css': | |
| 155 | - header("Content-type: text/css"); | |
| 156 | - mailchimpSF_main_css(); | |
| 157 | - exit; | |
| 158 | - } | |
| 159 | - } | |
| 278 | + * Update merge fields | |
| 279 | + * | |
| 280 | + * @return void | |
| 281 | + */ | |
| 282 | +function mailchimp_sf_update_merge_fields() { | |
| 283 | + mailchimp_sf_get_merge_vars( get_option( 'mc_list_id' ), true ); | |
| 284 | + mailchimp_sf_get_interest_categories( get_option( 'mc_list_id' ), true ); | |
| 285 | + update_option( 'mc_merge_field_migrate', true ); | |
| 160 | 286 | } |
| 161 | -add_action('init', 'mailchimpSF_early_request_handler', 0); | |
| 162 | 287 | |
| 163 | 288 | /** |
| 164 | - * Outputs the front-end CSS. This checks several options, so it | |
| 165 | - * was best to put it in a Request-handled script, as opposed to | |
| 166 | - * a static file. | |
| 289 | + * Get auth key | |
| 290 | + * | |
| 291 | + * @param mixed $salt Salt | |
| 292 | + * @return string | |
| 167 | 293 | */ |
| 168 | -function mailchimpSF_main_css() { | |
| 169 | - require_once(MCSF_DIR . '/views/css/frontend.php'); | |
| 294 | +function mailchimp_sf_auth_nonce_key( $salt = null ) { | |
| 295 | + if ( is_null( $salt ) ) { | |
| 296 | + $salt = mailchimp_sf_auth_nonce_salt(); | |
| 297 | + } | |
| 298 | + return 'social_authentication' . md5( AUTH_KEY . $salt ); | |
| 170 | 299 | } |
| 171 | 300 | |
| 172 | - | |
| 173 | 301 | /** |
| 174 | - * Add our settings page to the admin menu | |
| 302 | + * Return auth nonce salt | |
| 175 | 303 | * |
| 176 | - * @return void | |
| 304 | + * @return string | |
| 177 | 305 | */ |
| 178 | -function mailchimpSF_add_pages(){ | |
| 179 | - // Add settings page for users who can edit plugins | |
| 180 | - add_options_page( __( 'MailChimp Setup', 'mailchimp_i18n' ), __( 'MailChimp Setup', 'mailchimp_i18n' ), MCSF_CAP_THRESHOLD, 'mailchimpSF_options', 'mailchimpSF_setup_page'); | |
| 306 | +function mailchimp_sf_auth_nonce_salt() { | |
| 307 | + return md5( microtime() . isset( $_SERVER['SERVER_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_ADDR'] ) ) : '' ); | |
| 181 | 308 | } |
| 182 | -add_action('admin_menu', 'mailchimpSF_add_pages'); | |
| 183 | 309 | |
| 184 | -function mailchimpSF_request_handler() { | |
| 185 | - if (isset($_POST['mcsf_action'])) { | |
| 186 | - switch ($_POST['mcsf_action']) { | |
| 187 | - case 'login': | |
| 188 | - $key = trim($_POST['mailchimpSF_api_key']); | |
| 189 | - | |
| 190 | - try { | |
| 191 | - $api = new MailChimp_API($key); | |
| 192 | - } catch (Exception $e) { | |
| 193 | - $msg = "<strong class='mc_error_msg'>" . $e->getMessage() . "</strong>"; | |
| 194 | - mailchimpSF_global_msg($msg); | |
| 195 | - break; | |
| 196 | - } | |
| 197 | - | |
| 198 | - $key = mailchimpSF_verify_key($api); | |
| 199 | - if(is_wp_error($key)) { | |
| 200 | - $msg = "<strong class='mc_error_msg'>" . $key->get_error_message() . "</strong>"; | |
| 201 | - mailchimpSF_global_msg($msg); | |
| 202 | - } | |
| 203 | - | |
| 204 | - break; | |
| 205 | - case 'logout': | |
| 206 | - // Check capability & Verify nonce | |
| 207 | - if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'mc_logout')) { | |
| 208 | - wp_die('Cheatin’ huh?'); | |
| 209 | - } | |
| 210 | - | |
| 211 | - // erase auth information | |
| 212 | - $options = array('mc_api_key', 'mc_sopresto_user', 'mc_sopresto_public_key', 'mc_sopresto_secret_key'); | |
| 213 | - mailchimpSF_delete_options($options); | |
| 214 | - break; | |
| 215 | - case 'change_form_settings': | |
| 216 | - if (!current_user_can(MCSF_CAP_THRESHOLD) || !wp_verify_nonce($_POST['_mcsf_nonce_action'], 'update_general_form_settings')) { | |
| 217 | - wp_die('Cheatin’ huh?'); | |
| 218 | - } | |
| 219 | - | |
| 220 | - // Update the form settings | |
| 221 | - mailchimpSF_save_general_form_settings(); | |
| 222 | - break; | |
| 223 | - case 'mc_submit_signup_form': | |
| 224 | - // Validate nonce | |
| 225 | - if (!wp_verify_nonce($_POST['_mc_submit_signup_form_nonce'], 'mc_submit_signup_form')) { | |
| 226 | - wp_die('Cheatin’ huh?'); | |
| 227 | - } | |
| 228 | - | |
| 229 | - // Attempt the signup | |
| 230 | - mailchimpSF_signup_submit(); | |
| 231 | - | |
| 232 | - // Do a different action for html vs. js | |
| 233 | - switch ($_POST['mc_submit_type']) { | |
| 234 | - case 'html': | |
| 235 | - /* Allow to fall through. The widget will pick up the | |
| 236 | - * global message left over from the signup_submit function */ | |
| 237 | - break; | |
| 238 | - case 'js': | |
| 239 | - if (!headers_sent()){ //just in case... | |
| 240 | - header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT', true, 200); | |
| 241 | - } | |
| 242 | - echo mailchimpSF_global_msg(); // Don't esc_html this, b/c we've already escaped it | |
| 243 | - exit; | |
| 244 | - } | |
| 245 | - } | |
| 246 | - } | |
| 247 | -} | |
| 248 | -add_action('init', 'mailchimpSF_request_handler'); | |
| 249 | - | |
| 250 | -function mailchimpSF_migrate_sopresto() { | |
| 251 | - $sopresto = get_option('mc_sopresto_secret_key'); | |
| 252 | - if(!$sopresto) { | |
| 253 | - return; | |
| 254 | - } | |
| 255 | - | |
| 256 | - // Talk to Sopresto, make exchange, delete old sopresto things. | |
| 257 | - $body = array( | |
| 258 | - 'public_key' => get_option('mc_sopresto_public_key'), | |
| 259 | - 'hash' => sha1(get_option('mc_sopresto_public_key').get_option('mc_sopresto_secret_key')) | |
| 260 | - ); | |
| 261 | - | |
| 262 | - $url = 'https://sopresto.socialize-this.com/mailchimp/exchange'; | |
| 263 | - $args = array( | |
| 264 | - 'method' => 'POST', | |
| 265 | - 'timeout' => 500, | |
| 266 | - 'redirection' => 5, | |
| 267 | - 'httpversion' => '1.0', | |
| 268 | - 'user-agent' => 'MailChimp WordPress Plugin/' . get_bloginfo( 'url' ), | |
| 269 | - 'body' => $body | |
| 270 | - ); | |
| 271 | - | |
| 272 | - //post to sopresto | |
| 273 | - $key = wp_remote_post($url, $args); | |
| 274 | - if(!is_wp_error($key) && $key['response']['code'] == 200) { | |
| 275 | - $key = json_decode($key['body']); | |
| 276 | - try { | |
| 277 | - $api = new MailChimp_API($key->response); | |
| 278 | - } catch (Exception $e) { | |
| 279 | - $msg = "<strong class='mc_error_msg'>" . $e->getMessage() . "</strong>"; | |
| 280 | - mailchimpSF_global_msg($msg); | |
| 281 | - return; | |
| 282 | - } | |
| 283 | - | |
| 284 | - $verify = mailchimpSF_verify_key($api); | |
| 285 | - | |
| 286 | - //something went wrong with the key that we had | |
| 287 | - if(is_wp_error($verify)) { | |
| 288 | - return; | |
| 289 | - } | |
| 290 | - | |
| 291 | - delete_option('mc_sopresto_public_key'); | |
| 292 | - delete_option('mc_sopresto_secret_key'); | |
| 293 | - delete_option('mc_sopresto_user'); | |
| 294 | - | |
| 295 | - return; | |
| 296 | - } | |
| 297 | - | |
| 298 | - // Nothing to do here. | |
| 299 | - return; | |
| 300 | -} | |
| 301 | - | |
| 302 | -function mailchimpSF_update_merge_fields($list_id) | |
| 303 | -{ | |
| 304 | - mailchimpSF_get_merge_vars(get_option('mc_list_id'), true); | |
| 305 | - mailchimpSF_get_interest_categories(get_option('mc_list_id'), true); | |
| 306 | - update_option('mc_merge_field_migrate', true); | |
| 307 | -} | |
| 308 | - | |
| 309 | -function mailchimpSF_auth_nonce_key($salt = null) { | |
| 310 | - if (is_null($salt)) { | |
| 311 | - $salt = mailchimpSF_auth_nonce_salt(); | |
| 312 | - } | |
| 313 | - return 'social_authentication' . md5( AUTH_KEY . $salt ); | |
| 314 | -} | |
| 315 | - | |
| 316 | -function mailchimpSF_auth_nonce_salt() { | |
| 317 | - return md5(microtime().$_SERVER['SERVER_ADDR']); | |
| 318 | -} | |
| 319 | - | |
| 320 | 310 | /** |
| 321 | - * Creates new MailChimp API v3 object | |
| 311 | + * Creates new Mailchimp API v3 object | |
| 322 | 312 | * |
| 323 | 313 | * @return MailChimp_API | false |
| 324 | 314 | */ |
| 315 | +function mailchimp_sf_get_api() { | |
| 316 | + // Check for the access token first. | |
| 317 | + $access_token = mailchimp_sf_get_access_token(); | |
| 318 | + $data_center = get_option( 'mc_datacenter' ); | |
| 319 | + if ( ! empty( $access_token ) && ! empty( $data_center ) ) { | |
| 320 | + return new MailChimp_API( $access_token, $data_center ); | |
| 321 | + } | |
| 325 | 322 | |
| 326 | -function mailchimpSF_get_api($force = false) { | |
| 327 | - $key = get_option('mc_api_key'); | |
| 328 | - if($key) { | |
| 329 | - return new MailChimp_API($key); | |
| 330 | - } | |
| 323 | + // Check for the API key if the access token is not available. | |
| 324 | + $key = get_option( 'mc_api_key' ); | |
| 325 | + if ( $key ) { | |
| 326 | + return new MailChimp_API( $key ); | |
| 327 | + } | |
| 331 | 328 | |
| 332 | - return false; | |
| 329 | + return false; | |
| 333 | 330 | } |
| 334 | 331 | |
| 335 | - | |
| 336 | - | |
| 337 | 332 | /** |
| 338 | 333 | * Checks to see if we're storing a password, if so, we need |
| 339 | 334 | * to upgrade to the API key |
| 340 | 335 | * |
| @@ -339,92 +334,117 @@ | ||
| 339 | 334 | * to upgrade to the API key |
| 340 | 335 | * |
| 341 | 336 | * @return bool |
| 342 | 337 | **/ |
| 343 | -function mailchimpSF_needs_upgrade() { | |
| 344 | - $igs = get_option('mc_interest_groups'); | |
| 338 | +function mailchimp_sf_needs_upgrade() { | |
| 339 | + $igs = get_option( 'mc_interest_groups' ); | |
| 345 | 340 | |
| 346 | - if ($igs !== false // we have an option | |
| 347 | - && ( | |
| 348 | - empty($igs) || // it can be an empty array (no interest groups) | |
| 349 | - (is_array($igs) && isset($igs[0]['id'])) // OR it should be a populated array that's well-formed | |
| 350 | - )) { | |
| 351 | - return false; // no need to upgrade | |
| 352 | - } | |
| 353 | - else { | |
| 354 | - return true; // yeah, let's do it | |
| 355 | - } | |
| 341 | + if ( false !== $igs // we have an option | |
| 342 | + && ( | |
| 343 | + empty( $igs ) || // it can be an empty array (no interest groups) | |
| 344 | + ( is_array( $igs ) && isset( $igs[0]['id'] ) ) // OR it should be a populated array that's well-formed | |
| 345 | + ) | |
| 346 | + ) { | |
| 347 | + return false; // no need to upgrade | |
| 348 | + } else { | |
| 349 | + return true; // yeah, let's do it | |
| 350 | + } | |
| 356 | 351 | } |
| 357 | 352 | |
| 358 | 353 | /** |
| 359 | - * Deletes all mailchimp options | |
| 354 | + * Deletes all Mailchimp options | |
| 355 | + * | |
| 356 | + * TODO: The options names should be moved to a config file | |
| 357 | + * or to a class dedicated to options | |
| 360 | 358 | **/ |
| 361 | -function mailchimpSF_delete_setup() { | |
| 362 | - $options = array('mc_user_id', 'mc_sopresto_user', 'mc_sopresto_public_key', 'mc_sopresto_secret_key', 'mc_rewards', 'mc_use_javascript', 'mc_use_datepicker', 'mc_use_unsub_link', 'mc_list_id', 'mc_list_name', 'mc_interest_groups', 'mc_merge_vars'); | |
| 359 | +function mailchimp_sf_delete_setup() { | |
| 360 | + $options = array( | |
| 361 | + 'mc_user_id', | |
| 362 | + 'mc_use_unsub_link', | |
| 363 | + 'mc_list_id', | |
| 364 | + 'mc_list_name', | |
| 365 | + 'mc_interest_groups', | |
| 366 | + 'mc_merge_vars', | |
| 367 | + ); | |
| 363 | 368 | |
| 364 | - $igs = get_option('mc_interest_groups'); | |
| 365 | - if (is_array($igs)) { | |
| 366 | - foreach ($igs as $ig) { | |
| 367 | - $opt = 'mc_show_interest_groups_'.$ig['id']; | |
| 368 | - $options[] = $opt; | |
| 369 | - } | |
| 370 | - } | |
| 369 | + $igs = get_option( 'mc_interest_groups' ); | |
| 370 | + if ( is_array( $igs ) ) { | |
| 371 | + foreach ( $igs as $ig ) { | |
| 372 | + $opt = 'mc_show_interest_groups_' . $ig['id']; | |
| 373 | + $options[] = $opt; | |
| 374 | + } | |
| 375 | + } | |
| 371 | 376 | |
| 372 | - $mv = get_option('mc_merge_vars'); | |
| 373 | - if (is_array($mv)){ | |
| 374 | - foreach($mv as $var){ | |
| 375 | - $opt = 'mc_mv_'.$var['tag']; | |
| 376 | - $options[] = $opt; | |
| 377 | - } | |
| 378 | - } | |
| 379 | - | |
| 380 | - mailchimpSF_delete_options($options); | |
| 377 | + $mv = get_option( 'mc_merge_vars' ); | |
| 378 | + if ( is_array( $mv ) ) { | |
| 379 | + foreach ( $mv as $mv_var ) { | |
| 380 | + $opt = 'mc_mv_' . $mv_var['tag']; | |
| 381 | + $options[] = $opt; | |
| 382 | + } | |
| 383 | + } | |
| 384 | + | |
| 385 | + mailchimp_sf_delete_options( $options ); | |
| 381 | 386 | } |
| 382 | 387 | |
| 383 | 388 | /** |
| 384 | - * Gets or sets a global message based on parameter passed to it | |
| 389 | + * Gets or sets a frontend message based on parameter passed to it | |
| 385 | 390 | * |
| 391 | + * Used to convey error messages to the user outside of the WP Admin | |
| 392 | + * | |
| 393 | + * On the plugin settings page, WP admin notices are used exclusively | |
| 394 | + * instead of the frontend message. | |
| 395 | + * | |
| 396 | + * @param mixed $msg Message | |
| 386 | 397 | * @return string/bool depending on get/set |
| 387 | - **/ | |
| 388 | -function mailchimpSF_global_msg($msg = null) { | |
| 389 | - global $mcsf_msgs; | |
| 398 | + */ | |
| 399 | +function mailchimp_sf_frontend_msg( $msg = null ) { | |
| 400 | + global $mcsf_msgs; | |
| 390 | 401 | |
| 391 | - // Make sure we're formed properly | |
| 392 | - if (!is_array($mcsf_msgs)) { | |
| 393 | - $mcsf_msgs = array(); | |
| 394 | - } | |
| 402 | + // Make sure we're formed properly | |
| 403 | + if ( ! is_array( $mcsf_msgs ) ) { | |
| 404 | + $mcsf_msgs = array(); | |
| 405 | + } | |
| 395 | 406 | |
| 396 | - // See if we're getting | |
| 397 | - if (is_null($msg)) { | |
| 398 | - return implode('', $mcsf_msgs); | |
| 399 | - } | |
| 407 | + // See if we're getting | |
| 408 | + if ( is_null( $msg ) ) { | |
| 409 | + return implode( '', $mcsf_msgs ); | |
| 410 | + } | |
| 400 | 411 | |
| 401 | - // Must be setting | |
| 402 | - $mcsf_msgs[] = $msg; | |
| 403 | - return true; | |
| 412 | + // Must be setting | |
| 413 | + $mcsf_msgs[] = $msg; | |
| 414 | + return true; | |
| 404 | 415 | } |
| 405 | 416 | |
| 406 | 417 | /** |
| 418 | + * Gets or sets a frontend message based on parameter passed to it | |
| 419 | + * | |
| 420 | + * TODO: Deprecate this function in favor of mailchimp_sf_frontend_msg() | |
| 421 | + * | |
| 422 | + * @param mixed $msg Message | |
| 423 | + * @return string/bool depending on get/set | |
| 424 | + */ | |
| 425 | +function mailchimp_sf_global_msg( $msg = null ) { | |
| 426 | + return mailchimp_sf_frontend_msg( $msg ); | |
| 427 | +} | |
| 428 | + | |
| 429 | +/** | |
| 407 | 430 | * Sets the default options for the option form |
| 408 | - **/ | |
| 409 | -function mailchimpSF_set_form_defaults($list_name = '') { | |
| 410 | - update_option('mc_header_content',__( 'Sign up for', 'mailchimp_i18n' ).' '.$list_name); | |
| 411 | - update_option('mc_submit_text',__( 'Subscribe', 'mailchimp_i18n' )); | |
| 431 | + * | |
| 432 | + * @param string $list_name The Mailchimp list name. | |
| 433 | + * @return void | |
| 434 | + */ | |
| 435 | +function mailchimp_sf_set_form_defaults( $list_name = '' ) { | |
| 436 | + update_option( 'mc_header_content', esc_html__( 'Sign up for', 'mailchimp' ) . ' ' . $list_name ); | |
| 437 | + update_option( 'mc_submit_text', esc_html__( 'Subscribe', 'mailchimp' ) ); | |
| 412 | 438 | |
| 413 | - update_option('mc_use_datepicker', 'on'); | |
| 414 | - update_option('mc_custom_style','off'); | |
| 415 | - update_option('mc_use_javascript','on'); | |
| 416 | - update_option('mc_double_optin', true); | |
| 417 | - update_option('mc_use_unsub_link','off'); | |
| 418 | - update_option('mc_header_border_width','1'); | |
| 419 | - update_option('mc_header_border_color','E3E3E3'); | |
| 420 | - update_option('mc_header_background','FFFFFF'); | |
| 421 | - update_option('mc_header_text_color','CC6600'); | |
| 439 | + update_option( 'mc_custom_style', 'off' ); | |
| 440 | + update_option( 'mc_double_optin', true ); | |
| 441 | + update_option( 'mc_use_unsub_link', 'off' ); | |
| 422 | 442 | |
| 423 | - update_option('mc_form_border_width','1'); | |
| 424 | - update_option('mc_form_border_color','E0E0E0'); | |
| 425 | - update_option('mc_form_background','FFFFFF'); | |
| 426 | - update_option('mc_form_text_color','3F3F3f'); | |
| 443 | + update_option( 'mc_form_border_width', '1' ); | |
| 444 | + update_option( 'mc_form_border_color', 'E0E0E0' ); | |
| 445 | + update_option( 'mc_form_background', 'FFFFFF' ); | |
| 446 | + update_option( 'mc_form_text_color', '3F3F3f' ); | |
| 427 | 447 | } |
| 428 | 448 | |
| 429 | 449 | /** |
| 430 | 450 | * Saves the General Form settings on the options page |
| @@ -430,692 +450,484 @@ | ||
| 430 | 450 | * Saves the General Form settings on the options page |
| 431 | 451 | * |
| 432 | 452 | * @return void |
| 433 | 453 | **/ |
| 434 | -function mailchimpSF_save_general_form_settings() { | |
| 454 | +function mailchimp_sf_save_general_form_settings() { | |
| 455 | + // phpcs:disable WordPress.Security.NonceVerification.Missing -- Nonce check is already done in the mailchimp_sf_request_handler() function. | |
| 456 | + /*Enable double optin toggle*/ | |
| 457 | + if ( isset( $_POST['mc_double_optin'] ) ) { | |
| 458 | + update_option( 'mc_double_optin', true ); | |
| 459 | + $msg = esc_html__( 'Double opt-in turned On!', 'mailchimp' ); | |
| 460 | + admin_notice_success( $msg ); | |
| 461 | + } elseif ( get_option( 'mc_double_optin' ) !== false ) { | |
| 462 | + update_option( 'mc_double_optin', false ); | |
| 463 | + $msg = esc_html__( 'Double opt-in turned Off!', 'mailchimp' ); | |
| 464 | + admin_notice_success( $msg ); | |
| 465 | + } | |
| 435 | 466 | |
| 436 | - // IF NOT DEV MODE | |
| 437 | - if (isset($_POST['mc_rewards'])){ | |
| 438 | - update_option('mc_rewards', 'on'); | |
| 439 | - $msg = '<p class="success_msg">'.__('Monkey Rewards turned On!', 'mailchimp_i18n').'</p>'; | |
| 440 | - mailchimpSF_global_msg($msg); | |
| 441 | - } else if (get_option('mc_rewards')!='off') { | |
| 442 | - update_option('mc_rewards', 'off'); | |
| 443 | - $msg = '<p class="success_msg">'.__('Monkey Rewards turned Off!', 'mailchimp_i18n').'</p>'; | |
| 444 | - mailchimpSF_global_msg($msg); | |
| 445 | - } | |
| 446 | - if (isset($_POST['mc_use_javascript'])){ | |
| 447 | - update_option('mc_use_javascript', 'on'); | |
| 448 | - $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned On!', 'mailchimp_i18n').'</p>'; | |
| 449 | - mailchimpSF_global_msg($msg); | |
| 450 | - } else if (get_option('mc_use_javascript')!='off') { | |
| 451 | - update_option('mc_use_javascript', 'off'); | |
| 452 | - $msg = '<p class="success_msg">'.__('Fancy Javascript submission turned Off!', 'mailchimp_i18n').'</p>'; | |
| 453 | - mailchimpSF_global_msg($msg); | |
| 454 | - } | |
| 467 | + /* NUKE the CSS! */ | |
| 468 | + if ( isset( $_POST['mc_nuke_all_styles'] ) ) { | |
| 469 | + update_option( 'mc_nuke_all_styles', true ); | |
| 470 | + $msg = esc_html__( 'Mailchimp CSS turned Off!', 'mailchimp' ); | |
| 471 | + admin_notice_success( $msg ); | |
| 472 | + } elseif ( get_option( 'mc_nuke_all_styles' ) !== false ) { | |
| 473 | + update_option( 'mc_nuke_all_styles', false ); | |
| 474 | + $msg = esc_html__( 'Mailchimp CSS turned On!', 'mailchimp' ); | |
| 475 | + admin_notice_success( $msg ); | |
| 476 | + } | |
| 455 | 477 | |
| 456 | - if (isset($_POST['mc_use_datepicker'])){ | |
| 457 | - update_option('mc_use_datepicker', 'on'); | |
| 458 | - $msg = '<p class="success_msg">'.__('Datepicker turned On!', 'mailchimp_i18n').'</p>'; | |
| 459 | - mailchimpSF_global_msg($msg); | |
| 460 | - } else if (get_option('mc_use_datepicker')!='off') { | |
| 461 | - update_option('mc_use_datepicker', 'off'); | |
| 462 | - $msg = '<p class="success_msg">'.__('Datepicker turned Off!', 'mailchimp_i18n').'</p>'; | |
| 463 | - mailchimpSF_global_msg($msg); | |
| 464 | - } | |
| 478 | + /* Update existing */ | |
| 479 | + if ( isset( $_POST['mc_update_existing'] ) ) { | |
| 480 | + update_option( 'mc_update_existing', true ); | |
| 481 | + $msg = esc_html__( 'Update existing subscribers turned On!', 'mailchimp' ); | |
| 482 | + admin_notice_success( $msg ); | |
| 483 | + } elseif ( get_option( 'mc_update_existing' ) !== false ) { | |
| 484 | + update_option( 'mc_update_existing', false ); | |
| 485 | + $msg = esc_html__( 'Update existing subscribers turned Off!', 'mailchimp' ); | |
| 486 | + admin_notice_success( $msg ); | |
| 487 | + } | |
| 465 | 488 | |
| 466 | - /*Enable double optin toggle*/ | |
| 467 | - | |
| 468 | - if(isset($_POST['mc_double_optin'])) { | |
| 469 | - update_option('mc_double_optin', true); | |
| 470 | - $msg = '<p class="success_msg">'.__('Double opt-in turned On!', 'mailchimp_i18n').'</p>'; | |
| 471 | - mailchimpSF_global_msg($msg); | |
| 472 | - } else if (get_option('mc_double_optin') != false) { | |
| 473 | - update_option('mc_double_optin', false); | |
| 474 | - $msg = '<p class="success_msg">'.__('Double opt-in turned Off!', 'mailchimp_i18n').'</p>'; | |
| 475 | - mailchimpSF_global_msg($msg); | |
| 476 | - } | |
| 489 | + if ( isset( $_POST['mc_use_unsub_link'] ) ) { | |
| 490 | + update_option( 'mc_use_unsub_link', 'on' ); | |
| 491 | + $msg = esc_html__( 'Unsubscribe link turned On!', 'mailchimp' ); | |
| 492 | + admin_notice_success( $msg ); | |
| 493 | + } elseif ( get_option( 'mc_use_unsub_link' ) !== 'off' ) { | |
| 494 | + update_option( 'mc_use_unsub_link', 'off' ); | |
| 495 | + $msg = esc_html__( 'Unsubscribe link turned Off!', 'mailchimp' ); | |
| 496 | + admin_notice_success( $msg ); | |
| 497 | + } | |
| 477 | 498 | |
| 478 | - /* NUKE the CSS! */ | |
| 479 | - if(isset($_POST['mc_nuke_all_styles'])) { | |
| 480 | - update_option('mc_nuke_all_styles', true); | |
| 481 | - $msg = '<p class="success_msg">'.__('MailChimp CSS turned Off!', 'mailchimp_i18n').'</p>'; | |
| 482 | - mailchimpSF_global_msg($msg); | |
| 483 | - }elseif (get_option('mc_nuke_all_styles') !== false) { | |
| 484 | - update_option('mc_nuke_all_styles', false); | |
| 485 | - $msg = '<p class="success_msg">'.__('MailChimp CSS turned On!', 'mailchimp_i18n').'</p>'; | |
| 486 | - mailchimpSF_global_msg($msg); | |
| 487 | - } | |
| 499 | + $content = isset( $_POST['mc_header_content'] ) ? wp_kses_post( wp_unslash( $_POST['mc_header_content'] ) ) : ''; | |
| 500 | + $content = str_replace( "\r\n", '<br/>', $content ); | |
| 501 | + update_option( 'mc_header_content', $content ); | |
| 488 | 502 | |
| 489 | - /* Update existing */ | |
| 490 | - if (isset($_POST['mc_update_existing'])) { | |
| 491 | - update_option('mc_update_existing', true); | |
| 492 | - $msg = '<p class="success_msg">' . __('Update existing subscribers turned On!') . '</p>'; | |
| 493 | - mailchimpSF_global_msg($msg); | |
| 494 | - } elseif (get_option('mc_update_existing') ==! false) { | |
| 495 | - update_option('mc_update_existing', false); | |
| 496 | - $msg = '<p class="success_msg">' . __('Update existing subscribers turned Off!') . '</p>'; | |
| 497 | - mailchimpSF_global_msg($msg); | |
| 498 | - } | |
| 503 | + $content = isset( $_POST['mc_subheader_content'] ) ? wp_kses_post( wp_unslash( $_POST['mc_subheader_content'] ) ) : ''; | |
| 504 | + $content = str_replace( "\r\n", '<br/>', $content ); | |
| 505 | + update_option( 'mc_subheader_content', $content ); | |
| 499 | 506 | |
| 500 | - if (isset($_POST['mc_use_unsub_link'])){ | |
| 501 | - update_option('mc_use_unsub_link', 'on'); | |
| 502 | - $msg = '<p class="success_msg">'.__('Unsubscribe link turned On!', 'mailchimp_i18n').'</p>'; | |
| 503 | - mailchimpSF_global_msg($msg); | |
| 504 | - } | |
| 507 | + $submit_text = isset( $_POST['mc_submit_text'] ) ? sanitize_text_field( wp_unslash( $_POST['mc_submit_text'] ) ) : ''; | |
| 508 | + $submit_text = str_replace( "\r\n", '', $submit_text ); | |
| 509 | + update_option( 'mc_submit_text', $submit_text ); | |
| 505 | 510 | |
| 506 | - elseif (get_option('mc_use_unsub_link')!='off') { | |
| 507 | - update_option('mc_use_unsub_link', 'off'); | |
| 508 | - $msg = '<p class="success_msg">'.__('Unsubscribe link turned Off!', 'mailchimp_i18n').'</p>'; | |
| 509 | - mailchimpSF_global_msg($msg); | |
| 510 | - } | |
| 511 | + // Set Custom Style option | |
| 512 | + update_option( 'mc_custom_style', isset( $_POST['mc_custom_style'] ) ? 'on' : 'off' ); | |
| 511 | 513 | |
| 512 | - $content = stripslashes($_POST['mc_header_content']); | |
| 513 | - $content = str_replace("\r\n","<br/>", $content); | |
| 514 | - update_option('mc_header_content', $content ); | |
| 514 | + // we told them not to put these things we are replacing in, but let's just make sure they are listening... | |
| 515 | + if ( isset( $_POST['mc_form_border_width'] ) ) { | |
| 516 | + update_option( 'mc_form_border_width', str_replace( 'px', '', absint( $_POST['mc_form_border_width'] ) ) ); | |
| 517 | + } | |
| 518 | + if ( isset( $_POST['mc_form_border_color'] ) ) { | |
| 519 | + update_option( 'mc_form_border_color', str_replace( '#', '', sanitize_text_field( wp_unslash( $_POST['mc_form_border_color'] ) ) ) ); | |
| 520 | + } | |
| 521 | + if ( isset( $_POST['mc_form_background'] ) ) { | |
| 522 | + update_option( 'mc_form_background', str_replace( '#', '', sanitize_text_field( wp_unslash( $_POST['mc_form_background'] ) ) ) ); | |
| 523 | + } | |
| 524 | + if ( isset( $_POST['mc_form_text_color'] ) ) { | |
| 525 | + update_option( 'mc_form_text_color', str_replace( '#', '', sanitize_text_field( wp_unslash( $_POST['mc_form_text_color'] ) ) ) ); | |
| 526 | + } | |
| 515 | 527 | |
| 516 | - $content = stripslashes($_POST['mc_subheader_content']); | |
| 517 | - $content = str_replace("\r\n","<br/>", $content); | |
| 518 | - update_option('mc_subheader_content', $content ); | |
| 528 | + // IF NOT DEV MODE | |
| 529 | + $igs = get_option( 'mc_interest_groups' ); | |
| 530 | + if ( is_array( $igs ) ) { | |
| 531 | + foreach ( $igs as $mv_var ) { | |
| 532 | + $opt = 'mc_show_interest_groups_' . $mv_var['id']; | |
| 533 | + if ( isset( $_POST[ $opt ] ) ) { | |
| 534 | + update_option( $opt, 'on' ); | |
| 535 | + } else { | |
| 536 | + update_option( $opt, 'off' ); | |
| 537 | + } | |
| 538 | + } | |
| 539 | + } | |
| 519 | 540 | |
| 541 | + $mv = get_option( 'mc_merge_vars' ); | |
| 542 | + if ( is_array( $mv ) ) { | |
| 543 | + foreach ( $mv as $mv_var ) { | |
| 544 | + $opt = 'mc_mv_' . $mv_var['tag']; | |
| 545 | + if ( isset( $_POST[ $opt ] ) || true === (bool) $mv_var['required'] ) { | |
| 546 | + update_option( $opt, 'on' ); | |
| 547 | + } else { | |
| 548 | + update_option( $opt, 'off' ); | |
| 549 | + } | |
| 550 | + } | |
| 551 | + } | |
| 520 | 552 | |
| 521 | - $submit_text = stripslashes($_POST['mc_submit_text']); | |
| 522 | - $submit_text = str_replace("\r\n","", $submit_text); | |
| 523 | - update_option('mc_submit_text', $submit_text); | |
| 524 | - | |
| 525 | - // Set Custom Style option | |
| 526 | - update_option('mc_custom_style', isset($_POST['mc_custom_style']) ? 'on' : 'off'); | |
| 527 | - | |
| 528 | - //we told them not to put these things we are replacing in, but let's just make sure they are listening... | |
| 529 | - if(isset($_POST['mc_form_border_width'])) { | |
| 530 | - update_option('mc_form_border_width',str_replace('px', '', $_POST['mc_form_border_width']) ); | |
| 531 | - } | |
| 532 | - if(isset($_POST['mc_form_border_color'])) { | |
| 533 | - update_option('mc_form_border_color', str_replace('#', '', $_POST['mc_form_border_color'])); | |
| 534 | - } | |
| 535 | - if(isset($_POST['mc_form_background'])){ | |
| 536 | - update_option('mc_form_background',str_replace('#', '', $_POST['mc_form_background'])); | |
| 537 | - } | |
| 538 | - if(isset($_POST['mc_form_text_color'])) { | |
| 539 | - update_option('mc_form_text_color', str_replace('#', '', $_POST['mc_form_text_color'])); | |
| 540 | - } | |
| 541 | - | |
| 542 | - | |
| 543 | - // IF NOT DEV MODE | |
| 544 | - $igs = get_option('mc_interest_groups'); | |
| 545 | - if (is_array($igs)) { | |
| 546 | - foreach($igs as $var){ | |
| 547 | - $opt = 'mc_show_interest_groups_'.$var['id']; | |
| 548 | - if (isset($_POST[$opt])){ | |
| 549 | - update_option($opt,'on'); | |
| 550 | - } else { | |
| 551 | - update_option($opt,'off'); | |
| 552 | - } | |
| 553 | - } | |
| 554 | - } | |
| 555 | - | |
| 556 | - $mv = get_option('mc_merge_vars'); | |
| 557 | - if (is_array($mv)) { | |
| 558 | - foreach($mv as $var){ | |
| 559 | - $opt = 'mc_mv_'.$var['tag']; | |
| 560 | - if (isset($_POST[$opt]) || $var['required']=='Y'){ | |
| 561 | - update_option($opt,'on'); | |
| 562 | - } else { | |
| 563 | - update_option($opt,'off'); | |
| 564 | - } | |
| 565 | - } | |
| 566 | - } | |
| 567 | - | |
| 568 | - $msg = '<p class="success_msg">'.esc_html(__('Successfully Updated your List Subscribe Form Settings!', 'mailchimp_i18n')).'</p>'; | |
| 569 | - mailchimpSF_global_msg($msg); | |
| 553 | + $msg = esc_html__( 'Successfully Updated your List Subscribe Form Settings!', 'mailchimp' ); | |
| 554 | + admin_notice_success( $msg ); | |
| 555 | + // phpcs:enable WordPress.Security.NonceVerification.Missing | |
| 570 | 556 | } |
| 571 | 557 | |
| 572 | 558 | /** |
| 573 | 559 | * Sees if the user changed the list, and updates options accordingly |
| 574 | 560 | **/ |
| 575 | -function mailchimpSF_change_list_if_necessary() { | |
| 576 | - // Simple permission check before going through all this | |
| 577 | - if (!current_user_can(MCSF_CAP_THRESHOLD)) { return; } | |
| 561 | +function mailchimp_sf_change_list_if_necessary() { | |
| 562 | + if ( ! isset( $_POST['mc_list_id'] ) ) { | |
| 563 | + return; | |
| 564 | + } | |
| 578 | 565 | |
| 579 | - $api = mailchimpSF_get_api(); | |
| 580 | - if (!$api) { return; } | |
| 566 | + if ( | |
| 567 | + ! current_user_can( MCSF_CAP_THRESHOLD ) || | |
| 568 | + ! isset( $_POST['update_mc_list_id_nonce'] ) || | |
| 569 | + ! wp_verify_nonce( sanitize_key( $_POST['update_mc_list_id_nonce'] ), 'update_mc_list_id_action' ) | |
| 570 | + ) { | |
| 571 | + wp_die( 'Security check failed.' ); | |
| 572 | + } | |
| 581 | 573 | |
| 582 | - //we *could* support paging, but few users have that many lists (and shouldn't) | |
| 583 | - $lists = $api->get('lists',100); | |
| 584 | - $lists = $lists['lists']; | |
| 574 | + if ( empty( $_POST['mc_list_id'] ) ) { | |
| 575 | + $msg = esc_html__( 'Please choose a valid list', 'mailchimp' ); | |
| 576 | + admin_notice_error( $msg ); | |
| 577 | + return; | |
| 578 | + } | |
| 585 | 579 | |
| 586 | - if (is_array($lists) && !empty($lists) && isset($_POST['mc_list_id'])) { | |
| 580 | + $lists = mailchimp_sf_get_lists(); | |
| 581 | + if ( is_wp_error( $lists ) || ! isset( $lists['lists'] ) ) { | |
| 582 | + return; | |
| 583 | + } | |
| 587 | 584 | |
| 588 | - /* If our incoming list ID (the one chosen in the select dropdown) | |
| 589 | - is in our array of lists, the set it to be the active list */ | |
| 590 | - foreach($lists as $key => $list) { | |
| 591 | - if ($list['id'] == $_POST['mc_list_id']) { | |
| 592 | - $list_id = $_POST['mc_list_id']; | |
| 593 | - $list_name = $list['name']; | |
| 594 | - $list_key = $key; | |
| 595 | - } | |
| 596 | - } | |
| 585 | + $lists = $lists['lists']; | |
| 597 | 586 | |
| 598 | - $orig_list = get_option('mc_list_id'); | |
| 599 | - if ($list_id != '') { | |
| 600 | - update_option('mc_list_id', $list_id); | |
| 601 | - update_option('mc_list_name', $list_name); | |
| 602 | - update_option('mc_email_type_option', $lists[$list_key]['email_type_option']); | |
| 587 | + if ( is_array( $lists ) && ! empty( $lists ) ) { | |
| 603 | 588 | |
| 589 | + /** | |
| 590 | + * If our incoming list ID (the one chosen in the select dropdown) | |
| 591 | + * is in our array of lists, the set it to be the active list | |
| 592 | + */ | |
| 593 | + foreach ( $lists as $key => $list ) { | |
| 594 | + if ( isset( $_POST['mc_list_id'] ) && $list['id'] === $_POST['mc_list_id'] ) { | |
| 595 | + $list_id = sanitize_text_field( wp_unslash( $_POST['mc_list_id'] ) ); | |
| 596 | + $list_name = $list['name']; | |
| 597 | + $list_key = $key; | |
| 598 | + } | |
| 604 | 599 | |
| 605 | - // See if the user changed the list | |
| 606 | - $new_list = false; | |
| 607 | - if ($orig_list != $list_id){ | |
| 608 | - // The user changed the list, Reset the Form Defaults | |
| 609 | - mailchimpSF_set_form_defaults($list_name); | |
| 610 | - | |
| 611 | - $new_list = true; | |
| 612 | - } | |
| 613 | - // email_type_option | |
| 600 | + $merge_fields = mailchimp_sf_get_merge_vars( $list['id'], false, false ); | |
| 601 | + $interests = mailchimp_sf_get_interest_categories( $list['id'], false, false ); | |
| 602 | + if ( ! empty( $merge_fields ) ) { | |
| 603 | + update_option( 'mailchimp_sf_merge_fields_' . $list['id'], $merge_fields ); | |
| 604 | + } | |
| 605 | + if ( ! empty( $interests ) ) { | |
| 606 | + update_option( 'mailchimp_sf_interest_groups_' . $list['id'], $interests ); | |
| 607 | + } | |
| 608 | + } | |
| 614 | 609 | |
| 615 | - // Grab the merge vars and interest groups | |
| 616 | - $mv = mailchimpSF_get_merge_vars($list_id, $new_list); | |
| 617 | - $igs = mailchimpSF_get_interest_categories($list_id, $new_list); | |
| 610 | + $orig_list = get_option( 'mc_list_id' ); | |
| 611 | + if ( '' !== $list_id ) { | |
| 612 | + update_option( 'mc_list_id', $list_id ); | |
| 613 | + update_option( 'mc_list_name', $list_name ); | |
| 614 | + update_option( 'mc_email_type_option', $lists[ $list_key ]['email_type_option'] ); | |
| 618 | 615 | |
| 619 | - $igs_text = ' '; | |
| 620 | - if (is_array($igs)) { | |
| 621 | - $igs_text .= sprintf(__('and %s Sets of Interest Groups', 'mailchimp_i18n'), count($igs)); | |
| 622 | - } | |
| 616 | + // See if the user changed the list | |
| 617 | + $new_list = false; | |
| 618 | + if ( $orig_list !== $list_id ) { | |
| 619 | + // The user changed the list, Reset the Form Defaults | |
| 620 | + mailchimp_sf_set_form_defaults( $list_name ); | |
| 623 | 621 | |
| 624 | - $msg = '<p class="success_msg">'. | |
| 625 | - sprintf( | |
| 626 | - __('<b>Success!</b> Loaded and saved the info for %d Merge Variables', 'mailchimp_i18n').$igs_text, | |
| 627 | - count($mv) | |
| 628 | - ).' '. | |
| 629 | - __('from your list').' "'.$list_name.'"<br/><br/>'. | |
| 630 | - __('Now you should either Turn On the MailChimp Widget or change your options below, then turn it on.', 'mailchimp_i18n').'</p>'; | |
| 631 | - mailchimpSF_global_msg($msg); | |
| 632 | - } | |
| 633 | - } | |
| 634 | -} | |
| 622 | + $new_list = true; | |
| 623 | + } | |
| 635 | 624 | |
| 636 | -function mailchimpSF_get_merge_vars($list_id, $new_list) { | |
| 637 | - $api = mailchimpSF_get_api(); | |
| 638 | - $mv = $api->get('lists/' . $list_id . '/merge-fields', 80); | |
| 639 | - | |
| 640 | - if(is_wp_error($mv)) { | |
| 641 | - return; | |
| 642 | - } | |
| 625 | + // Grab the merge vars and interest groups | |
| 626 | + $mv = mailchimp_sf_get_merge_vars( $list_id, $new_list ); | |
| 627 | + $igs = mailchimp_sf_get_interest_categories( $list_id, $new_list ); | |
| 643 | 628 | |
| 644 | - $mv['merge_fields'] = mailchimpSF_add_email_field($mv['merge_fields']); | |
| 645 | - update_option('mc_merge_vars', $mv['merge_fields']); | |
| 646 | - foreach($mv['merge_fields'] as $var){ | |
| 647 | - $opt = 'mc_mv_'.$var['tag']; | |
| 648 | - //turn them all on by default | |
| 649 | - if ($new_list) { | |
| 650 | - update_option($opt, 'on' ); | |
| 651 | - } | |
| 652 | - } | |
| 653 | - return $mv['merge_fields']; | |
| 654 | -} | |
| 629 | + $igs_text = ' '; | |
| 630 | + if ( is_array( $igs ) ) { | |
| 631 | + /* translators: %s: count (number) */ | |
| 632 | + $igs_text .= sprintf( esc_html__( 'and %s Sets of Interest Groups', 'mailchimp' ), count( $igs ) ); | |
| 633 | + } | |
| 655 | 634 | |
| 656 | -function mailchimpSF_add_email_field($merge) { | |
| 657 | - | |
| 658 | - $email = array( | |
| 659 | - 'tag' => 'EMAIL', | |
| 660 | - 'name' => __('Email Address', 'mailchimp_i18n'), | |
| 661 | - 'type' => 'email', | |
| 662 | - 'required' => true, | |
| 663 | - 'public' => true, | |
| 664 | - 'display_order' => 1, | |
| 665 | - 'default_value' => null | |
| 666 | - ); | |
| 667 | - array_unshift($merge, $email); | |
| 668 | - return $merge; | |
| 669 | -} | |
| 635 | + $msg = sprintf( | |
| 636 | + /* translators: %s: count (number) */ | |
| 637 | + __( '<b>Success!</b> Loaded and saved the info for %d Merge Variables', 'mailchimp' ) . $igs_text, | |
| 638 | + count( $mv ) | |
| 639 | + ) . ' ' . | |
| 640 | + esc_html__( 'from your list', 'mailchimp' ) . ' "' . $list_name . '"<br/><br/>' . | |
| 641 | + esc_html__( 'Now you should either Turn On the Mailchimp Widget or change your options below, then turn it on.', 'mailchimp' ); | |
| 670 | 642 | |
| 671 | -function mailchimpSF_get_interest_categories($list_id, $new_list) { | |
| 672 | - $api = mailchimpSF_get_api(); | |
| 673 | - $igs = $api->get('lists/' . $list_id . '/interest-categories', 60); | |
| 643 | + admin_notice_success( $msg ); | |
| 644 | + } | |
| 674 | 645 | |
| 675 | - if(is_wp_error($igs)) { | |
| 676 | - return; | |
| 677 | - } | |
| 678 | - | |
| 679 | - if (is_array($igs)) { | |
| 680 | - $key = 0; | |
| 681 | - foreach($igs['categories'] as $ig) { | |
| 682 | - $groups = $api->get('lists/' . $list_id . '/interest-categories/' . $ig['id'] . '/interests', 60); | |
| 683 | - $igs['categories'][$key]['groups'] = $groups['interests']; | |
| 684 | - $opt = 'mc_show_interest_groups_'.$ig['id']; | |
| 685 | - | |
| 686 | - //turn them all on by default | |
| 687 | - if ($new_list) { | |
| 688 | - update_option($opt, 'on' ); | |
| 689 | - } | |
| 690 | - $key++; | |
| 691 | - } | |
| 692 | - } | |
| 693 | - update_option('mc_interest_groups', $igs['categories']); | |
| 694 | - return $igs['categories']; | |
| 646 | + // Update the lists option. | |
| 647 | + update_option( 'mailchimp_sf_lists', $lists ); | |
| 648 | + } | |
| 695 | 649 | } |
| 696 | 650 | |
| 697 | - | |
| 698 | 651 | /** |
| 699 | - * Outputs the Settings/Options page | |
| 652 | + * Get merge vars | |
| 653 | + * | |
| 654 | + * @param string $list_id List ID | |
| 655 | + * @param bool $new_list Whether this is a new list | |
| 656 | + * @param bool $update_option Whether to update the option | |
| 657 | + * @return array | |
| 700 | 658 | */ |
| 701 | -function mailchimpSF_setup_page() { | |
| 702 | - $path = plugin_dir_path(__FILE__); | |
| 703 | - wp_enqueue_script('showMe', MCSF_URL.'js/hidecss.js', array('jquery'), MCSF_VER); | |
| 704 | - require_once($path.'/views/setup_page.php'); | |
| 705 | -}//mailchimpSF_setup_page() | |
| 659 | +function mailchimp_sf_get_merge_vars( $list_id, $new_list, $update_option = true ) { | |
| 660 | + $api = mailchimp_sf_get_api(); | |
| 661 | + $mv = $api->get( 'lists/' . $list_id . '/merge-fields', 80 ); | |
| 706 | 662 | |
| 663 | + // if we get an error back from the api, exit this process. | |
| 664 | + if ( is_wp_error( $mv ) ) { | |
| 665 | + return; | |
| 666 | + } | |
| 707 | 667 | |
| 708 | -function mailchimpSF_register_widgets() { | |
| 709 | - if (mailchimpSF_get_api()) { | |
| 710 | - register_widget('mailchimpSF_Widget'); | |
| 711 | - } | |
| 712 | -} | |
| 713 | -add_action('widgets_init', 'mailchimpSF_register_widgets'); | |
| 668 | + $mv['merge_fields'] = mailchimp_sf_add_email_field( $mv['merge_fields'] ); | |
| 669 | + if ( $update_option ) { | |
| 670 | + update_option( 'mc_merge_vars', $mv['merge_fields'] ); | |
| 671 | + } | |
| 714 | 672 | |
| 715 | -function mailchimpSF_shortcode($atts){ | |
| 716 | - ob_start(); | |
| 717 | - mailchimpSF_signup_form(); | |
| 718 | - return ob_get_clean(); | |
| 673 | + foreach ( $mv['merge_fields'] as $mv_var ) { | |
| 674 | + $opt = 'mc_mv_' . $mv_var['tag']; | |
| 675 | + if ( $new_list ) { | |
| 676 | + $public = $mv_var['public'] ?? false; | |
| 677 | + if ( ! $public ) { | |
| 678 | + // This is a hidden field, so we don't want to include it. | |
| 679 | + update_option( $opt, 'off' ); | |
| 680 | + } else { | |
| 681 | + // We need to set the option to 'on' so that it shows up in the form. | |
| 682 | + update_option( $opt, 'on' ); | |
| 683 | + } | |
| 684 | + } | |
| 685 | + } | |
| 686 | + return $mv['merge_fields']; | |
| 719 | 687 | } |
| 720 | -add_shortcode('mailchimpsf_form', 'mailchimpSF_shortcode'); | |
| 721 | 688 | |
| 722 | 689 | /** |
| 723 | - * Attempts to signup a user, per the $_POST args. | |
| 690 | + * Add email field | |
| 724 | 691 | * |
| 725 | - * This sets a global message, that is then used in the widget | |
| 726 | - * output to retrieve and display that message. | |
| 727 | - * | |
| 728 | - * @return bool | |
| 692 | + * @param array $merge Merge | |
| 693 | + * @return array | |
| 729 | 694 | */ |
| 730 | -function mailchimpSF_signup_submit() { | |
| 731 | - $mv = get_option('mc_merge_vars', array()); | |
| 732 | - $mv_tag_keys = array(); | |
| 733 | - | |
| 734 | - $igs = get_option('mc_interest_groups', array()); | |
| 735 | - | |
| 736 | - $listId = get_option('mc_list_id'); | |
| 737 | - $email = isset($_POST['mc_mv_EMAIL']) ? strip_tags(stripslashes($_POST['mc_mv_EMAIL'])) : ''; | |
| 738 | - $merge = $errs = $html_errs = array(); // Set up some vars | |
| 739 | - | |
| 740 | - $merge = mailchimpSF_merge_submit($mv); | |
| 741 | - | |
| 742 | - //Catch errors and fail early. | |
| 743 | - if(is_wp_error($merge)) { | |
| 744 | - $msg = "<strong class='mc_error_msg'>" . $merge->get_error_message() . "</strong>"; | |
| 745 | - mailchimpSF_global_msg($msg); | |
| 746 | - | |
| 747 | - return false; | |
| 748 | - } | |
| 749 | - | |
| 750 | - // Head back to the beginning of the merge vars array | |
| 751 | - reset($mv); | |
| 752 | - // Ensure we have an array | |
| 753 | - $igs = !is_array($igs) ? array() : $igs; | |
| 754 | - $igs = mailchimpSF_groups_submit($igs); | |
| 755 | - | |
| 756 | - // Clear out empty merge vars | |
| 757 | - $merge = mailchimpSF_merge_remove_empty($merge); | |
| 758 | - if (isset($_POST['email_type']) && in_array($_POST['email_type'], array('text', 'html', 'mobile'))) { | |
| 759 | - $email_type = $_POST['email_type']; | |
| 760 | - } | |
| 761 | - else { | |
| 762 | - $email_type = 'html'; | |
| 763 | - } | |
| 764 | - | |
| 765 | - $api = mailchimpSF_get_api(); | |
| 766 | - if (!$api) { | |
| 767 | - $url = mailchimpSF_signup_form_url(); | |
| 768 | - $error = '<strong class="mc_error_msg">'. __('We encountered a problem adding ' . $email . ' to the list. Please <a href="' . $url . '">sign up here.</a>') . '</strong>'; | |
| 769 | - mailchimpSF_global_msg($error); | |
| 770 | - return false; | |
| 771 | - } | |
| 772 | - | |
| 773 | - $url = 'lists/'. $listId . '/members/' . md5(strtolower($email)); | |
| 774 | - $status = mailchimpSF_check_status($url); | |
| 775 | - | |
| 776 | - | |
| 777 | - // If update existing is turned off and the subscriber exists, error out. | |
| 778 | - if (get_option('mc_update_existing') == false && $status === 'subscribed') { | |
| 779 | - $msg = 'This email address is already subscribed to the list.'; | |
| 780 | - $error = new WP_Error('mailchimp-update-existing', $msg); | |
| 781 | - mailchimpSF_global_msg('<strong class="mc_error_msg">' . $msg . '</strong>'); | |
| 782 | - return false; | |
| 783 | - } | |
| 784 | - | |
| 785 | - $body = mailchimpSF_subscribe_body($merge, $igs, $email_type, $email, $status, get_option('mc_double_optin')); | |
| 786 | - $retval = $api->post($url, $body, 'PUT'); | |
| 787 | - | |
| 788 | - // If we have errors, then show them | |
| 789 | - if(is_wp_error($retval)) { | |
| 790 | - $msg = "<strong class='mc_error_msg'>" . $retval->get_error_message() . "</strong>"; | |
| 791 | - mailchimpSF_global_msg($msg); | |
| 792 | - return false; | |
| 793 | - } | |
| 794 | - | |
| 795 | - if($retval['status'] == 'subscribed') { | |
| 796 | - $esc = __("Success, you've been signed up.", 'mailchimp_i18n'); | |
| 797 | - $msg = "<strong class='mc_success_msg'>{$esc}</strong>"; | |
| 798 | - } else { | |
| 799 | - $esc = __("Success, you've been signed up! Please look for our confirmation email.", 'mailchimp_i18n'); | |
| 800 | - $msg = "<strong class='mc_success_msg'>{$esc}</strong>"; | |
| 801 | - } | |
| 802 | - | |
| 803 | - // Set our global message | |
| 804 | - mailchimpSF_global_msg($msg); | |
| 805 | - | |
| 806 | - return true; | |
| 695 | +function mailchimp_sf_add_email_field( $merge ) { | |
| 696 | + $email = array( | |
| 697 | + 'tag' => 'EMAIL', | |
| 698 | + 'name' => esc_html__( 'Email Address', 'mailchimp' ), | |
| 699 | + 'type' => 'email', | |
| 700 | + 'required' => true, | |
| 701 | + 'public' => true, | |
| 702 | + 'display_order' => 1, | |
| 703 | + 'default_value' => null, | |
| 704 | + ); | |
| 705 | + array_unshift( $merge, $email ); | |
| 706 | + return $merge; | |
| 807 | 707 | } |
| 808 | 708 | |
| 809 | - /* | |
| 810 | - Cleans up merge fields and interests to make them | |
| 811 | - API 3.0-friendly. | |
| 812 | - */ | |
| 709 | +/** | |
| 710 | + * Get interest categories | |
| 711 | + * | |
| 712 | + * @param string $list_id List ID | |
| 713 | + * @param bool $new_list Whether this is a new list | |
| 714 | + * @param bool $update_option Whether to update the option | |
| 715 | + * @return array | |
| 716 | + */ | |
| 717 | +function mailchimp_sf_get_interest_categories( $list_id, $new_list, $update_option = true ) { | |
| 718 | + $api = mailchimp_sf_get_api(); | |
| 719 | + $igs = $api->get( 'lists/' . $list_id . '/interest-categories', 60 ); | |
| 813 | 720 | |
| 814 | -function mailchimpSF_subscribe_body($merge, $igs, $email_type, $email, $status, $double_optin) | |
| 815 | -{ | |
| 816 | - $body = new stdClass(); | |
| 817 | - $body->email_address = $email; | |
| 818 | - $body->email_type = $email_type; | |
| 819 | - $body->merge_fields = $merge; | |
| 820 | - if (!empty($igs)) { | |
| 821 | - $body->interests = $igs; | |
| 822 | - } | |
| 721 | + // if we get an error back from the api, exis | |
| 722 | + if ( is_wp_error( $igs ) ) { | |
| 723 | + return; | |
| 724 | + } | |
| 823 | 725 | |
| 824 | - if($status !== 'subscribed') { | |
| 825 | - // single opt-in that covers new subscribers | |
| 826 | - if (!$status && $double_optin == false) { | |
| 827 | - $body->status = 'subscribed'; | |
| 828 | - } else { | |
| 829 | - // anyone else | |
| 830 | - $body->status = 'pending'; | |
| 831 | - } | |
| 832 | - } | |
| 833 | - return $body; | |
| 834 | -} | |
| 726 | + if ( is_array( $igs ) ) { | |
| 727 | + $key = 0; | |
| 728 | + foreach ( $igs['categories'] as $ig ) { | |
| 729 | + $groups = $api->get( 'lists/' . $list_id . '/interest-categories/' . $ig['id'] . '/interests', 60 ); | |
| 730 | + $igs['categories'][ $key ]['groups'] = $groups['interests']; | |
| 731 | + $opt = 'mc_show_interest_groups_' . $ig['id']; | |
| 835 | 732 | |
| 836 | -function mailchimpSF_check_status($endpoint) { | |
| 837 | - $endpoint .= '?fields=status'; | |
| 838 | - $api = mailchimpSF_get_api(); | |
| 839 | - $subscriber = $api->get($endpoint, null); | |
| 840 | - if(is_wp_error($subscriber)) { | |
| 841 | - return false; | |
| 842 | - } | |
| 843 | - return $subscriber['status']; | |
| 844 | - } | |
| 733 | + // turn them all on by default | |
| 734 | + if ( $new_list ) { | |
| 735 | + update_option( $opt, 'on' ); | |
| 736 | + } | |
| 737 | + ++$key; | |
| 738 | + } | |
| 739 | + } | |
| 845 | 740 | |
| 846 | -function mailchimpSF_merge_submit($mv) { | |
| 847 | - // Loop through our Merge Vars, and if they're empty, but required, then print an error, and mark as failed | |
| 848 | - $merge = new stdClass(); | |
| 849 | - foreach($mv as $var) { | |
| 850 | - // We also want to create an array where the keys are the tags for easier validation later | |
| 851 | - $mv_tag_keys[$var['tag']] = $var; | |
| 852 | - | |
| 853 | - $opt = 'mc_mv_'.$var['tag']; | |
| 854 | - | |
| 855 | - $opt_val = isset($_POST[$opt]) ? stripslashes_deep($_POST[$opt]) : ''; | |
| 741 | + if ( $update_option ) { | |
| 742 | + update_option( 'mc_interest_groups', $igs['categories'] ); | |
| 743 | + } | |
| 856 | 744 | |
| 857 | - // Handle phone number logic | |
| 858 | - if ($var['type'] === 'phone' && $var['options']['phone_format'] === 'US') { | |
| 859 | - $opt_val = mailchimpSF_merge_validate_phone($opt_val, $var); | |
| 860 | - if(is_wp_error($opt_val)) { | |
| 861 | - return $opt_val; | |
| 862 | - } | |
| 863 | - } | |
| 864 | - // Handle address logic | |
| 865 | - else if (is_array($opt_val) && $var['type'] == 'address') { | |
| 866 | - $validate = mailchimpSF_merge_validate_address($opt_val, $var); | |
| 867 | - if(is_wp_error($validate)) { | |
| 868 | - return $validate; | |
| 869 | - } | |
| 870 | - | |
| 871 | - if($validate) { | |
| 872 | - $merge->$var['tag'] = $validate; | |
| 873 | - } | |
| 874 | - continue; | |
| 875 | - | |
| 876 | - } | |
| 877 | - else if (is_array($opt_val)) { | |
| 878 | - $keys = array_keys($opt_val); | |
| 879 | - $val = new stdClass(); | |
| 880 | - foreach($keys as $key) { | |
| 881 | - $val->$key = $opt_val[$key]; | |
| 882 | - } | |
| 883 | - $opt_val = $val; | |
| 884 | - } | |
| 885 | - | |
| 886 | - if ($var['required'] == 'Y' && trim($opt_val) == '') { | |
| 887 | - $message = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name'])); | |
| 888 | - $error = new WP_Error('missing_required_field', $message); | |
| 889 | - return $error; | |
| 890 | - } | |
| 891 | - else { | |
| 892 | - if ($var['tag'] != 'EMAIL') { | |
| 893 | - $merge->$var['tag'] = $opt_val; | |
| 894 | - } | |
| 895 | - } | |
| 896 | - } | |
| 897 | - return $merge; | |
| 745 | + return $igs['categories']; | |
| 898 | 746 | } |
| 899 | 747 | |
| 900 | -function mailchimpSF_merge_validate_phone($opt_val, $var) { | |
| 901 | - // This filters out all 'falsey' elements | |
| 902 | - $opt_val = array_filter($opt_val); | |
| 903 | - // If they weren't all empty | |
| 904 | - if (!$opt_val) { | |
| 905 | - return; | |
| 906 | - } | |
| 907 | - | |
| 908 | - $opt_val = implode('-', $opt_val); | |
| 909 | - if (strlen($opt_val) < 12) { | |
| 910 | - $opt_val = ''; | |
| 911 | - } | |
| 912 | - | |
| 913 | - | |
| 914 | - if (!preg_match('/[0-9]{0,3}-[0-9]{0,3}-[0-9]{0,4}/A', $opt_val)) { | |
| 915 | - $message = sprintf(__("%s must consist of only numbers", 'mailchimp_i18n'), esc_html($var['name'])); | |
| 916 | - $error = new WP_Error('mc_phone_validation', $message); | |
| 917 | - return $error; | |
| 918 | - } | |
| 919 | - | |
| 920 | - return $opt_val; | |
| 748 | +/** | |
| 749 | + * Register the widget. | |
| 750 | + * | |
| 751 | + * @return void | |
| 752 | + */ | |
| 753 | +function mailchimp_sf_register_widgets() { | |
| 754 | + if ( mailchimp_sf_get_api() ) { | |
| 755 | + register_widget( 'Mailchimp_SF_Widget' ); | |
| 756 | + } | |
| 921 | 757 | } |
| 758 | +add_action( 'widgets_init', 'mailchimp_sf_register_widgets' ); | |
| 922 | 759 | |
| 923 | -function mailchimpSF_merge_validate_address($opt_val, $var) { | |
| 924 | - if ($var['required'] == 'Y') { | |
| 925 | - if (empty($opt_val['addr1']) || empty($opt_val['city'])) { | |
| 926 | - $message = sprintf(__("You must fill in %s.", 'mailchimp_i18n'), esc_html($var['name'])); | |
| 927 | - $error = new WP_Error('invalid_address_merge', $message); | |
| 928 | - return $error; | |
| 929 | - } | |
| 930 | - } else { | |
| 931 | - if (empty($opt_val['addr1']) || empty($opt_val['city'])) { | |
| 932 | - return false; | |
| 933 | - } | |
| 934 | - } | |
| 935 | - | |
| 936 | - $merge = new stdClass(); | |
| 937 | - $merge->addr1 = $opt_val['addr1']; | |
| 938 | - $merge->addr2 = $opt_val['addr2']; | |
| 939 | - $merge->city = $opt_val['city']; | |
| 940 | - $merge->state = $opt_val['state']; | |
| 941 | - $merge->zip = $opt_val['zip']; | |
| 942 | - $merge->country = $opt_val['country']; | |
| 943 | - return $merge; | |
| 944 | - | |
| 760 | +/** | |
| 761 | + * Add shortcode | |
| 762 | + * | |
| 763 | + * @return string | |
| 764 | + */ | |
| 765 | +function mailchimp_sf_shortcode() { | |
| 766 | + ob_start(); | |
| 767 | + mailchimp_sf_signup_form(); | |
| 768 | + return ob_get_clean(); | |
| 945 | 769 | } |
| 770 | +add_shortcode( 'mailchimpsf_form', 'mailchimp_sf_shortcode' ); | |
| 946 | 771 | |
| 947 | -function mailchimpSF_merge_remove_empty($merge) | |
| 948 | -{ | |
| 949 | - foreach ($merge as $k => $v) { | |
| 950 | - if (is_object($v) && empty($v)) { | |
| 951 | - unset($merge->$k); | |
| 952 | - } elseif ((is_string($v) && trim($v) === '') || is_null($v)) { | |
| 953 | - unset($merge->$k); | |
| 954 | - } | |
| 955 | - } | |
| 772 | +/** | |
| 773 | + * Cleans up merge fields and interests to make them | |
| 774 | + * API 3.0-friendly. | |
| 775 | + * | |
| 776 | + * @param [type] $merge Merge fields | |
| 777 | + * @param [type] $igs Interest groups | |
| 778 | + * @param string $email_type Email type | |
| 779 | + * @param string $email Email | |
| 780 | + * @param string|false $status Status The subscription status ('subscribed', 'unsubscribed', 'pending', etc.) or false if an error occurred. | |
| 781 | + * @param string $double_optin Whether double opt-in is enabled. "1" for enabled and "" for disabled. | |
| 782 | + * @return stdClass | |
| 783 | + */ | |
| 784 | +function mailchimp_sf_subscribe_body( $merge, $igs, $email_type, $email, $status, $double_optin ) { | |
| 785 | + $body = new stdClass(); | |
| 786 | + $body->email_address = $email; | |
| 787 | + $body->email_type = $email_type; | |
| 788 | + $body->merge_fields = $merge; | |
| 956 | 789 | |
| 957 | - // If we have an empty $merge, then assign empty string. | |
| 958 | - if (count($merge) == 0 || $merge == '') { | |
| 959 | - $merge = ''; | |
| 960 | - } | |
| 790 | + if ( ! empty( $igs ) ) { | |
| 791 | + $body->interests = $igs; | |
| 792 | + } | |
| 961 | 793 | |
| 962 | - return $merge; | |
| 963 | -} | |
| 794 | + // Early return for already subscribed users | |
| 795 | + if ( 'subscribed' === $status ) { | |
| 796 | + return $body; | |
| 797 | + } | |
| 964 | 798 | |
| 965 | -function mailchimpSF_groups_submit($igs) { | |
| 966 | - $groups = mailchimpSF_set_all_groups_to_false(); | |
| 799 | + // Subscribe the email immediately unless double opt-in is enabled | |
| 800 | + // "unsubscribed" and "subscribed" existing emails have been excluded at this stage | |
| 801 | + // "pending" emails should follow double opt-in rules | |
| 802 | + $body->status = $double_optin ? 'pending' : 'subscribed'; | |
| 967 | 803 | |
| 968 | - if(empty($igs)) { | |
| 969 | - return new StdClass(); | |
| 970 | - } | |
| 971 | - | |
| 972 | - //get groups and ids | |
| 973 | - //set all to false | |
| 974 | - | |
| 975 | - foreach ($igs as $ig) { | |
| 976 | - if (get_option('mc_show_interest_groups_'.$ig['id']) == 'on' && $ig['type'] !== 'hidden') { | |
| 977 | - switch ($ig['type']) { | |
| 978 | - case 'dropdown': | |
| 979 | - case 'radio': | |
| 980 | - // there can only be one value submitted for radio/dropdowns, so use that at the group id. | |
| 981 | - if (isset($_POST['group'][$ig['id']]) && !empty($_POST['group'][$ig['id']])){ | |
| 982 | - $value = $_POST['group'][$ig['id']]; | |
| 983 | - $groups->$value = true; | |
| 984 | - } | |
| 985 | - break; | |
| 986 | - case 'checkboxes': | |
| 987 | - if (isset($_POST['group'][$ig['id']])) { | |
| 988 | - foreach ($_POST['group'][$ig['id']] as $id => $value) { | |
| 989 | - $groups->$id = true; | |
| 990 | - } | |
| 991 | - } | |
| 992 | - break; | |
| 993 | - default: | |
| 994 | - // Nothing | |
| 995 | - break; | |
| 996 | - } | |
| 997 | - } | |
| 998 | - } | |
| 999 | - return $groups; | |
| 804 | + return $body; | |
| 1000 | 805 | } |
| 1001 | 806 | |
| 1002 | -function mailchimpSF_set_all_groups_to_false() { | |
| 1003 | - $toreturn = new StdClass(); | |
| 1004 | - | |
| 1005 | - foreach (get_option('mc_interest_groups') as $grouping) { | |
| 1006 | - if($grouping['type'] !== 'hidden') { | |
| 1007 | - foreach ($grouping['groups'] as $group) { | |
| 1008 | - $toreturn->$group['id'] = false; | |
| 1009 | - } | |
| 1010 | - } | |
| 1011 | - } | |
| 1012 | - | |
| 1013 | - return $toreturn; | |
| 807 | +/** | |
| 808 | + * Check the status of a subscriber in the list. | |
| 809 | + * | |
| 810 | + * @param string $endpoint API endpoint to check the status. | |
| 811 | + * @return string|false The subscription status ('subscribed', 'unsubscribed', 'pending', etc.) or false if the API returned 404 or an error occurred. | |
| 812 | + */ | |
| 813 | +function mailchimp_sf_check_status( $endpoint ) { | |
| 814 | + $endpoint .= '?fields=status'; | |
| 815 | + $api = mailchimp_sf_get_api(); | |
| 816 | + $subscriber = $api->get( $endpoint, null ); | |
| 817 | + if ( is_wp_error( $subscriber ) ) { | |
| 818 | + return false; | |
| 819 | + } | |
| 820 | + return $subscriber['status']; | |
| 1014 | 821 | } |
| 1015 | 822 | |
| 1016 | -function mailchimpSF_verify_key($api) { | |
| 1017 | - $user = $api->get(''); | |
| 1018 | - if (is_wp_error($user)) { | |
| 1019 | - return $user; | |
| 1020 | - } | |
| 823 | +/** | |
| 824 | + * Verify key | |
| 825 | + * | |
| 826 | + * @param MailChimp_API $api API instance | |
| 827 | + * @return mixed | |
| 828 | + */ | |
| 829 | +function mailchimp_sf_verify_key( $api ) { | |
| 830 | + $user = $api->get( '' ); | |
| 831 | + if ( is_wp_error( $user ) ) { | |
| 832 | + return $user; | |
| 833 | + } | |
| 1021 | 834 | |
| 1022 | - //Might as well set this data if we have it already. | |
| 1023 | - $valid_roles = array('owner', 'admin', 'manager'); | |
| 1024 | - if(in_array($user['role'], $valid_roles)) { | |
| 1025 | - update_option('mc_api_key', $api->key); | |
| 1026 | - update_option('mc_user', $user); | |
| 1027 | - update_option('mc_datacenter', $api->datacenter); | |
| 835 | + // Might as well set this data if we have it already. | |
| 836 | + $valid_roles = array( 'owner', 'admin', 'manager' ); | |
| 837 | + if ( isset( $user['role'] ) && in_array( $user['role'], $valid_roles, true ) ) { | |
| 838 | + update_option( 'mc_api_key', $api->key ); | |
| 839 | + update_option( 'mc_user', $user ); | |
| 840 | + update_option( 'mc_datacenter', $api->datacenter ); | |
| 1028 | 841 | |
| 1029 | - } else { | |
| 1030 | - $msg = __('API Key must belong to "Owner", "Admin", or "Manager."', 'mailchimp_i18n'); | |
| 1031 | - return new WP_Error('mc-invalid-role', $msg); | |
| 1032 | - } | |
| 1033 | - return; | |
| 842 | + } else { | |
| 843 | + $msg = esc_html__( 'API Key must belong to "Owner", "Admin", or "Manager."', 'mailchimp' ); | |
| 844 | + return new WP_Error( 'mc-invalid-role', $msg ); | |
| 845 | + } | |
| 1034 | 846 | } |
| 1035 | 847 | |
| 1036 | -function mailchimpSF_update_profile_url($email) { | |
| 1037 | - $dc = get_option('mc_datacenter'); | |
| 1038 | - $eid = base64_encode($email); | |
| 1039 | - $user = get_option('mc_user'); | |
| 1040 | - $list_id = get_option('mc_list_id'); | |
| 1041 | - $url = 'http://' . $dc . '.list-manage.com/subscribe/send-email?u=' . $user['account_id'] . '&id=' . $list_id . '&e=' . $eid; | |
| 1042 | - return $url; | |
| 848 | +/** | |
| 849 | + * Update profile URL. | |
| 850 | + * | |
| 851 | + * @param string $email Email | |
| 852 | + * @return string | |
| 853 | + */ | |
| 854 | +function mailchimp_sf_update_profile_url( $email ) { | |
| 855 | + $dc = get_option( 'mc_datacenter' ); | |
| 856 | + // This is the expected encoding for emails. | |
| 857 | + $eid = base64_encode( $email ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- ignoring because this is the expected data for the endpoint | |
| 858 | + $user = get_option( 'mc_user' ); | |
| 859 | + $list_id = get_option( 'mc_list_id' ); | |
| 860 | + $url = 'http://' . $dc . '.list-manage.com/subscribe/send-email?u=' . $user['account_id'] . '&id=' . $list_id . '&e=' . $eid; | |
| 861 | + return $url; | |
| 1043 | 862 | } |
| 1044 | 863 | |
| 1045 | -function mailchimpSF_signup_form_url() { | |
| 1046 | - $dc = get_option('mc_datacenter'); | |
| 1047 | - $user = get_option('mc_user'); | |
| 1048 | - $list_id = get_option('mc_list_id'); | |
| 1049 | - $url = 'http://' . $dc . '.list-manage.com/subscribe?u=' . $user['account_id'] . '&id=' . $list_id; | |
| 1050 | - return $url; | |
| 864 | +/** | |
| 865 | + * Delete options | |
| 866 | + * | |
| 867 | + * @param array $options Options | |
| 868 | + * @return void | |
| 869 | + */ | |
| 870 | +function mailchimp_sf_delete_options( $options = array() ) { | |
| 871 | + foreach ( $options as $option ) { | |
| 872 | + delete_option( $option ); | |
| 873 | + } | |
| 1051 | 874 | } |
| 1052 | 875 | |
| 1053 | -function mailchimpSF_delete_options($options = array()) { | |
| 1054 | - foreach($options as $option) { | |
| 1055 | - delete_option($option); | |
| 1056 | - } | |
| 1057 | -} | |
| 1058 | - | |
| 1059 | - | |
| 1060 | 876 | /********************** |
| 1061 | 877 | * Utility Functions * |
| 1062 | -**********************/ | |
| 878 | + **********************/ | |
| 1063 | 879 | /** |
| 1064 | 880 | * Utility function to allow placement of plugin in plugins, mu-plugins, child or parent theme's plugins folders |
| 1065 | 881 | * |
| 1066 | 882 | * This function must be ran _very early_ in the load process, as it sets up important constants for the rest of the plugin |
| 1067 | 883 | */ |
| 1068 | -function mailchimpSF_where_am_i() { | |
| 1069 | - $locations = array( | |
| 1070 | - 'plugins' => array( | |
| 1071 | - 'dir' => plugin_dir_path(__FILE__), | |
| 1072 | - 'url' => plugins_url() | |
| 1073 | - ), | |
| 1074 | - 'mu_plugins' => array( | |
| 1075 | - 'dir' => plugin_dir_path(__FILE__), | |
| 1076 | - 'url' => plugins_url(), | |
| 1077 | - ), | |
| 1078 | - 'template' => array( | |
| 1079 | - 'dir' => trailingslashit(get_template_directory()).'plugins/', | |
| 1080 | - 'url' => trailingslashit(get_template_directory_uri()).'plugins/', | |
| 1081 | - ), | |
| 1082 | - 'stylesheet' => array( | |
| 1083 | - 'dir' => trailingslashit(get_stylesheet_directory()).'plugins/', | |
| 1084 | - 'url' => trailingslashit(get_stylesheet_directory_uri()).'plugins/', | |
| 1085 | - ), | |
| 1086 | - ); | |
| 884 | +function mailchimp_sf_where_am_i() { | |
| 885 | + $locations = array( | |
| 886 | + 'plugins' => array( | |
| 887 | + 'dir' => plugin_dir_path( __FILE__ ), | |
| 888 | + 'url' => plugins_url(), | |
| 889 | + ), | |
| 890 | + 'mu_plugins' => array( | |
| 891 | + 'dir' => plugin_dir_path( __FILE__ ), | |
| 892 | + 'url' => plugins_url(), | |
| 893 | + ), | |
| 894 | + 'template' => array( | |
| 895 | + 'dir' => trailingslashit( get_template_directory() ) . 'plugins/', | |
| 896 | + 'url' => trailingslashit( get_template_directory_uri() ) . 'plugins/', | |
| 897 | + ), | |
| 898 | + 'stylesheet' => array( | |
| 899 | + 'dir' => trailingslashit( get_stylesheet_directory() ) . 'plugins/', | |
| 900 | + 'url' => trailingslashit( get_stylesheet_directory_uri() ) . 'plugins/', | |
| 901 | + ), | |
| 902 | + ); | |
| 1087 | 903 | |
| 1088 | - // Set defaults | |
| 1089 | - $mscf_dirbase = trailingslashit(basename(dirname(__FILE__))); // Typically wp-mailchimp/ or mailchimp/ | |
| 1090 | - $mscf_dir = trailingslashit(plugin_dir_path(__FILE__)); | |
| 1091 | - $mscf_url = trailingslashit(plugins_url(null, __FILE__)); | |
| 904 | + // Set defaults | |
| 905 | + $mscf_dirbase = trailingslashit( basename( __DIR__ ) ); // Typically wp-mailchimp/ or mailchimp/ | |
| 906 | + $mscf_dir = trailingslashit( plugin_dir_path( __FILE__ ) ); | |
| 907 | + $mscf_url = trailingslashit( plugins_url( '', __FILE__ ) ); | |
| 1092 | 908 | |
| 1093 | - // Try our hands at finding the real location | |
| 1094 | - foreach ($locations as $key => $loc) { | |
| 1095 | - $dir = trailingslashit($loc['dir']).$mscf_dirbase; | |
| 1096 | - $url = trailingslashit($loc['url']).$mscf_dirbase; | |
| 1097 | - if (is_file($dir.basename(__FILE__))) { | |
| 1098 | - $mscf_dir = $dir; | |
| 1099 | - $mscf_url = $url; | |
| 1100 | - break; | |
| 1101 | - } | |
| 1102 | - } | |
| 909 | + // Try our hands at finding the real location | |
| 910 | + foreach ( $locations as $key => $loc ) { | |
| 911 | + $dir = trailingslashit( $loc['dir'] ) . $mscf_dirbase; | |
| 912 | + $url = trailingslashit( $loc['url'] ) . $mscf_dirbase; | |
| 913 | + if ( is_file( $dir . basename( __FILE__ ) ) ) { | |
| 914 | + $mscf_dir = $dir; | |
| 915 | + $mscf_url = $url; | |
| 916 | + break; | |
| 917 | + } | |
| 918 | + } | |
| 1103 | 919 | |
| 1104 | - // Define our complete filesystem path | |
| 1105 | - define('MCSF_DIR', $mscf_dir); | |
| 920 | + // Define our complete filesystem path | |
| 921 | + define( 'MCSF_DIR', $mscf_dir ); | |
| 1106 | 922 | |
| 1107 | - /* Lang location needs to be relative *from* ABSPATH, | |
| 1108 | - so strip it out of our language dir location */ | |
| 1109 | - define('MCSF_LANG_DIR', trailingslashit(MCSF_DIR).'po/'); | |
| 1110 | - | |
| 1111 | - // Define our complete URL to the plugin folder | |
| 1112 | - define('MCSF_URL', $mscf_url); | |
| 923 | + // Define our complete URL to the plugin folder | |
| 924 | + define( 'MCSF_URL', $mscf_url ); | |
| 1113 | 925 | } |
| 1114 | 926 | |
| 1115 | 927 | |
| 1116 | 928 | /** |
| 1117 | - * MODIFIED VERSION of wp_verify_nonce from WP Core. Core was not overridden to prevent problems when replacing | |
| 929 | + * MODIFIED VERSION of wp_verify_nonce from WP Core. Core was not overridden to prevent problems when replacing | |
| 1118 | 930 | * something universally. |
| 1119 | 931 | * |
| 1120 | 932 | * Verify that correct nonce was used with time limit. |
| 1121 | 933 | * |
| @@ -1121,45 +933,45 @@ | ||
| 1121 | 933 | * |
| 1122 | 934 | * The user is given an amount of time to use the token, so therefore, since the |
| 1123 | 935 | * UID and $action remain the same, the independent variable is the time. |
| 1124 | 936 | * |
| 1125 | - * @param string $nonce Nonce that was used in the form to verify | |
| 937 | + * @param string $nonce Nonce that was used in the form to verify | |
| 1126 | 938 | * @param string|int $action Should give context to what is taking place and be the same when nonce was created. |
| 1127 | 939 | * @return bool Whether the nonce check passed or failed. |
| 1128 | 940 | */ |
| 1129 | -function mailchimpSF_verify_nonce($nonce, $action = -1) { | |
| 1130 | - $user = wp_get_current_user(); | |
| 1131 | - $uid = (int) $user->ID; | |
| 1132 | - if ( ! $uid ) { | |
| 1133 | - $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); | |
| 1134 | - } | |
| 941 | +function mailchimp_sf_verify_nonce( $nonce, $action = -1 ) { | |
| 942 | + $user = wp_get_current_user(); | |
| 943 | + $uid = (int) $user->ID; | |
| 944 | + if ( ! $uid ) { | |
| 945 | + $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); | |
| 946 | + } | |
| 1135 | 947 | |
| 1136 | - if ( empty( $nonce ) ) { | |
| 1137 | - return false; | |
| 1138 | - } | |
| 948 | + if ( empty( $nonce ) ) { | |
| 949 | + return false; | |
| 950 | + } | |
| 1139 | 951 | |
| 1140 | - $token = 'MAILCHIMP'; | |
| 1141 | - $i = wp_nonce_tick(); | |
| 952 | + $token = 'MAILCHIMP'; | |
| 953 | + $i = wp_nonce_tick(); | |
| 1142 | 954 | |
| 1143 | - // Nonce generated 0-12 hours ago | |
| 1144 | - $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 ); | |
| 1145 | - if ( hash_equals( $expected, $nonce ) ) { | |
| 1146 | - return 1; | |
| 1147 | - } | |
| 955 | + // Nonce generated 0-12 hours ago | |
| 956 | + $expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); | |
| 957 | + if ( hash_equals( $expected, $nonce ) ) { | |
| 958 | + return 1; | |
| 959 | + } | |
| 1148 | 960 | |
| 1149 | - // Nonce generated 12-24 hours ago | |
| 1150 | - $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); | |
| 1151 | - if ( hash_equals( $expected, $nonce ) ) { | |
| 1152 | - return 2; | |
| 1153 | - } | |
| 961 | + // Nonce generated 12-24 hours ago | |
| 962 | + $expected = substr( wp_hash( ( $i - 1 ) . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); | |
| 963 | + if ( hash_equals( $expected, $nonce ) ) { | |
| 964 | + return 2; | |
| 965 | + } | |
| 1154 | 966 | |
| 1155 | - // Invalid nonce | |
| 1156 | - return false; | |
| 967 | + // Invalid nonce | |
| 968 | + return false; | |
| 1157 | 969 | } |
| 1158 | 970 | |
| 1159 | 971 | |
| 1160 | 972 | /** |
| 1161 | - * MODIFIED VERSION of wp_create_nonce from WP Core. Core was not overridden to prevent problems when replacing | |
| 973 | + * MODIFIED VERSION of wp_create_nonce from WP Core. Core was not overridden to prevent problems when replacing | |
| 1162 | 974 | * something universally. |
| 1163 | 975 | * |
| 1164 | 976 | * Creates a cryptographic token tied to a specific action, user, and window of time. |
| 1165 | 977 | * |
| @@ -1165,17 +977,74 @@ | ||
| 1165 | 977 | * |
| 1166 | 978 | * @param string $action Scalar value to add context to the nonce. |
| 1167 | 979 | * @return string The token. |
| 1168 | 980 | */ |
| 1169 | -function mailchimpSF_create_nonce($action = -1) { | |
| 1170 | - $user = wp_get_current_user(); | |
| 1171 | - $uid = (int) $user->ID; | |
| 1172 | - if ( ! $uid ) { | |
| 1173 | - /** This filter is documented in wp-includes/pluggable.php */ | |
| 1174 | - $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); | |
| 1175 | - } | |
| 981 | +function mailchimp_sf_create_nonce( $action = -1 ) { | |
| 982 | + $user = wp_get_current_user(); | |
| 983 | + $uid = (int) $user->ID; | |
| 984 | + if ( ! $uid ) { | |
| 985 | + /** This filter is documented in wp-includes/pluggable.php */ | |
| 986 | + $uid = apply_filters( 'nonce_user_logged_out', $uid, $action ); | |
| 987 | + } | |
| 1176 | 988 | |
| 1177 | - $token = 'MAILCHIMP'; | |
| 1178 | - $i = wp_nonce_tick(); | |
| 989 | + $token = 'MAILCHIMP'; | |
| 990 | + $i = wp_nonce_tick(); | |
| 1179 | 991 | |
| 1180 | - return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); | |
| 1181 | -} | |
| 992 | + return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 ); | |
| 993 | +} | |
| 994 | + | |
| 995 | +/** | |
| 996 | + * Get Mailchimp Access Token. | |
| 997 | + * | |
| 998 | + * @since 1.6.0 | |
| 999 | + * @return string|bool | |
| 1000 | + */ | |
| 1001 | +function mailchimp_sf_get_access_token() { | |
| 1002 | + $access_token = get_option( 'mailchimp_sf_access_token' ); | |
| 1003 | + if ( empty( $access_token ) ) { | |
| 1004 | + return false; | |
| 1005 | + } | |
| 1006 | + | |
| 1007 | + $data_encryption = new Mailchimp_Data_Encryption(); | |
| 1008 | + $access_token = $data_encryption->decrypt( $access_token ); | |
| 1009 | + | |
| 1010 | + // If decryption fails, display notice to user to re-authenticate. | |
| 1011 | + if ( false === $access_token ) { | |
| 1012 | + update_option( 'mailchimp_sf_auth_error', true ); | |
| 1013 | + } | |
| 1014 | + | |
| 1015 | + return $access_token; | |
| 1016 | +} | |
| 1017 | + | |
| 1018 | +/** | |
| 1019 | + * Should display Mailchimp Signup form. | |
| 1020 | + * | |
| 1021 | + * @since 1.6.0 | |
| 1022 | + * @return bool | |
| 1023 | + */ | |
| 1024 | +function mailchimp_sf_should_display_form() { | |
| 1025 | + return mailchimp_sf_get_api() && ! get_option( 'mailchimp_sf_auth_error' ) && get_option( 'mc_list_id' ); | |
| 1026 | +} | |
| 1027 | + | |
| 1028 | +/** | |
| 1029 | + * Get Mailchimp Lists. | |
| 1030 | + * | |
| 1031 | + * @since 2.1.0 | |
| 1032 | + * @return array|WP_Error|false List of Mailchimp lists, or an error/false from the API request. | |
| 1033 | + */ | |
| 1034 | +function mailchimp_sf_get_lists() { | |
| 1035 | + /** | |
| 1036 | + * Filter the limit of lists to fetch. | |
| 1037 | + * | |
| 1038 | + * This value is sanitized to a positive integer and clamped before the API request. | |
| 1039 | + * Defaults to 100. 1000 is the maximum allowed by the API. 1 is the minimum allowed. | |
| 1040 | + */ | |
| 1041 | + $limit = apply_filters( 'mailchimp_sf_list_limit', 100 ); // Default to 100. | |
| 1042 | + $limit = max( 1, min( 1000, absint( $limit ) ) ); | |
| 1043 | + | |
| 1044 | + $api = mailchimp_sf_get_api(); | |
| 1045 | + if ( ! $api ) { | |
| 1046 | + return array(); | |
| 1047 | + } | |
| 1048 | + | |
| 1049 | + return $api->get( 'lists', $limit, array( 'fields' => 'lists.id,lists.name,lists.email_type_option' ) ); | |
| 1050 | +} | |