PluginProbe
Mailchimp List Subscribe Form / trunk
Mailchimp List Subscribe Form vtrunk
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
← All changes | includes/class-mailchimp-admin.php +177 -36 1.6.0 → trunk View file →
@@ -1,8 +1,16 @@
1 1 <?php
2 2 /**
3 3 * Class responsible for admin side functionalities.
4 4 *
5 + * The long term plan is to break up admin functionality into smaller, more focused
6 + * files to improve maintainability. This could also include:
7 + * - Moving OAuth related code to oauth.php
8 + * - Moving account creation code to account.php
9 + * - Moving settings page code to settings.php
10 + * - Moving notices code to notices.php (already done)
11 + * This will help avoid having too much code in a single file and make the codebase more modular.
12 + *
5 13 * @package Mailchimp
6 14 */
7 15
8 16 // Exit if accessed directly.
@@ -33,12 +41,18 @@
33 41 add_action( 'wp_ajax_mailchimp_sf_oauth_start', array( $this, 'start_oauth_process' ) );
34 42 add_action( 'wp_ajax_mailchimp_sf_oauth_finish', array( $this, 'finish_oauth_process' ) );
35 43 add_action( 'wp_ajax_mailchimp_sf_create_account', array( $this, 'mailchimp_create_account' ) );
36 44 add_action( 'wp_ajax_mailchimp_sf_check_login_session', array( $this, 'check_login_session' ) );
45 + add_action( 'wp_ajax_mailchimp_sf_preview_form', array( $this, 'preview_subscribe_form' ) );
37 46
38 47 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_page_scripts' ) );
39 - add_action( 'admin_menu', array( $this, 'add_create_account_page' ) );
48 + add_action( 'admin_menu', array( $this, 'add_admin_menu_pages' ) );
40 49 add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) );
50 +
51 + Mailchimp_Admin_Notices::instance()->init();
52 +
53 + $user_sync = new Mailchimp_User_Sync();
54 + $user_sync->init();
41 55 }
42 56
43 57 /**
44 58 * Start the OAuth process.
@@ -273,8 +287,59 @@
273 287 }
274 288 }
275 289
276 290 /**
291 + * Preview the subscribe form.
292 + *
293 + * This function is called via AJAX.
294 + *
295 + * This function previews the subscribe form on the settings page based on the form settings.
296 + */
297 + public function preview_subscribe_form() {
298 + // Check the nonce for security
299 + check_ajax_referer( 'mailchimp_sf_preview_form_nonce', 'nonce' );
300 +
301 + // Validate the permissions.
302 + if ( ! current_user_can( 'manage_options' ) ) {
303 + wp_send_json_error( array( 'message' => esc_html__( 'You do not have permission to perform this action.', 'mailchimp' ) ) );
304 + }
305 +
306 + $fields = isset( $_POST['preview_data']['fields'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['preview_data']['fields'] ) ) : array();
307 + $fields = array_map(
308 + function ( $ele ) {
309 + return 'true' === $ele;
310 + },
311 + $fields
312 + );
313 + $groups = isset( $_POST['preview_data']['groups'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['preview_data']['groups'] ) ) : array();
314 + $groups = array_map(
315 + function ( $ele ) {
316 + return 'true' === $ele;
317 + },
318 + $groups
319 + );
320 +
321 + $preview_data = array(
322 + 'header' => isset( $_POST['preview_data']['header'] ) ? sanitize_text_field( wp_unslash( $_POST['preview_data']['header'] ) ) : get_option( 'mc_header_content' ),
323 + 'sub_heading' => isset( $_POST['preview_data']['sub_heading'] ) ? sanitize_text_field( wp_unslash( $_POST['preview_data']['sub_heading'] ) ) : get_option( 'mc_subheader_content' ),
324 + 'submit_text' => isset( $_POST['preview_data']['submit_text'] ) ? sanitize_text_field( wp_unslash( $_POST['preview_data']['submit_text'] ) ) : get_option( 'mc_submit_text' ),
325 + 'fields' => $fields,
326 + 'groups' => $groups,
327 + 'display_unsub_link' => isset( $_POST['preview_data']['display_unsub_link'] ) ? 'true' === sanitize_text_field( wp_unslash( $_POST['preview_data']['display_unsub_link'] ) ) : get_option( 'mc_use_unsub_link' ),
328 + );
329 +
330 + ob_start();
331 + mailchimp_sf_signup_form(
332 + array(
333 + 'is_preview' => true,
334 + 'preview_data' => $preview_data,
335 + )
336 + );
337 + $form = ob_get_clean();
338 + wp_send_json_success( $form );
339 + }
340 +
341 + /**
277 342 * Verify and save the OAuth token.
278 343 *
279 344 * @param string $access_token The token to verify.
280 345 * @param string $data_center The data center to verify.
@@ -298,8 +363,9 @@
298 363 if ( isset( $user['role'] ) && in_array( $user['role'], $valid_roles, true ) ) {
299 364 $data_encryption = new Mailchimp_Data_Encryption();
300 365
301 366 // Clean up the old data.
367 + delete_option( 'mc_api_key' ); // Deprecated API key, need to remove as part of the migration.
302 368 delete_option( 'mailchimp_sf_access_token' );
303 369 delete_option( 'mailchimp_sf_auth_error' );
304 370 delete_option( 'mc_datacenter' );
305 371
@@ -305,10 +371,30 @@
305 371
306 372 update_option( 'mailchimp_sf_access_token', $data_encryption->encrypt( $access_token ) );
307 373 update_option( 'mc_datacenter', sanitize_text_field( $data_center ) );
308 374 update_option( 'mc_user', $this->sanitize_data( $user ) );
375 +
376 + // Clear Mailchimp List ID if saved list is not available.
377 + $lists = mailchimp_sf_get_lists();
378 + if ( ! is_wp_error( $lists ) ) {
379 + $lists = $lists['lists'] ?? array();
380 + $saved_list_id = get_option( 'mc_list_id' );
381 + $list_ids = array_map(
382 + function ( $ele ) {
383 + return $ele['id'];
384 + },
385 + $lists
386 + );
387 + if ( ! in_array( $saved_list_id, $list_ids, true ) ) {
388 + delete_option( 'mc_list_id' );
389 + }
390 +
391 + // Update lists option.
392 + if ( ! empty( $lists ) ) {
393 + update_option( 'mailchimp_sf_lists', $lists );
394 + }
395 + }
309 396 return true;
310 -
311 397 } else {
312 398 $msg = esc_html__( 'API Key must belong to "Owner", "Admin", or "Manager."', 'mailchimp' );
313 399 return new WP_Error( 'mailchimp-sf-invalid-role', $msg );
314 400 }
@@ -322,31 +408,51 @@
322 408 public function admin_notices() {
323 409 if ( ! current_user_can( 'manage_options' ) ) {
324 410 return;
325 411 }
412 + $current_screen = get_current_screen();
326 413
327 414 // Display a deprecation notice if the user is using an API key to connect with Mailchimp.
328 415 if ( get_option( 'mc_api_key', '' ) && ! get_option( 'mailchimp_sf_access_token', '' ) && mailchimp_sf_should_display_form() ) {
329 - ?>
330 - <div class="notice notice-warning is-dismissible">
331 - <p>
332 - <?php
333 - $message = sprintf(
334 - /* translators: Placeholders: %1$s - <a> tag, %2$s - </a> tag */
335 - __( 'Heads up! It looks like you\'re using an API key to connect with Mailchimp, which is now deprecated. Please log out and reconnect your Mailchimp account using the new OAuth authentication by clicking the "Log in" button on the %1$splugin settings%2$s page.', 'mailchimp' ),
336 - '<a href="' . esc_url( admin_url( 'admin.php?page=mailchimp_sf_options' ) ) . '">',
337 - '</a>'
338 - );
339 416
340 - echo wp_kses( $message, array( 'a' => array( 'href' => array() ) ) );
341 - ?>
342 - </p>
343 - </div>
344 - <?php
417 + if ( $current_screen && 'toplevel_page_mailchimp_sf_options' === $current_screen->id ) {
418 + ?>
419 + <div class="notice notice-warning">
420 + <p>
421 + <?php
422 + esc_html_e( 'You are using an outdated API Key connection to Mailchimp, please migrate to the new OAuth authentication method to continue accessing your Mailchimp account.', 'mailchimp' );
423 + ?>
424 + </p>
425 + <div class="migrate-to-oauth-wrapper">
426 + <?php
427 + // Migrate button.
428 + $login_button_text = __( 'Migrate to OAuth authentication', 'mailchimp' );
429 + include_once MCSF_DIR . 'includes/admin/templates/login-button.php'; // phpcs:ignore PEAR.Files.IncludingFile.UseRequireOnce
430 + ?>
431 + </div>
432 + </div>
433 + <?php
434 + } else {
435 + ?>
436 + <div class="notice notice-warning is-dismissible">
437 + <p>
438 + <?php
439 + $message = sprintf(
440 + /* translators: Placeholders: %1$s - <a> tag, %2$s - </a> tag */
441 + __( 'You are using an outdated API Key connection to Mailchimp, please migrate to the new OAuth authentication method to continue accessing your Mailchimp account by clicking the "Migrate to OAuth authentication" button on the %1$sMailchimp settings%2$s page.', 'mailchimp' ),
442 + '<a href="' . esc_url( admin_url( 'admin.php?page=mailchimp_sf_options' ) ) . '">',
443 + '</a>'
444 + );
445 +
446 + echo wp_kses( $message, array( 'a' => array( 'href' => array() ) ) );
447 + ?>
448 + </p>
449 + </div>
450 + <?php
451 + }
345 452 }
346 453
347 454 // Display a notice if the user is waiting for the login to complete.
348 - $current_screen = get_current_screen();
349 455 if ( $current_screen && 'toplevel_page_mailchimp_sf_options' === $current_screen->id ) {
350 456 $api = mailchimp_sf_get_api();
351 457 if ( $api && 'waiting' === get_option( 'mailchimp_sf_waiting_for_login' ) ) {
352 458 $profile = $api->get( '' );
@@ -426,18 +532,22 @@
426 532 wp_enqueue_script( 'showMe', MCSF_URL . 'assets/js/hidecss.js', array( 'jquery' ), MCSF_VER, true );
427 533 wp_enqueue_script( 'mailchimp_sf_admin', MCSF_URL . 'assets/js/admin.js', array( 'jquery', 'jquery-ui-dialog' ), MCSF_VER, true );
428 534
429 535 $data = array(
430 - 'ajax_url' => esc_url( admin_url( 'admin-ajax.php' ) ),
431 - 'oauth_url' => esc_url( $this->oauth_url ),
432 - 'oauth_start_nonce' => wp_create_nonce( 'mailchimp_sf_oauth_start_nonce' ),
433 - 'oauth_finish_nonce' => wp_create_nonce( 'mailchimp_sf_oauth_finish_nonce' ),
434 - 'oauth_window_name' => esc_html__( 'Mailchimp For WordPress OAuth', 'mailchimp' ),
435 - 'generic_error' => esc_html__( 'An error occurred. Please try again.', 'mailchimp' ),
436 - 'modal_title' => esc_html__( 'Login Popup is blocked!', 'mailchimp' ),
437 - 'modal_button_try_again' => esc_html__( 'Try again', 'mailchimp' ),
438 - 'modal_button_cancel' => esc_html__( 'No, cancel!', 'mailchimp' ),
439 - 'admin_settings_url' => esc_url( admin_url( 'admin.php?page=mailchimp_sf_options' ) ),
536 + 'ajax_url' => esc_url( admin_url( 'admin-ajax.php' ) ),
537 + 'oauth_url' => esc_url( $this->oauth_url ),
538 + 'oauth_start_nonce' => wp_create_nonce( 'mailchimp_sf_oauth_start_nonce' ),
539 + 'oauth_finish_nonce' => wp_create_nonce( 'mailchimp_sf_oauth_finish_nonce' ),
540 + 'oauth_window_name' => esc_html__( 'Mailchimp For WordPress OAuth', 'mailchimp' ),
541 + 'generic_error' => esc_html__( 'An error occurred. Please try again.', 'mailchimp' ),
542 + 'modal_title' => esc_html__( 'Login Popup is blocked!', 'mailchimp' ),
543 + 'modal_button_try_again' => esc_html__( 'Try again', 'mailchimp' ),
544 + 'modal_button_cancel' => esc_html__( 'No, cancel!', 'mailchimp' ),
545 + 'admin_settings_url' => esc_url( admin_url( 'admin.php?page=mailchimp_sf_options' ) ),
546 + 'user_sync_status_nonce' => wp_create_nonce( 'mailchimp_sf_user_sync_status' ),
547 + 'delete_user_sync_error_nonce' => wp_create_nonce( 'mailchimp_sf_delete_user_sync_error' ),
548 + 'no_errors_found' => esc_html__( 'No errors found', 'mailchimp' ),
549 + 'preview_form_nonce' => wp_create_nonce( 'mailchimp_sf_preview_form_nonce' ),
440 550 );
441 551
442 552 // Create account page specific data.
443 553 if ( 'admin_page_mailchimp_sf_create_account' === $hook_suffix ) {
@@ -457,14 +567,34 @@
457 567 );
458 568 }
459 569
460 570 /**
461 - * Add the create account page.
571 + * Add the create account page and the settings page to the admin menu.
462 572 *
463 - * @since x.x.x
573 + * @since 1.6.0
464 574 */
465 - public function add_create_account_page() {
575 + public function add_admin_menu_pages() {
576 + // Add settings page.
577 + add_menu_page(
578 + esc_html__( 'Mailchimp Setup', 'mailchimp' ),
579 + esc_html__( 'Mailchimp', 'mailchimp' ),
580 + MCSF_CAP_THRESHOLD,
581 + 'mailchimp_sf_options',
582 + array( $this, 'settings_page' ),
583 + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1Mi4wMyA1NSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOiNmZmY7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5Bc3NldCAxPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTExLjY0LDI4LjU0YTQuNzUsNC43NSwwLDAsMC0xLjE3LjA4Yy0yLjc5LjU2LTQuMzYsMi45NC00LjA1LDZhNi4yNCw2LjI0LDAsMCwwLDUuNzIsNS4yMSw0LjE3LDQuMTcsMCwwLDAsLjgtLjA2YzIuODMtLjQ4LDMuNTctMy41NSwzLjEtNi41N0MxNS41MSwyOS44MywxMy4yMSwyOC42MywxMS42NCwyOC41NFptMi43Nyw4LjA3YTEuMTcsMS4xNywwLDAsMS0xLjEuNTUsMS41MywxLjUzLDAsMCwxLTEuMzctMS41OEE0LDQsMCwwLDEsMTIuMjMsMzRhMS40NCwxLjQ0LDAsMCwwLS41NS0xLjc0LDEuNDgsMS40OCwwLDAsMC0xLjEyLS4yMSwxLjQ0LDEuNDQsMCwwLDAtLjkyLjY0LDMuMzksMy4zOSwwLDAsMC0uMzQuNzlsMCwuMTFjLS4xMy4zNC0uMzMuNDUtLjQ3LjQzcy0uMTYtLjA1LS4yMS0uMjFhMywzLDAsMCwxLC43OC0yLjU1LDIuNDYsMi40NiwwLDAsMSwyLjExLS43NiwyLjUsMi41LDAsMCwxLDEuOTEsMS4zOSwzLjE5LDMuMTksMCwwLDEtLjIzLDIuODJsLS4wOS4yQTEuMTYsMS4xNiwwLDAsMCwxMywzNmEuNzQuNzQsMCwwLDAsLjYzLjMyLDEuMzgsMS4zOCwwLDAsMCwuMzQsMGMuMTUsMCwuMy0uMDcuMzksMEEuMjQuMjQsMCwwLDEsMTQuNDEsMzYuNjFaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNNTEsMzMuODhhMy44NCwzLjg0LDAsMCwwLTEuMTUtMWwtLjExLS4zNy0uMTQtLjQyYTUuNTcsNS41NywwLDAsMCwuNS0zLjMyLDUuNDMsNS40MywwLDAsMC0xLjU0LTMsMTAuMDksMTAuMDksMCwwLDAtNC4yNC0yLjI2YzAtLjY3LDAtMS40My0uMDYtMS45YTEyLjgzLDEyLjgzLDAsMCwwLS40OS0zLjI1LDEwLjQ2LDEwLjQ2LDAsMCwwLTEuMy0yLjkyYzIuMTQtMi41NiwzLjI5LTUuMjEsMy4yOS03LjU3LDAtMy44My0zLTYuMy03LjU5LTYuM2ExOS4zLDE5LjMsMCwwLDAtNy4yMiwxLjZsLS4zNC4xNEwyOC43LDEuNTJBNi4zMSw2LjMxLDAsMCwwLDI0LjQzLDAsMTQuMDcsMTQuMDcsMCwwLDAsMTcuNiwyLjJhMzYuOTMsMzYuOTMsMCwwLDAtNi43OCw1LjIxYy00LjYsNC4zOC04LjMsOS42My05LjkxLDE0QTEyLjUxLDEyLjUxLDAsMCwwLDAsMjYuNTRhNi4xNiw2LjE2LDAsMCwwLDIuMTMsNC40bC43OC42NkExMC40NCwxMC40NCwwLDAsMCwyLjc0LDM1YTkuMzYsOS4zNiwwLDAsMCwzLjIxLDYsMTAsMTAsMCwwLDAsNS4xMywyLjQzLDIwLjE5LDIwLjE5LDAsMCwwLDcuMzEsOEEyMy4zMywyMy4zMywwLDAsMCwzMC4xNyw1NUgzMWEyMy4yNywyMy4yNywwLDAsMCwxMi0zLjE2LDE5LjEsMTkuMSwwLDAsMCw3LjgyLTkuMDZsMCwwQTE2Ljg5LDE2Ljg5LDAsMCwwLDUyLDM3LjIzLDUuMTcsNS4xNywwLDAsMCw1MSwzMy44OFptLTEuNzgsOC4yMWMtMyw3LjI5LTEwLjMsMTEuMzUtMTksMTEuMDktOC4wNi0uMjQtMTQuOTQtNC41LTE4LTExLjQzYTcuOTQsNy45NCwwLDAsMS01LjEyLTIuMDYsNy41Niw3LjU2LDAsMCwxLTIuNjEtNC44NUE4LjMxLDguMzEsMCwwLDEsNSwzMUwzLjMyLDI5LjU2Qy00LjQyLDIzLDE5Ljc3LTMuODYsMjcuNTEsMi44OWwyLjY0LDIuNTgsMS40NC0uNjFjNi43OS0yLjgxLDEyLjMtMS40NSwxMi4zLDMsMCwyLjMzLTEuNDgsNS4wNS0zLjg2LDcuNTJhNy41NCw3LjU0LDAsMCwxLDIsMy40OCwxMSwxMSwwLDAsMSwuNDIsMi44MmMwLDEsLjA5LDMuMTYuMDksMy4ybDEsLjI3QTguNjQsOC42NCwwLDAsMSw0Ny4yLDI3YTMuNjYsMy42NiwwLDAsMSwxLjA2LDIuMDZBNCw0LDAsMCwxLDQ3LjU1LDMyLDEwLjE1LDEwLjE1LDAsMCwxLDQ4LDMzLjA4Yy4yLjY0LjM1LDEuMTguMzcsMS4yNS43NCwwLDEuODkuODUsMS44OSwyLjg5QTE1LjI5LDE1LjI5LDAsMCwxLDQ5LjE4LDQyLjA5WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTQ4LDM2YTEuMzYsMS4zNiwwLDAsMC0uODYtLjE2LDExLjc2LDExLjc2LDAsMCwwLS44Mi0yLjc4QTE3Ljg5LDE3Ljg5LDAsMCwxLDQwLjQ1LDM2YTIzLjY0LDIzLjY0LDAsMCwxLTcuODEuODRjLTEuNjktLjE0LTIuODEtLjYzLTMuMjMuNzRhMTguMywxOC4zLDAsMCwwLDgsLjgxLjE0LjE0LDAsMCwxLC4xNi4xMy4xNS4xNSwwLDAsMS0uMDkuMTVzLTMuMTQsMS40Ni04LjE0LS4wOGEyLjU4LDIuNTgsMCwwLDAsMS44MywxLjkxLDguMjQsOC4yNCwwLDAsMCwxLjQ0LjM5YzYuMTksMS4wNiwxMi0yLjQ3LDEzLjI3LTMuMzYuMS0uMDcuMTYsMCwuMDguMTJsLS4xMy4xOGMtMS41OSwyLjA2LTUuODgsNC40NC0xMS40NSw0LjQ0LTIuNDMsMC00Ljg2LS44Ni01Ljc1LTIuMTctMS4zOC0yLS4wNy01LDIuMjQtNC43MWwxLC4xMWEyMS4xMywyMS4xMywwLDAsMCwxMC41LTEuNjhjMy4xNS0xLjQ2LDQuMzQtMy4wNyw0LjE2LTQuMzdBMS44NywxLjg3LDAsMCwwLDQ2LDI4LjM0YTYuOCw2LjgsMCwwLDAtMy0xLjQxYy0uNS0uMTQtLjg0LS4yMy0xLjItLjM1LS42NS0uMjEtMS0uMzktMS0xLjYxLDAtLjUzLS4xMi0yLjQtLjE2LTMuMTYtLjA2LTEuMzUtLjIyLTMuMTktMS4zNi00YTEuOTIsMS45MiwwLDAsMC0xLS4zMSwxLjg2LDEuODYsMCwwLDAtLjU4LjA2LDMuMDcsMy4wNywwLDAsMC0xLjUyLjg2LDUuMjQsNS4yNCwwLDAsMS00LDEuMzJjLS44LDAtMS42NS0uMTYtMi42Mi0uMjJsLS41NywwYTUuMjIsNS4yMiwwLDAsMC01LDQuNTdjLS41NiwzLjgzLDIuMjIsNS44MSwzLDdhMSwxLDAsMCwxLC4yMi41Mi44My44MywwLDAsMS0uMjguNTVoMGE5LjgsOS44LDAsMCwwLTIuMTYsOS4yLDcuNTksNy41OSwwLDAsMCwuNDEsMS4xMmMyLDQuNzMsOC4zLDYuOTMsMTQuNDMsNC45M2ExNS4wNiwxNS4wNiwwLDAsMCwyLjMzLTEsMTIuMjMsMTIuMjMsMCwwLDAsMy41Ny0yLjY3LDEwLjYxLDEwLjYxLDAsMCwwLDMtNS44MkM0OC42LDM2LjcsNDguMzMsMzYuMjMsNDgsMzZabS04LjI1LTcuODJjMCwuNS0uMzEuOTEtLjY4LjlzLS42Ni0uNDItLjY1LS45Mi4zMS0uOTEuNjgtLjlTMzkuNzIsMjcuNjgsMzkuNzEsMjguMThabS0xLjY4LTZjLjcxLS4xMiwxLjA2LjYyLDEuMzIsMS44NWEzLjY0LDMuNjQsMCwwLDEtLjA1LDIsNC4xNCw0LjE0LDAsMCwwLTEuMDYsMCw0LjEzLDQuMTMsMCwwLDEtLjY4LTEuNjRDMzcuMjksMjMuMjMsMzcuMzEsMjIuMzQsMzgsMjIuMjNabS0yLjQsNi41N2EuODIuODIsMCwwLDEsMS4xMS0uMTljLjQ1LjIyLjY5LjY3LjUzLDFhLjgyLjgyLDAsMCwxLTEuMTEuMTlDMzUuNywyOS41OCwzNS40NywyOS4xMywzNS42MywyOC44Wm0tMi44LS4zN2MtLjA3LjExLS4yMy4wOS0uNTcuMDZhNC4yNCw0LjI0LDAsMCwwLTIuMTQuMjIsMiwyLDAsMCwxLS40OS4xNC4xNi4xNiwwLDAsMS0uMTEsMCwuMTUuMTUsMCwwLDEtLjA1LS4xMi44MS44MSwwLDAsMSwuMzItLjUxLDIuNDEsMi40MSwwLDAsMSwxLjI3LS41MywxLjk0LDEuOTQsMCwwLDEsMS43NS41N0EuMTkuMTksMCwwLDEsMzIuODMsMjguNDNabS01LjExLTEuMjZjLS4xMiwwLS4xNy0uMDctLjE5LS4xNHMuMjgtLjU2LjYyLS44MWEzLjYsMy42LDAsMCwxLDMuNTEtLjQyQTMsMywwLDAsMSwzMywyNi44N2MuMTIuMi4xNS4zNS4wNy40NHMtLjQ0LDAtLjk1LS4yNGE0LjE4LDQuMTgsMCwwLDAtMi0uNDNBMjEuODUsMjEuODUsMCwwLDAsMjcuNzEsMjcuMTdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJNMzUuNSwxMy4yOWMuMSwwLC4xNi0uMTUuMDctLjJhMTEsMTEsMCwwLDAtNC42OS0xLjIzLjA5LjA5LDAsMCwxLS4wNy0uMTQsNC43OCw0Ljc4LDAsMCwxLC44OC0uODkuMDkuMDksMCwwLDAtLjA2LS4xNiwxMi40NiwxMi40NiwwLDAsMC01LjYxLDIsLjA5LjA5LDAsMCwxLS4xMy0uMDksNi4xNiw2LjE2LDAsMCwxLC41OS0xLjQ1LjA4LjA4LDAsMCwwLS4xMS0uMTFBMjIuNzksMjIuNzksMCwwLDAsMjAsMTYuMjRhLjA5LjA5LDAsMCwwLC4xMi4xM0ExOS41MywxOS41MywwLDAsMSwyNywxMy4zMiwxOS4xLDE5LjEsMCwwLDEsMzUuNSwxMy4yOVoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik0yOC4zNCw2LjQyUzI2LjIzLDQsMjUuNiwzLjhDMjEuNjksMi43NCwxMy4yNCw4LjU3LDcuODQsMTYuMjcsNS42NiwxOS4zOSwyLjUzLDI0LjksNCwyNy43NGExMS40MywxMS40MywwLDAsMCwxLjc5LDEuNzJBNi42NSw2LjY1LDAsMCwxLDEwLDI2Ljc4LDM0LjIxLDM0LjIxLDAsMCwxLDIwLjgsMTEuNjIsNTUuMDksNTUuMDksMCwwLDEsMjguMzQsNi40MloiLz48L2c+PC9nPjwvc3ZnPg=='
584 + );
585 +
586 + // Rename the auto-generated first submenu item to "Form Settings".
466 587 add_submenu_page(
588 + 'mailchimp_sf_options',
589 + esc_html__( 'Mailchimp Form Settings', 'mailchimp' ),
590 + esc_html__( 'Form Settings', 'mailchimp' ),
591 + MCSF_CAP_THRESHOLD,
592 + 'mailchimp_sf_options',
593 + array( $this, 'settings_page' )
594 + );
595 +
596 + add_submenu_page(
467 597 'admin.php',
468 598 esc_html__( 'Create Mailchimp Account', 'mailchimp' ),
469 599 esc_html__( 'Create Mailchimp Account', 'mailchimp' ),
470 600 'manage_options',
@@ -475,9 +605,9 @@
475 605
476 606 /**
477 607 * Create account page.
478 608 *
479 - * @since x.x.x
609 + * @since 1.6.0
480 610 *
481 611 * @return void
482 612 */
483 613 public function create_account_page() {
@@ -492,11 +622,22 @@
492 622 <?php
493 623 }
494 624
495 625 /**
626 + * Render the settings page.
627 + *
628 + * @since 1.9.0
629 + *
630 + * @return void
631 + */
632 + public function settings_page() {
633 + include_once MCSF_DIR . 'includes/admin/templates/settings.php';
634 + }
635 +
636 + /**
496 637 * Get a list of timezones.
497 638 *
498 - * @since x.x.x
639 + * @since 1.6.0
499 640 *
500 641 * @return array
501 642 */
502 643 private function get_timezones() {
@@ -505,9 +646,9 @@
505 646
506 647 /**
507 648 * Get a list of countries.
508 649 *
509 - * @since x.x.x
650 + * @since 1.6.0
510 651 *
511 652 * @return array
512 653 */
513 654 public function get_countries() {
@@ -766,9 +907,9 @@
766 907
767 908 /**
768 909 * Display the Mailchimp footer text on the Mailchimp admin pages.
769 910 *
770 - * @since x.x.x
911 + * @since 1.6.0
771 912 *
772 913 * @param string $text The current footer text.
773 914 * @return string The modified footer text.
774 915 */
@@ -774,9 +915,9 @@
774 915 */
775 916 public function admin_footer_text( $text ) {
776 917 $current_screen = get_current_screen();
777 918 $current_screen_id = $current_screen ? $current_screen->id : '';
778 - if ( ! in_array( $current_screen_id, array( 'toplevel_page_mailchimp_sf_options', 'admin_page_mailchimp_sf_create_account' ), true ) ) {
919 + if ( ! in_array( $current_screen_id, array( 'toplevel_page_mailchimp_sf_options', 'admin_page_mailchimp_sf_create_account', 'mailchimp_page_mailchimp_sf_analytics' ), true ) ) {
779 920 return $text;
780 921 }
781 922
782 923 return wp_kses(