# adminify/4.3.2/Inc/Classes/Wizard/Adminify_Setup_Wizard.php

Adminify – White Label, Admin Menu Editor, Login Customizer, version 4.3.2. 317 lines.

- Page: https://pluginprobe.com/plugins/adminify/4.3.2/code/Inc/Classes/Wizard/Adminify_Setup_Wizard.php
- Raw: https://pluginprobe.com/plugins/adminify/4.3.2/raw/Inc/Classes/Wizard/Adminify_Setup_Wizard.php
- Modified: 2026-06-24T09:08:20+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/adminify/4.3.2/code/Inc/Classes/Wizard/Adminify_Setup_Wizard.php#L10-L20`.

```php
<?php

namespace PXLBSAdminify\Inc\Classes\Wizard;

use \PXLBSAdminify\Inc\Admin\AdminSettings;
use PXLBSAdminify\Inc\Utils;

// no direct access allowed
if (!defined('ABSPATH')) {
	exit;
}

class Adminify_Setup_Wizard {
	public $options;

	public function __construct() {

		if (current_user_can('manage_options') && current_user_can('administrator')) {

			add_action('wp_ajax_pxlbsadminify_save_wizard_data', [$this, 'pxlbsadminify_save_wizard_data']);

			$this->options = (array) AdminSettings::get_instance()->get();

			$this->setup_wizard();

			add_action('wp_ajax_pxlbsadminify_drag_and_drop_image', [$this, 'pxlbsadminify_drag_and_drop_image_callback']);

		}

	}

	// Drag and Drop Image
	public function pxlbsadminify_drag_and_drop_image_callback() {
		check_ajax_referer('pxlbsadminify_sw');

		// Security check - only administrators can upload images via wizard
		if (!current_user_can('manage_options')) {
			wp_send_json_error(__('You do not have permission to perform this action.', 'adminify'));
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified above; settings array recursively sanitized via wp_kses_post_deep().
		$data_source = empty($_POST['settings']) ? [] : (array) wp_kses_post_deep(wp_unslash($_POST['settings']));

		$base64_image = isset($data_source['image_data']) ? (string) $data_source['image_data'] : '';

		// Validate the data URI shape before parsing.
		if (strpos($base64_image, ';') === false || strpos($base64_image, ',') === false) {
			wp_send_json_error(__('Invalid image data.', 'adminify'));
		}

		// Extract the base64 data (remove the data URI scheme)
		list($type, $data) = explode(';', $base64_image);
		list(, $data) = explode(',', $data);
		$decoded_data = base64_decode($data, true);

		if ($decoded_data === false) {
			wp_send_json_error(__('Invalid image data.', 'adminify'));
		}

		// Sanitize the filename: strip any path components and enforce an image extension allowlist.
		$raw_name  = isset($data_source['image_name']) ? (string) $data_source['image_name'] : '';
		$safe_name = sanitize_file_name(basename($raw_name));

		$filetype = wp_check_filetype($safe_name);
		$allowed  = array('jpg', 'jpeg', 'png', 'gif', 'webp');
		if (empty($safe_name) || !in_array(strtolower((string) $filetype['ext']), $allowed, true)) {
			wp_send_json_error(__('Invalid image file type.', 'adminify'));
		}

		// Write the decoded bytes into the uploads dir (handles unique filename + path).
		$uploaded = wp_upload_bits($safe_name, null, $decoded_data);
		if (!empty($uploaded['error']) || empty($uploaded['file'])) {
			wp_send_json_error(__('Failed to save the image.', 'adminify'));
		}

		// Register the file as a Media Library attachment so it behaves like a normal upload.
		$attachment = array(
			'post_mime_type' => $filetype['type'],
			'post_title'     => sanitize_text_field(pathinfo($safe_name, PATHINFO_FILENAME)),
			'post_content'   => '',
			'post_status'    => 'inherit',
		);

		$attachment_id = wp_insert_attachment($attachment, $uploaded['file']);
		if (is_wp_error($attachment_id) || !$attachment_id) {
			wp_send_json_error(__('Failed to register the image in the media library.', 'adminify'));
		}

		// Generate thumbnails/metadata for the attachment.
		require_once ABSPATH . 'wp-admin/includes/image.php';
		$metadata = wp_generate_attachment_metadata($attachment_id, $uploaded['file']);
		wp_update_attachment_metadata($attachment_id, $metadata);

		wp_send_json_success(
			array(
				'id'  => $attachment_id,
				'url' => wp_get_attachment_url($attachment_id),
			)
		);
	}

	public function validate_before_save($settings) {
		foreach ($settings as $key => $setting) {
			$settings[$key] = $this->maybe_convert_to_boolean($setting);
		}

		return $settings;
	}

	public function maybe_convert_to_boolean(&$setting) {
		if (gettype($setting) == 'string' && ($setting === 'true' || $setting === 'false')) {
			$setting = wp_validate_boolean($setting);
		} elseif (gettype($setting) == 'array') {
			foreach ($setting as $key => $_setting) {
				$setting[$key] = $this->maybe_convert_to_boolean($_setting);
			}
		}
		return $setting;
	}

	// TEXT validation
	public function text_validation($text) {
		return sanitize_text_field( wp_unslash( $text ?? '' ) );
	}

	// Build the full CSF media field value from an attachment id.
	public function build_media_value($attachment_id) {
		$attachment_id = absint($attachment_id);
		$full          = wp_get_attachment_image_src($attachment_id, 'full');
		$thumb         = wp_get_attachment_image_src($attachment_id, 'thumbnail');

		return array(
			'id'          => $attachment_id,
			'url'         => $full ? $full[0] : wp_get_attachment_url($attachment_id),
			'width'       => $full ? $full[1] : '',
			'height'      => $full ? $full[2] : '',
			'thumbnail'   => $thumb ? $thumb[0] : '',
			'alt'         => (string) get_post_meta($attachment_id, '_wp_attachment_image_alt', true),
			'title'       => get_the_title($attachment_id),
			'description' => '',
		);
	}

	public function pxlbsadminify_save_wizard_data() {
		check_ajax_referer('pxlbsadminify_sw');

		// Security check - only administrators can save wizard settings
		if (!current_user_can('manage_options')) {
			wp_send_json_error(__('You do not have permission to perform this action.', 'adminify'));
		}

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified above; settings array recursively sanitized via wp_kses_post_deep().
		$settings = empty($_POST['settings']) ? [] : (array) wp_kses_post_deep(wp_unslash($_POST['settings']));

		$validate_settings = $this->validate_before_save($settings);

		$settings = get_option('pxlbsadminify_settings', []);

		// Adminify UI
		if( array_key_exists('admin_ui', $validate_settings) ) {
			$settings['admin_ui']	= !empty($validate_settings['admin_ui']) ? true : false;
		}

		// Admin Bar Logo
		if( array_key_exists('admin_ui_logo_type', $validate_settings) && array_key_exists('admin_ui_light_mode', $validate_settings)) {

			$settings['light_dark_mode']['admin_ui_logo_type'] = $validate_settings['admin_ui_logo_type'];
			if($validate_settings['admin_ui_logo_type'] === 'text_logo') {
				$settings['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo_text'] = $this->text_validation( $validate_settings['admin_ui_light_mode']['admin_ui_light_logo_text'] );
			}
			if($validate_settings['admin_ui_logo_type'] === 'image_logo') {
				$logo_value     = $validate_settings['admin_ui_light_mode']['admin_ui_light_logo'];
				$attachment_id  = isset($logo_value['id']) ? absint($logo_value['id']) : 0;

				if ($attachment_id && wp_attachment_is_image($attachment_id)) {
					// Rebuild the full media value from the attachment so the CSF
					// media field has every key it renders (thumbnail drives the preview).
					$settings['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo'] = $this->build_media_value($attachment_id);
				} else {
					$settings['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo']['url'] = wp_http_validate_url($logo_value['url']);
				}
			}

		}

		// WP Footer Text
		if( array_key_exists('footer_text', $validate_settings) ) {
			$settings['white_label']['wordpress']['footer_text'] = wp_kses_post( $validate_settings['footer_text'] );
		}

		update_option('pxlbsadminify_settings', $settings);

		$is_complete = !empty($_POST['is_complete']) && $_POST['is_complete'] === '1';
		if ($is_complete) {
			update_option('pxlbsadminify_setup_wizard_ran', '1');
		}

		wp_send_json_success(
			[
				'redirect'    => true,
				'is_complete' => $is_complete,
			]
		);
	}

	public function load_scripts() {

		// Register
		// wp_register_script('wp-adminify-vue-vendors', PXLBSADMINIFY_ASSETS . 'admin/js/vendor' . Utils::assets_ext('.js'), [], PXLBSADMINIFY_VER, true);
		wp_register_style('adminify-sw-setup', PXLBSADMINIFY_ASSETS . 'css/setup.css', array(), PXLBSADMINIFY_VER);
		wp_register_script('adminify-sw-setup', PXLBSADMINIFY_ASSETS . 'admin/js/wp-adminify--setup-wizard' . Utils::assets_ext('.js'), ['react', 'jquery'], PXLBSADMINIFY_VER, true);

		// Elementor registers "elementor-ai-media-library" inside the
		// WordPress media iframe with dependencies (elementor-v2-ui,
		// elementor-v2-icons) that are not registered in this admin
		// context. WordPress 6.9.1+ raises a "called incorrectly" notice
		// at registration time when that happens. Pre-register empty stubs
		// for those handles before wp_enqueue_media() so the dependency
		// check passes silently. The wizard does not use Elementor, so we
		// also dequeue Elementor's media-library script after enqueue to
		// avoid loading unrelated assets here.
		if (!wp_script_is('elementor-v2-ui', 'registered')) {
			wp_register_script('elementor-v2-ui', '', [], PXLBSADMINIFY_VER, true);
		}
		if (!wp_script_is('elementor-v2-icons', 'registered')) {
			wp_register_script('elementor-v2-icons', '', [], PXLBSADMINIFY_VER, true);
		}

		// Media uploader
		wp_enqueue_media();

		add_action('admin_print_scripts', function () {
			if (wp_script_is('elementor-ai-media-library', 'enqueued')) {
				wp_dequeue_script('elementor-ai-media-library');
			}
		}, 999);

		// Load
		wp_enqueue_style('adminify-sw-setup');
		// wp_enqueue_script('media-upload');
		wp_enqueue_script('adminify-sw-setup');


		$is_network = is_multisite() && is_network_admin();
		$settings_url = $is_network
			? network_admin_url('admin.php?page=wp-adminify-settings')
			: admin_url('admin.php?page=wp-adminify-settings');
		$dashboard_url = $is_network ? network_admin_url('/') : admin_url('/');

		// Localize Script
		$adminify_data = [
			// 'rest_base'         => $this->get_rest_url(''),
			'ajax_url'         	=> admin_url('admin-ajax.php'),
			'admin_url'        	=> $dashboard_url,
			'settings_url'     	=> $settings_url,
			'rest_url'         	=> esc_url_raw(rest_url('adminify/v1/')),
			'settings' 			=> [
				'admin_ui'            		=> $this->options['admin_ui'],
				'admin_ui_logo_type' 		=> $this->options['light_dark_mode']['admin_ui_logo_type'],
				'admin_ui_light_mode'		=> [
					'admin_ui_light_logo' => [
						'url' => $this->options['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo']['url']
					],
					'admin_ui_light_logo_text' => $this->options['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo_text'] ?? '',
				],
				'footer_text'				=> $this->options['white_label']['wordpress']['footer_text'],
			],
			'images'   			=> PXLBSADMINIFY_ASSETS_IMAGE,
			'wpnonce'  			=> wp_create_nonce('pxlbsadminify_sw'),
			'rest_nonce'    => wp_create_nonce('wp_rest')
		];

		wp_localize_script('adminify-sw-setup', 'PXLBSADMINIFY_SETUP_WIZARD_DATA', $adminify_data);


		// // Dequeue Styles
		// // wp_dequeue_style('install');
		// wp_deregister_style('install');
		// // wp_deregister_style('dashicons');

		// // Dequeue Scripts
		// wp_deregister_script('debug-bar');
		// wp_deregister_script('debug-bar-js');
		// wp_deregister_script('admin-bar');
		// wp_deregister_script('shortcode');

	}

	public function setup_wizard() {
		global $hook_suffix;

		// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
		if (empty($_GET['page']) || 'wp-adminify-setup-wizard' !== sanitize_text_field(wp_unslash($_GET['page']))) {
			return;
		}

		require_once ABSPATH . WPINC . '/media-template.php';
		// add_action( 'admin_footer', 'wp_print_media_templates' );
		// add_action( 'wp_footer', 'wp_print_media_templates' );
		// add_action( 'customize_controls_print_footer_scripts', 'wp_print_media_templates' );

		add_action( 'admin_print_footer_scripts', 'wp_print_media_templates' );

		$this->load_scripts();

		echo '<div id="wp-adminify--setup-wizard" class="wp-adminify-sw-setup-content"></div>';

		// do_action('admin_footer');
		// do_action("admin_print_footer_scripts-{$hook_suffix}");
		do_action('admin_print_footer_scripts');
		do_action("admin_footer-{$hook_suffix}");

		exit;
	}

}

```
