PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.2.7
Adminify – White Label, Admin Menu Editor, Login Customizer v4.2.7
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
adminify / Inc / Classes / Wizard / Adminify_Setup_Wizard.php

Adminify_Setup_Wizard.php in Adminify – White Label, Admin Menu Editor, Login Customizer 4.2.7, at Inc/Classes/Wizard/Adminify_Setup_Wizard.php

256 lines 9.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace PXLBSAdminify\Inc\Classes\Wizard;
4
5 use \PXLBSAdminify\Inc\Admin\AdminSettings;
6 use PXLBSAdminify\Inc\Utils;
7
8 // no direct access allowed
9 if (!defined('ABSPATH')) {
10 exit;
11 }
12
13 class Adminify_Setup_Wizard {
14 public $options;
15
16 public function __construct() {
17
18 if (current_user_can('manage_options') && current_user_can('administrator')) {
19
20 add_action('wp_ajax_pxlbsadminify_save_wizard_data', [$this, 'pxlbsadminify_save_wizard_data']);
21
22 $this->options = (array) AdminSettings::get_instance()->get();
23
24 $this->setup_wizard();
25
26 add_action('wp_ajax_pxlbsadminify_drag_and_drop_image', [$this, 'pxlbsadminify_drag_and_drop_image_callback']);
27
28 }
29
30 }
31
32 // Drag and Drop Image
33 public function pxlbsadminify_drag_and_drop_image_callback() {
34 check_ajax_referer('pxlbsadminify_sw');
35
36 // Security check - only administrators can upload images via wizard
37 if (!current_user_can('manage_options')) {
38 wp_send_json_error(__('You do not have permission to perform this action.', 'adminify'));
39 }
40
41 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified above; settings array recursively sanitized via wp_kses_post_deep().
42 $data_source = empty($_POST['settings']) ? [] : (array) wp_kses_post_deep(wp_unslash($_POST['settings']));
43
44 $base64_image = $data_source['image_data'];
45
46 // Extract the base64 data (remove the data URI scheme)
47 list($type, $data) = explode(';', $base64_image);
48 list(, $data) = explode(',', $data);
49 $decoded_data = base64_decode($data);
50
51 // Define the output file path
52 $upload_dir = wp_upload_dir();
53 $upload_path = $upload_dir['path'] . '/' . $data_source['image_name'];
54
55 // Save the image to the file
56 if (file_put_contents($upload_path, $decoded_data) === false) {
57 wp_send_json_error('Failed to save the image.');
58 }
59
60 // Get the URL of the uploaded image
61 $upload_url = $upload_dir['url'] . '/' . basename($upload_path);
62
63 wp_send_json_success($upload_url);
64
65 wp_die();
66 }
67
68 public function validate_before_save($settings) {
69 foreach ($settings as $key => $setting) {
70 $settings[$key] = $this->maybe_convert_to_boolean($setting);
71 }
72
73 return $settings;
74 }
75
76 public function maybe_convert_to_boolean(&$setting) {
77 if (gettype($setting) == 'string' && ($setting === 'true' || $setting === 'false')) {
78 $setting = wp_validate_boolean($setting);
79 } elseif (gettype($setting) == 'array') {
80 foreach ($setting as $key => $_setting) {
81 $setting[$key] = $this->maybe_convert_to_boolean($_setting);
82 }
83 }
84 return $setting;
85 }
86
87 // TEXT validation
88 public function text_validation($text) {
89 return sanitize_text_field( wp_unslash( $text ?? '' ) );
90 }
91
92 public function pxlbsadminify_save_wizard_data() {
93 check_ajax_referer('pxlbsadminify_sw');
94
95 // Security check - only administrators can save wizard settings
96 if (!current_user_can('manage_options')) {
97 wp_send_json_error(__('You do not have permission to perform this action.', 'adminify'));
98 }
99
100 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- nonce verified above; settings array recursively sanitized via wp_kses_post_deep().
101 $settings = empty($_POST['settings']) ? [] : (array) wp_kses_post_deep(wp_unslash($_POST['settings']));
102
103 $validate_settings = $this->validate_before_save($settings);
104
105 $settings = get_option('pxlbsadminify_settings', []);
106
107 // Adminify UI
108 if( array_key_exists('admin_ui', $validate_settings) ) {
109 $settings['admin_ui'] = !empty($validate_settings['admin_ui']) ? true : false;
110 }
111
112 // Admin Bar Logo
113 if( array_key_exists('admin_ui_logo_type', $validate_settings) && array_key_exists('admin_ui_light_mode', $validate_settings)) {
114
115 $settings['light_dark_mode']['admin_ui_logo_type'] = $validate_settings['admin_ui_logo_type'];
116 if($validate_settings['admin_ui_logo_type'] === 'text_logo') {
117 $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'] );
118 }
119 if($validate_settings['admin_ui_logo_type'] === 'image_logo') {
120 $settings['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo']['url'] = wp_http_validate_url($validate_settings['admin_ui_light_mode']['admin_ui_light_logo']['url']);
121 }
122
123 }
124
125 // WP Footer Text
126 if( array_key_exists('footer_text', $validate_settings) ) {
127 $settings['white_label']['wordpress']['footer_text'] = wp_kses_post( $validate_settings['footer_text'] );
128 }
129
130 update_option('pxlbsadminify_settings', $settings);
131
132 $is_complete = !empty($_POST['is_complete']) && $_POST['is_complete'] === '1';
133 if ($is_complete) {
134 update_option('pxlbsadminify_setup_wizard_ran', '1');
135 }
136
137 wp_send_json_success(
138 [
139 'redirect' => true,
140 'is_complete' => $is_complete,
141 ]
142 );
143 }
144
145 public function load_scripts() {
146
147 // Register
148 // wp_register_script('wp-adminify-vue-vendors', PXLBSADMINIFY_ASSETS . 'admin/js/vendor' . Utils::assets_ext('.js'), [], PXLBSADMINIFY_VER, true);
149 wp_register_style('adminify-sw-setup', PXLBSADMINIFY_ASSETS . 'css/setup.css', array(), PXLBSADMINIFY_VER);
150 wp_register_script('adminify-sw-setup', PXLBSADMINIFY_ASSETS . 'admin/js/wp-adminify--setup-wizard' . Utils::assets_ext('.js'), ['react', 'jquery'], PXLBSADMINIFY_VER, true);
151
152 // Elementor registers "elementor-ai-media-library" inside the
153 // WordPress media iframe with dependencies (elementor-v2-ui,
154 // elementor-v2-icons) that are not registered in this admin
155 // context. WordPress 6.9.1+ raises a "called incorrectly" notice
156 // at registration time when that happens. Pre-register empty stubs
157 // for those handles before wp_enqueue_media() so the dependency
158 // check passes silently. The wizard does not use Elementor, so we
159 // also dequeue Elementor's media-library script after enqueue to
160 // avoid loading unrelated assets here.
161 if (!wp_script_is('elementor-v2-ui', 'registered')) {
162 wp_register_script('elementor-v2-ui', '', [], PXLBSADMINIFY_VER, true);
163 }
164 if (!wp_script_is('elementor-v2-icons', 'registered')) {
165 wp_register_script('elementor-v2-icons', '', [], PXLBSADMINIFY_VER, true);
166 }
167
168 // Media uploader
169 wp_enqueue_media();
170
171 add_action('admin_print_scripts', function () {
172 if (wp_script_is('elementor-ai-media-library', 'enqueued')) {
173 wp_dequeue_script('elementor-ai-media-library');
174 }
175 }, 999);
176
177 // Load
178 wp_enqueue_style('adminify-sw-setup');
179 // wp_enqueue_script('media-upload');
180 wp_enqueue_script('adminify-sw-setup');
181
182
183 $is_network = is_multisite() && is_network_admin();
184 $settings_url = $is_network
185 ? network_admin_url('admin.php?page=wp-adminify-settings')
186 : admin_url('admin.php?page=wp-adminify-settings');
187 $dashboard_url = $is_network ? network_admin_url('/') : admin_url('/');
188
189 // Localize Script
190 $adminify_data = [
191 // 'rest_base' => $this->get_rest_url(''),
192 'ajax_url' => admin_url('admin-ajax.php'),
193 'admin_url' => $dashboard_url,
194 'settings_url' => $settings_url,
195 'rest_url' => esc_url_raw(rest_url('adminify/v1/')),
196 'settings' => [
197 'admin_ui' => $this->options['admin_ui'],
198 'admin_ui_logo_type' => $this->options['light_dark_mode']['admin_ui_logo_type'],
199 'admin_ui_light_mode' => [
200 'admin_ui_light_logo' => [
201 'url' => $this->options['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo']['url']
202 ],
203 'admin_ui_light_logo_text' => $this->options['light_dark_mode']['admin_ui_light_mode']['admin_ui_light_logo_text'] ?? '',
204 ],
205 'footer_text' => $this->options['white_label']['wordpress']['footer_text'],
206 ],
207 'images' => PXLBSADMINIFY_ASSETS_IMAGE,
208 'wpnonce' => wp_create_nonce('pxlbsadminify_sw'),
209 'rest_nonce' => wp_create_nonce('wp_rest')
210 ];
211
212 wp_localize_script('adminify-sw-setup', 'PXLBSADMINIFY_SETUP_WIZARD_DATA', $adminify_data);
213
214
215 // // Dequeue Styles
216 // // wp_dequeue_style('install');
217 // wp_deregister_style('install');
218 // // wp_deregister_style('dashicons');
219
220 // // Dequeue Scripts
221 // wp_deregister_script('debug-bar');
222 // wp_deregister_script('debug-bar-js');
223 // wp_deregister_script('admin-bar');
224 // wp_deregister_script('shortcode');
225
226 }
227
228 public function setup_wizard() {
229 global $hook_suffix;
230
231 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
232 if (empty($_GET['page']) || 'wp-adminify-setup-wizard' !== sanitize_text_field(wp_unslash($_GET['page']))) {
233 return;
234 }
235
236 require_once ABSPATH . WPINC . '/media-template.php';
237 // add_action( 'admin_footer', 'wp_print_media_templates' );
238 // add_action( 'wp_footer', 'wp_print_media_templates' );
239 // add_action( 'customize_controls_print_footer_scripts', 'wp_print_media_templates' );
240
241 add_action( 'admin_print_footer_scripts', 'wp_print_media_templates' );
242
243 $this->load_scripts();
244
245 echo '<div id="wp-adminify--setup-wizard" class="wp-adminify-sw-setup-content"></div>';
246
247 // do_action('admin_footer');
248 // do_action("admin_print_footer_scripts-{$hook_suffix}");
249 do_action('admin_print_footer_scripts');
250 do_action("admin_footer-{$hook_suffix}");
251
252 exit;
253 }
254
255 }
256