PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.2.26
Adminify – White Label, Admin Menu Editor, Login Customizer v4.2.26
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 / Admin / Frames / Admin.php

Admin.php in Adminify – White Label, Admin Menu Editor, Login Customizer 4.2.26, at Inc/Admin/Frames/Admin.php

773 lines 35.4 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\Admin\Frames;
4
5 use PXLBSAdminify\Inc\Utils;
6 use PXLBSAdminify\Inc\Modules\MenuEditor\MenuEditorOptions;
7 use PXLBSAdminify\Inc\Admin\AdminSettings;
8
9 // no direct access allowed
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13 /**
14 * WP Adminify
15 * Admin Class
16 *
17 * @author Jewel Theme <support@jeweltheme.com>
18 */
19
20 if (!class_exists('Admin')) {
21 class Admin
22 {
23
24 public $options;
25 public $menu_settings;
26
27 /**
28 * Constructor for the class.
29 *
30 * Initializes the hooks for the admin class.
31 *
32 * @return void
33 */
34 public function __construct()
35 {
36 $this->options = (array) AdminSettings::get_instance()->get();
37 $this->menu_settings = (new MenuEditorOptions())->get();
38 $this->init_hooks();
39 }
40
41 /**
42 * Initializes the hooks for the admin class.
43 *
44 * This function adds the `load_scripts` method of the current object as a callback
45 * to the `admin_enqueue_scripts` action hook. It also adds the `page_attribute`
46 * method of the current object as a callback to the `language_attributes` filter
47 * hook.
48 *
49 * @return void
50 */
51 private function init_hooks()
52 {
53 if ( wp_doing_ajax() ) return;
54 add_action('admin_init', [$this, 'load_template']);
55 add_action('admin_enqueue_scripts', [$this, 'load_scripts']);
56 add_filter("language_attributes", [$this, "page_attribute"]);
57 add_filter('parent_file', array($this, 'capture_wp_menu'), 999999999);
58
59 add_action('wp_before_admin_bar_render', [$this, 'get_admin_bar_menu_list'], 999999);
60 }
61
62 /**
63 * Enqueue the admin stylesheet and script.
64 *
65 * @return void
66 */
67 public function load_scripts()
68 {
69 wp_enqueue_style('frame-adminify--admin', PXLBSADMINIFY_ASSETS . 'admin/css/admin' . Utils::assets_ext('.css'), [], PXLBSADMINIFY_VER);
70 wp_enqueue_script('frame-adminify--admin', PXLBSADMINIFY_ASSETS . 'admin/js/frame' . Utils::assets_ext('.js'), ['jquery', 'react'], PXLBSADMINIFY_VER, true);
71
72 $localize_array_data = [
73 'ajax_url' => admin_url('admin-ajax.php'),
74 'security_nonce' => wp_create_nonce('pxlbsadminify_frame_nonce')
75 ];
76
77 wp_localize_script( 'frame-adminify--admin', 'PXLBSADMINIFY_FRAME', $localize_array_data );
78 wp_localize_script( 'frame-adminify--admin', 'PXLBSADMINIFY_FRAME_NOT_ALLOWED_URLS', self::get_not_allowed_urls() );
79 }
80
81 public static function get_not_allowed_urls() {
82
83 $not_allowed_urls = [
84 '/wp-admin/customize.php',
85 '/wp-admin/site-editor.php',
86 [
87 'url' => '*',
88 'query_params' => ['fl_builder', 'fl_builder_ui']
89 ],
90 [
91 'url' => '*',
92 'query_params' => ['action' => 'elementor']
93 ],
94 [
95 'url' => '*',
96 'query_params' => ['action' => 'architect'] // Added for thrive page builder
97 ],
98 [
99 'url' => '*',
100 'query_params' => ['bricks' => 'true']
101 ],
102 [
103 'url' => '*',
104 'query_params' => ['ct_builder' => 'true', 'oxygen_iframe!']
105 ],
106 [
107 'url' => '*',
108 'query_params' => ['page' => 'latepoint'] // added for latepoint
109 ],
110 [
111 'url' => '*',
112 'query_params' => ['page' => 'sbi-setup']
113 ],
114 [
115 'url' => '*',
116 'query_params' => ['page' => 'sbtt']
117 ],
118 [
119 'url' => '*',
120 'query_params' => ['page' => 'cff-setup']
121 ],
122 [
123 'url' => '*',
124 'query_params' => ['page' => 'rank-math-registration']
125 ],
126 [
127 'url' => '*',
128 'query_params' => ['page' => 'googlesitekit-splash']
129 ],
130 [
131 'url' => '*',
132 'query_params' => ['page' => 'cff-feed-builder']
133 ],
134 [
135 'url' => '*',
136 'query_params' => ['page' => 'sbi-feed-builder']
137 ],
138 [
139 'url' => '*',
140 'query_params' => ['page' => 'sbr']
141 ],
142 [
143 'url' => '*',
144 'query_params' => ['page' => 'ctf-feed-builder']
145 ],
146 [
147 'url' => '*',
148 'query_params' => ['page' => 'sby-feed-builder']
149 ],
150 [
151 'url' => '*',
152 'query_params' => ['page' => 'suretriggers']
153 ],
154 [
155 'url' => '*',
156 'query_params' => ['tab' => 'plugin-information', 'TB_iframe' => 'true']
157 ],
158 // [
159 // 'url' => '/wp-admin/post-new.php',
160 // 'post_type' => ['post', 'page']
161 // ],
162 // [
163 // 'url' => '/wp-admin/post.php',
164 // 'post_type' => ['post', 'page']
165 // ]
166 ];
167
168 return apply_filters( 'pxlbsadminify_frame_not_allowed_urls', $not_allowed_urls );
169 }
170
171 /**
172 * Adds the 'frame-adminify-app="true"' attribute to the given attribute string.
173 *
174 * @param string $attr The original attribute string.
175 * @return string The modified attribute string.
176 */
177 public function page_attribute($attr)
178 {
179 $attrs = [$attr];
180 $attrs[] = 'frame-adminify-app="true"';
181 return implode(' ', $attrs);
182 }
183
184 /**
185 * Loads the admin template.
186 *
187 * @return void
188 */
189 public function load_template()
190 {
191 // async-upload.php & friends fire admin_init but answer with a raw payload,
192 // so the frame markup would be read as part of the response.
193 if ( ! Utils::is_admin_page_request() ) {
194 return;
195 }
196
197 Utils::load_template('Templates.php');
198 }
199
200 public function capture_wp_menu($parent_file)
201 {
202 global $menu, $submenu;
203
204 $menu_build = pxlbsadminify_build_menu($menu, $submenu, $this->menu_settings);
205
206 $this->enqueue_menu($menu_build);
207
208 return $parent_file;
209 }
210
211 public function enqueue_menu($menu)
212 {
213 $outputter = function () use ($menu) {
214
215 $current_user = wp_get_current_user();
216 $light_dark_mode = $this->options['light_dark_mode'];
217 if( !isset($light_dark_mode['admin_ui_mode']) ) {
218 $default_light_dark_mode = [
219 'admin_ui_mode' => 'light',
220 'admin_ui_logo_type' => 'image_logo',
221 'admin_ui_light_mode' => [
222 'admin_ui_light_logo_text' => 'Adminify',
223 'admin_ui_light_logo_text_typo' => array_fill_keys(
224 ['font-family', 'font-weight', 'font-style', 'font-size', 'letter-spacing', 'color', 'type', 'unit'], ''
225 ) + ['unit' => 'px'],
226 'admin_ui_light_logo' => array_fill_keys(['url', 'id', 'width', 'height', 'thumbnail', 'alt', 'title', 'description'], ''),
227 'light_logo_size' => ['width' => 120, 'height' => 32, 'unit' => 'px'],
228 'mini_admin_ui_light_logo' => array_fill_keys(['url', 'id', 'width', 'height', 'thumbnail', 'alt', 'title', 'description'], ''),
229 ],
230 'admin_ui_dark_mode' => [
231 'admin_ui_dark_logo_text' => 'Adminify',
232 'admin_ui_dark_logo_text_typo' => array_fill_keys(
233 ['font-family', 'font-weight', 'font-style', 'font-size', 'letter-spacing', 'color', 'type', 'unit'], ''
234 ) + ['unit' => 'px'],
235 'admin_ui_dark_logo' => array_fill_keys(['url', 'id', 'width', 'height', 'thumbnail', 'alt', 'title', 'description'], ''),
236 'dark_logo_size' => ['width' => 150, 'height' => 45, 'unit' => 'px'],
237 'mini_admin_ui_dark_logo' => array_fill_keys(['url', 'id', 'width', 'height', 'thumbnail', 'alt', 'title', 'description'], ''),
238 'schedule_dark_mode' => array_fill_keys(['enable_schedule_dark_mode', 'schedule_dark_mode_type', 'schedule_dark_mode_start_time', 'schedule_dark_mode_end_time'], ''),
239 ],
240 ];
241 $light_dark_mode = array_merge($default_light_dark_mode, $light_dark_mode);
242 }else{
243 $light_dark_mode['admin_ui_mode'] = empty(get_user_meta(get_current_user_id(), 'color_mode', true)) ? $light_dark_mode['admin_ui_mode'] : get_user_meta(get_current_user_id(), 'color_mode', true);
244 }
245 $menu_settings = [
246 'menu' => $menu,
247 'admin_bar_dark_light_btn' => $this->options['admin_bar_dark_light_btn'],
248 'light_dark_mode' => $light_dark_mode ,
249 'menu_layout_settings' => $this->options['menu_layout_settings'],
250 'user_info' => [
251 'img' => get_avatar($current_user->user_email, 72, '', ''),
252 'display_name' => esc_html($current_user->display_name),
253 'profile_url' => esc_url(admin_url('profile.php')),
254 'username' => esc_html($current_user->user_login),
255 'email' => wp_kses_post(is_email($current_user->user_email)),
256 ],
257 'image_path' => PXLBSADMINIFY_ASSETS_IMAGE,
258 'is_pro' => (class_exists('\\PXLBSAdminify\\Pro\\Adminify_Pro') && !empty(\PXLBSAdminify\Pro\Adminify_Pro::is_premium())) ? true : false
259 ];
260
261 $data = "var frame_adminify_menu=" . wp_json_encode($menu_settings);
262 wp_print_inline_script_tag($data, ["id" => "frame_adminify_menu"]);
263 };
264
265 add_action("admin_footer", $outputter, 0);
266 add_action("wp_footer", $outputter, 0);
267 }
268
269
270 public function get_admin_bar_menu_list()
271 {
272 global $wp_admin_bar;
273 $admin_bar_data = $this->nodes_to_array($wp_admin_bar->get_nodes());
274 $admin_bar_data_nested = $this->format_to_nested($admin_bar_data);
275
276 $admin_bar_menu_data = [];
277
278 // Admin Bar Exits
279 if ( Utils::is_plugin_active('admin-bar/admin-bar.php') ) {
280 $admin_bar_items = get_option('_jltadminbar_settings');
281
282 // Only build the customized admin bar when settings exist.
283 // Otherwise fall through so the default admin bar data is still
284 // printed and `adminify_admin_bar_data` is always defined.
285 if ( !empty($admin_bar_items) ) {
286
287 $existing_admin_bar = !empty($admin_bar_items['existing_admin_bar']) ? $admin_bar_items['existing_admin_bar'] : '';
288 $saved_admin_bar = !empty($admin_bar_items['saved_admin_bar']) ? $admin_bar_items['saved_admin_bar'] : [];
289
290 $parsed_admin_bar_backend = empty($saved_admin_bar) ? $existing_admin_bar : $this->parse_menu_items($saved_admin_bar, $existing_admin_bar, 'backend');
291 $nested_admin_bar = $this->format_to_nested($parsed_admin_bar_backend);
292 $formated_admin_menu = $this->associative_to_index_array($nested_admin_bar);
293 $remove_admin_menu = [];
294 foreach ($formated_admin_menu as $key => $value) {
295 if($value['id'] === 'wp-logo' || $value['id'] === 'site-name'|| $value['id'] === 'updates'|| $value['id'] === 'menu-toggle'|| $value['id'] === 'comments') {
296 continue;
297 }
298 $remove_admin_menu[$key] = $value;
299 }
300
301 $admin_bar_menu_data = $this->nodes_to_array_for_admin_bar($remove_admin_menu);
302 foreach($admin_bar_menu_data as $key => $value){
303 if( array_key_exists($value['id'],$admin_bar_data_nested)){
304 $value['href'] = $admin_bar_data_nested[$value['id']]['href'];
305 $value = $this->return_original_admin_bar_item_url($value, $admin_bar_data_nested[$value['id']]);
306 }
307 $admin_bar_menu_data[$key] = $value;
308 }
309
310 } // end if ( !empty($admin_bar_items) )
311 }
312
313 unset($admin_bar_data_nested['wp-logo']);
314 unset($admin_bar_data_nested['site-name']);
315 unset($admin_bar_data_nested['updates']);
316 unset($admin_bar_data_nested['menu-toggle']);
317 unset($admin_bar_data_nested['comments']);
318
319 $admin_bar_data_nested = pxlbsadminify_replaceAmpersandInHref($admin_bar_data_nested);
320
321 // WP Adminify Pricing/Upgrade - open in new tab
322 if (isset($admin_bar_data_nested['wp-adminify-settings']['submenu'])) {
323 foreach ($admin_bar_data_nested['wp-adminify-settings']['submenu'] as $key => &$bar_item) {
324 if (isset($bar_item['href']) && strpos($bar_item['href'], 'wp-adminify-settings-pricing') !== false) {
325 $bar_item['href'] = 'https://wpadminify.com/pricing';
326 $bar_item['meta']['target'] = '_blank';
327 break;
328 }
329 }
330 unset($bar_item);
331 }
332
333 $outputter = function () use ($admin_bar_data_nested, $admin_bar_menu_data) {
334 $extra_data = [
335 'data' => !empty($admin_bar_menu_data) ? $admin_bar_menu_data : array_values($admin_bar_data_nested),
336 'logout_url' => wp_logout_url(home_url('/')),
337 // 'site_url' => site_url('/'),
338 'site_url' => home_url(),
339 'admin_url' => admin_url(),
340 'search' => $this->options['admin_bar_search'],
341 'notification' => $this->options['admin_bar_notif'],
342 'light_dark_switcher' => $this->options['admin_bar_dark_light_btn'],
343 ];
344 $data = "var adminify_admin_bar_data=" . wp_json_encode($extra_data);
345 wp_print_inline_script_tag($data, ["id" => "adminify_admin_bar_data"]);
346 };
347
348 add_action("admin_footer", $outputter, 0);
349 add_action("wp_footer", $outputter, 0);
350 return $admin_bar_data;
351 }
352
353 public function return_original_admin_bar_item_url( $value ,$admin_bar_data_nested ){
354 if( array_key_exists('submenu',$value) ){
355 foreach($value['submenu'] as $submenuKey => $submenuItem){
356 $submenuId = $submenuItem['id'] ?? null;
357 if( $submenuId && isset($admin_bar_data_nested['submenu'][$submenuId]) ){
358 $submenuItem = $this->return_original_admin_bar_item_url($submenuItem, $admin_bar_data_nested['submenu'][$submenuId]);
359 $submenuItem['href'] = $admin_bar_data_nested['submenu'][$submenuId]['href'] ?? $submenuItem['href'];
360 }
361 $value['submenu'][$submenuKey] = $submenuItem;
362 }
363 }
364 return $value;
365 }
366
367 public function adminify_adminbar_localize_script(){
368 // get_admin_bar_menu_list() returns an array and prints its script via
369 // wp_print_inline_script_tag() on the footer hook, so call it for that side effect
370 // rather than echoing the return value.
371 $this->get_admin_bar_menu_list();
372 }
373
374 /**
375 * Turn admin bar items object to array
376 *
377 * @param array $nodes The admin bar menu.
378 * @return array Array in expected format.
379 */
380 public function nodes_to_array($nodes)
381 {
382 $admin_bar_array = array();
383 foreach ($nodes as $node_id => $node) {
384 $admin_bar_array[$node_id] = array(
385 'icon' => $this->add_default_icon($node->id),
386 // 'icon_default' => $this->add_default_icon($node->id),
387 'id' => $node->id,
388 // 'id_default' => $node->id,
389 'title' => $node->title,
390 // 'title_default' => $node->title,
391 'parent' => $node->parent,
392 // 'parent_default' => $node->parent,
393 'href' => $node->href,
394 // 'href_default' => $node->href,
395 'group' => $node->group,
396 // 'group_default' => $node->group,
397 'meta' => $node->meta,
398 // 'meta_default' => $node->meta,
399 'submenu' => array(),
400 // 'hidden_for' => '',
401 // 'newly_created' => 0,
402 'menu_level' => 0,
403 'menu_status' => true,
404 );
405 }
406 return $admin_bar_array;
407 }
408
409 /**
410 * Turn admin bar items object to array
411 *
412 * @param array $nodes The admin bar menu.
413 * @return array Array in expected format.
414 */
415 public function nodes_to_array_for_admin_bar($nodes)
416 {
417 $admin_bar_array = [];
418 foreach ($nodes as $node_id => $node) {
419 $admin_bar_array[$node_id] = array(
420 'icon' => !empty($node['icon']) ? $node['icon'] : $node['icon_default'],
421 // 'icon_default' => $this->add_default_icon($node->id),
422 'id' => !empty($node['id']) ? $node['id'] : $node['id_default'],
423 // 'id_default' => $node->id,
424 'title' => !empty($node['title']) ? $node['title'] : $node['title_default'],
425 // 'title_default' => $node->title,
426 'parent' => !empty($node['parent']) ? $node['parent'] : $node['parent_default'],
427 // 'parent_default' => $node->parent,
428 'href' => !empty($node['href']) ? $node['href'] : $node['href_default'],
429 // 'href_default' => $node->href,
430 'group' => !empty($node['group']) ? $node['group'] : $node['group_default'],
431 // 'group_default' => $node->group,
432 'meta' => !empty($node['meta']) ? $node['meta'] : $node['meta_default'],
433 // 'meta_default' => $node->meta,
434 'submenu' => $this->nodes_to_array_for_admin_bar($node['submenu']),
435 // 'hidden_for' => '',
436 // 'newly_created' => 0,
437 'menu_level' => 0,
438 'menu_status' => !empty( $node['menu_status'] ) ? true : false,
439 );
440 }
441
442 return array_values($admin_bar_array);
443 }
444
445 /**
446 * Default Icon
447 */
448 public function add_default_icon($menu_id)
449 {
450 $icon_class = '';
451
452 if ('wp-logo' === $menu_id) {
453 $icon_class = 'dashicons dashicons-wordpress';
454 } else if ('my-sites' === $menu_id) {
455 $icon_class = 'dashicons dashicons-admin-multisite';
456 } else if ('site-name' === $menu_id) {
457 $icon_class = 'dashicons dashicons-admin-home';
458 } else if ('site-name-frontend' === $menu_id) {
459 $icon_class = 'dashicons dashicons-dashboard';
460 } else if ('customize' === $menu_id) {
461 $icon_class = 'dashicons dashicons-admin-customizer';
462 } else if ('updates' === $menu_id) {
463 $icon_class = 'dashicons dashicons-update';
464 } else if ('comments' === $menu_id) {
465 $icon_class = 'dashicons dashicons-admin-comments';
466 } else if ('new-content' === $menu_id) {
467 $icon_class = 'dashicons dashicons-plus';
468 } else if ('edit' === $menu_id) {
469 $icon_class = 'dashicons dashicons-edit';
470 } else if ('site-editor' === $menu_id) {
471 $icon_class = 'dashicons dashicons-admin-appearance';
472 }
473 return $icon_class;
474 }
475
476
477 public function format_to_nested($flat_array)
478 {
479
480 if (isset($flat_array['menu-toggle'])) {
481 unset($flat_array['menu-toggle']);
482 }
483
484 $nested_array = [];
485
486 // Third, get the parent menu items.
487 foreach ($flat_array as $menu_id => $menu) {
488
489 if( !empty($menu['hidden_for']) ) {
490 $disable_for = [];
491
492 foreach($menu['hidden_for'] as $hidden_key => $hidden_user){
493 $disable_for[$hidden_key] = strtolower($hidden_user['value']);
494
495 }
496
497 if (\PXLBSAdminify\Inc\Utils::restrict_for($disable_for)) {
498 unset($flat_array[$menu_id]);
499 continue;
500 }
501 }
502
503 if ( isset($menu['parent']) && $menu['parent'] && !isset($flat_array[$menu['parent']]) ) {
504 unset($flat_array[$menu_id]);
505 continue;
506 }
507
508 if (!isset($menu['parent']) || !$menu['parent'] || !isset($flat_array[$menu['parent']])) {
509 $nested_array[$menu_id] = $menu;
510
511 $additional = array(
512 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '',
513 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '',
514 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '',
515 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '',
516 'submenu' => array(),
517 'menu_level' => 0
518 );
519
520 $nested_array[$menu_id] = array_merge($nested_array[$menu_id], $additional);
521 }
522 }
523
524 // Fourth, remove collected parent array from $flat_array.
525 foreach ($nested_array as $key => $value) {
526 if (isset($flat_array[$key])) {
527 unset($flat_array[$key]);
528 }
529 }
530
531 // Fifth, get the 1st level submenu items.
532 foreach ($flat_array as $menu_id => $menu) {
533 if (isset($nested_array[$menu['parent']])) {
534 $nested_array[$menu['parent']]['submenu'][$menu['id']] = $menu;
535
536 $additional = array(
537 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '',
538 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '',
539 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '',
540 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '',
541 'submenu' => array(),
542 'menu_level' => 1
543 );
544
545 $nested_array[$menu['parent']]['submenu'][$menu['id']] = array_merge(
546 $nested_array[$menu['parent']]['submenu'][$menu['id']],
547 $additional
548 );
549
550 unset($flat_array[$menu_id]);
551 }
552 }
553
554 // Sixth, get the 2nd level submenu items.
555 if (!empty($flat_array)) {
556 // Loop over flat_array.
557 foreach ($flat_array as $menu_id => $menu) {
558 // Loop over nested_array.
559 foreach ($nested_array as $parent_id => $parent_array) {
560 $submenu_lv2_found = false;
561
562 if (!empty($parent_array['submenu'])) {
563 // Loop over parent array's submenu.
564 foreach ($parent_array['submenu'] as $submenu_lv1_id => $submenu_lv1_array) {
565 if ($menu['parent'] === $submenu_lv1_id) {
566 if (!isset($nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'])) {
567 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'] = array();
568 }
569
570 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id] = $menu;
571
572 $additional = array(
573 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '',
574 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '',
575 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '',
576 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '',
577 'submenu' => array(),
578 'menu_level' => 2
579 );
580
581 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id] = array_merge(
582 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$menu_id],
583 $additional
584 );
585
586 unset($flat_array[$menu_id]);
587 $submenu_lv2_found = true;
588 break;
589 }
590 }
591 }
592
593 if ($submenu_lv2_found) {
594 break;
595 }
596 }
597 }
598 }
599
600 // Seventh, get the 3rd level submenu items.
601 if (!empty($flat_array)) {
602 // Loop over flat_array.
603 foreach ($flat_array as $menu_id => $menu) {
604 // Loop over nested_array.
605 foreach ($nested_array as $parent_id => $parent_array) {
606 $submenu_lv3_found = false;
607
608 if (!empty($parent_array['submenu'])) {
609 // Loop over parent array's submenu.
610 foreach ($parent_array['submenu'] as $submenu_lv1_id => $submenu_lv1_array) {
611 if (!empty($submenu_lv1_array['submenu'])) {
612 // Loop over submenu level 1's submenu.
613 foreach ($submenu_lv1_array['submenu'] as $submenu_lv2_id => $submenu_lv2_array) {
614 if ($menu['parent'] === $submenu_lv2_id) {
615 if (!isset($nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'])) {
616 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'] = array();
617 }
618
619 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id] = $menu;
620
621 $additional = array(
622 'title_encoded' => isset($menu['title']) ? htmlentities2($menu['title']) : '',
623 'title_clean' => isset($menu['title']) ? wp_strip_all_tags($menu['title']) : '',
624 'title_encoded_default' => isset($menu['title_default']) ? htmlentities2($menu['title_default']) : '',
625 'title_clean_default' => isset($menu['title_default']) ? wp_strip_all_tags($menu['title_default']) : '',
626 'submenu' => array(),
627 'menu_level' => 3
628 );
629
630 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id] = array_merge(
631 $nested_array[$parent_id]['submenu'][$submenu_lv1_id]['submenu'][$submenu_lv2_id]['submenu'][$menu_id],
632 $additional
633 );
634
635 unset($flat_array[$menu_id]);
636 $submenu_lv3_found = true;
637 break;
638 }
639 }
640 }
641
642 if ($submenu_lv3_found) {
643 break;
644 }
645 }
646 }
647
648 if ($submenu_lv3_found) {
649 break;
650 }
651 }
652 }
653 }
654 return $nested_array;
655 }
656
657
658
659 public function is_network_active()
660 {
661 if (!function_exists('is_plugin_active_for_network') || !function_exists('is_plugin_active')) {
662 require_once ABSPATH . '/wp-admin/includes/plugin.php';
663 }
664
665 return (is_plugin_active_for_network('adminify/adminify.php') ? true : false);
666 }
667
668 public function parse_menu_items($args, $default, $request_from = 'backend')
669 {
670 // $instance = new self();
671 $parsed_array = [];
672 // $ms_helper = new Multisite_Helper();
673 $mulsite_site = $this->is_network_active();
674
675 // parse menu
676 if (true) {
677 if ($request_from == 'backend') {
678 $new_array = [];
679 foreach ($default as $key => $menu) {
680 if (array_search($key, array_keys($args)) && $key == $args[$key]['id']) {
681 // $new_array[$key] = $args[$key];
682 } else {
683 if (($mulsite_site) && ($key == 'my-sites')) {
684 $new_array[$key] = $args[$key];
685 unset($args[$key]);
686 } else {
687 $new_array[$key] = $menu;
688 }
689 }
690 }
691
692 $new_args = [];
693 foreach ($args as $key => $menu) {
694 if (str_contains($key, 'custom-menu-')) {
695 $new_args[$key] = $menu;
696 }
697 if (!array_key_exists($key, $default)) {
698 continue;
699 }
700 $new_args[$key] = $args[$key];
701 }
702
703 $pos = array_search('comments', array_keys($new_array), true);
704 // $pos += 1;
705
706 unset($new_array['top-secondary']);
707
708 // $new_array = array_slice($new_array, 0, $pos, true) + $new_args + array_slice($new_array, $pos, count($new_array) - 1, true);
709 $new_array = $new_args + array_slice($new_array, $pos, count($new_array), true);
710
711 return $new_array;
712 }
713 }
714 }
715
716 public static function associative_to_index_array($asoc_array)
717 {
718
719 $new_array = [];
720 $i = 0;
721
722 foreach ($asoc_array as $key => $value) {
723 if (isset($value['submenu']) && count($value['submenu']) > 0) {
724 $j = 0;
725 $sub_1 = [];
726 foreach ($value['submenu'] as $key1 => $value1) {
727
728 if (isset($value1['submenu']) && count($value1['submenu']) > 0) {
729 $k = 0;
730 $sub_2 = [];
731 foreach ($value1['submenu'] as $key2 => $value2) {
732 if (isset($value2['submenu']) && count($value2['submenu']) > 0) {
733 $l = 0;
734 $sub_3 = [];
735 foreach ($value2['submenu'] as $key => $value3) {
736 if (isset($value3['submenu']) && count($value3['submenu']) > 0) {
737 $sub_3[$l] = $value3;
738 $sub_3[$l]['submenu'] = array_values($value3['submenu']);
739 } else {
740 $sub_3[$l] = $value3;
741 }
742 $l++;
743 }
744 $sub_2[$k] = $value2;
745 $sub_2[$k]['submenu'] = $sub_3;
746 } else {
747 $sub_2[$k] = $value2;
748 }
749 $k++;
750 }
751
752 $sub_1[$j] = $value1;
753 $sub_1[$j]['submenu'] = $sub_2;
754 } else {
755 $sub_1[$j] = $value1;
756 }
757 // $new_array[$i]['submenu'][$j] = $value1;
758 $j++;
759 }
760 $new_array[$i] = $value;
761 $new_array[$i]['submenu'] = $sub_1;
762 } else {
763 $new_array[$i] = $value;
764 }
765 $i++;
766 }
767 return $new_array;
768 }
769
770
771 }
772 }
773