| @@ -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( |