HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux bsx-1-dev 6.8.0-101-generic #101-Ubuntu SMP PREEMPT_DYNAMIC Mon Feb 9 10:15:05 UTC 2026 x86_64
User: www-data (33)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/wp-content/plugins/memberpress/app/controllers/MeprPostSetupChecklistCtrl.php
<?php

if (!defined('ABSPATH')) {
    die('You are not allowed to call this page directly.');
}

/**
 * Controller for the Post-Setup Checklist feature.
 *
 * Handles rendering the sidebar checklist on MemberPress admin pages
 * and processing AJAX actions for minimize/dismiss functionality.
 */
class MeprPostSetupChecklistCtrl extends MeprBaseCtrl
{
    /**
     * Load hooks for the post-setup checklist.
     *
     * @return void
     */
    public function load_hooks()
    {
        add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts']);
        add_action('admin_footer', [$this, 'render_sidebar'], 100);
        add_action('admin_body_class', [$this, 'add_body_class']);

        // AJAX actions.
        add_action('wp_ajax_mepr_post_setup_checklist_dismiss', [$this, 'ajax_dismiss']);
        add_action('wp_ajax_mepr_post_setup_checklist_minimize', [$this, 'ajax_minimize']);
        add_action('wp_ajax_mepr_post_setup_checklist_expand', [$this, 'ajax_expand']);
        add_action('wp_ajax_mepr_post_setup_checklist_skip_step', [$this, 'ajax_skip_step']);
    }

    /**
     * Enqueue scripts and styles for the checklist.
     *
     * @return void
     */
    public function enqueue_scripts()
    {
        if (!MeprPostSetupChecklistHelper::should_show()) {
            return;
        }

        wp_enqueue_style(
            'mepr-post-setup-checklist',
            MEPR_CSS_URL . '/admin-post-setup-checklist.css',
            [],
            MEPR_VERSION
        );

        wp_enqueue_script(
            'mepr-post-setup-checklist',
            MEPR_JS_URL . '/admin_post_setup_checklist.js',
            [],
            MEPR_VERSION,
            true
        );

        wp_localize_script('mepr-post-setup-checklist', 'MeprPostSetupChecklist', [
            'ajax_url'     => admin_url('admin-ajax.php'),
            'nonce'        => wp_create_nonce('mepr_post_setup_checklist'),
            'addons_nonce' => wp_create_nonce('mepr_addons'),
            'is_minimized' => MeprPostSetupChecklistHelper::is_minimized(),
            'i18n'         => [
                'confirm'     => __('Are you sure you want to dismiss the setup checklist? You can always access setup options from the Settings menu.', 'memberpress'),
                'skip'        => __('Skip', 'memberpress'),
                'skipping'    => __('Skipping...', 'memberpress'),
                'installing'  => __('Installing...', 'memberpress'),
                'activating'  => __('Activating...', 'memberpress'),
                'install_err' => __('Installation failed. Please try again.', 'memberpress'),
                'activate_err' => __('Activation failed. Please try again.', 'memberpress'),
            ],
        ]);
    }

    /**
     * Add body class when checklist is shown.
     *
     * @param string $classes Space-separated list of body classes.
     *
     * @return string Modified body classes.
     */
    public function add_body_class($classes)
    {
        if (!MeprPostSetupChecklistHelper::should_show()) {
            return $classes;
        }

        $classes .= ' mepr-has-post-setup-checklist';

        if (MeprPostSetupChecklistHelper::is_minimized()) {
            $classes .= ' mepr-post-setup-checklist-minimized';
        }

        return $classes;
    }

    /**
     * Render the sidebar checklist.
     *
     * @return void
     */
    public function render_sidebar()
    {
        if (!MeprPostSetupChecklistHelper::should_show()) {
            return;
        }

        $steps          = MeprPostSetupChecklistHelper::get_grouped_steps();
        $optional_steps = MeprPostSetupChecklistHelper::get_optional_steps();
        $progress       = MeprPostSetupChecklistHelper::get_progress_percentage();
        $completed      = MeprPostSetupChecklistHelper::get_completed_count();
        $total          = MeprPostSetupChecklistHelper::get_total_count();
        $is_minimized   = MeprPostSetupChecklistHelper::is_minimized();
        $next_step      = MeprPostSetupChecklistHelper::get_next_step();

        MeprView::render('/admin/post-setup-checklist/sidebar', compact(
            'steps',
            'optional_steps',
            'progress',
            'completed',
            'total',
            'is_minimized',
            'next_step'
        ));
    }

    /**
     * AJAX handler to dismiss the checklist.
     *
     * @return void
     */
    public function ajax_dismiss()
    {
        check_ajax_referer('mepr_post_setup_checklist', 'nonce');

        if (!MeprUtils::is_mepr_admin()) {
            wp_send_json_error(__('You do not have permission to perform this action.', 'memberpress'));
        }

        MeprPostSetupChecklistHelper::dismiss();

        wp_send_json_success([
            'message' => __('Checklist dismissed.', 'memberpress'),
        ]);
    }

    /**
     * AJAX handler to minimize the checklist.
     *
     * @return void
     */
    public function ajax_minimize()
    {
        check_ajax_referer('mepr_post_setup_checklist', 'nonce');

        if (!MeprUtils::is_mepr_admin()) {
            wp_send_json_error(__('You do not have permission to perform this action.', 'memberpress'));
        }

        MeprPostSetupChecklistHelper::set_minimized(true);

        wp_send_json_success([
            'message' => __('Checklist minimized.', 'memberpress'),
        ]);
    }

    /**
     * AJAX handler to expand the checklist.
     *
     * @return void
     */
    public function ajax_expand()
    {
        check_ajax_referer('mepr_post_setup_checklist', 'nonce');

        if (!MeprUtils::is_mepr_admin()) {
            wp_send_json_error(__('You do not have permission to perform this action.', 'memberpress'));
        }

        MeprPostSetupChecklistHelper::set_minimized(false);

        wp_send_json_success([
            'message' => __('Checklist expanded.', 'memberpress'),
        ]);
    }

    /**
     * AJAX handler to skip a step.
     *
     * @return void
     */
    public function ajax_skip_step()
    {
        check_ajax_referer('mepr_post_setup_checklist', 'nonce');

        if (!MeprUtils::is_mepr_admin()) {
            wp_send_json_error(__('You do not have permission to perform this action.', 'memberpress'));
        }

        $step_id = isset($_POST['step_id']) ? sanitize_text_field(wp_unslash($_POST['step_id'])) : '';

        if (empty($step_id)) {
            wp_send_json_error(__('Invalid step ID.', 'memberpress'));
        }

        MeprPostSetupChecklistHelper::skip_step($step_id);

        wp_send_json_success([
            'message' => __('Step skipped.', 'memberpress'),
            'step_id' => $step_id,
        ]);
    }
}