PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.0.5.4
Adminify – White Label, Admin Menu Editor, Login Customizer v4.0.5.4
4.3.2 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 All 165 releases
← All changes | Inc/Admin/AdminSettings.php +30 -204 4.2.64.0.5.4 View file →
@@ -1,17 +1,17 @@
1 1 <?php
2 2
3 -namespace PXLBSAdminify\Inc\Admin;
3 +namespace WPAdminify\Inc\Admin;
4 4
5 -use PXLBSAdminify\Inc\Utils;
6 -use PXLBSAdminify\Inc\Admin\AdminSettingsModel;
7 -use PXLBSAdminify\Inc\Admin\Options\Customize;
8 -use PXLBSAdminify\Inc\Admin\Options\Productivity;
9 -use PXLBSAdminify\Inc\Admin\Options\CustomCSSJS;
10 -use PXLBSAdminify\Inc\Admin\Options\Performance;
11 -use PXLBSAdminify\Inc\Admin\Options\MenuLayout;
12 -use PXLBSAdminify\Inc\Admin\Options\Security;
13 -use PXLBSAdminify\Inc\Admin\Options\White_Label;
5 +use WPAdminify\Inc\Utils;
6 +use WPAdminify\Inc\Admin\AdminSettingsModel;
7 +use WPAdminify\Inc\Admin\Options\Customize;
8 +use WPAdminify\Inc\Admin\Options\Productivity;
9 +use WPAdminify\Inc\Admin\Options\CustomCSSJS;
10 +use WPAdminify\Inc\Admin\Options\Performance;
11 +use WPAdminify\Inc\Admin\Options\MenuLayout;
12 +use WPAdminify\Inc\Admin\Options\Security;
13 +use WPAdminify\Inc\Admin\Options\White_Label;
14 14 if ( !defined( 'ABSPATH' ) ) {
15 15 die;
16 16 }
17 17 // Cannot access directly.
@@ -23,98 +23,15 @@
23 23 public $defaults = [];
24 24
25 25 private $message = [];
26 26
27 - // Snapshot of the settings admin menu taken just before Freemius runs,
28 - // used to restore it afterwards (see pxlbsadminify_capture_settings_menu).
29 - private $captured_menu_item = null;
30 -
31 - private $captured_submenu = null;
32 -
33 - private $captured_page_cb = null;
34 -
35 27 public function __construct() {
36 28 // this should be first so the default values get stored
37 - $this->pxlbsadminify_options();
29 + $this->jltwp_adminify_options();
38 30 parent::__construct( (array) get_option( $this->prefix ) );
39 31 add_action( 'network_admin_menu', [$this, 'network_panel'] );
40 - // Freemius's _prepare_admin_menu (admin_menu @ 999999999, x2 via
41 - // parallel_activation) strips the per-site "wp-adminify-settings" menu on
42 - // multisite (SDK 2.13.1+), so individual site admins hit
43 - // "Cannot load wp-adminify-settings". Snapshot the menu just before Freemius
44 - // runs and restore it just after — this keeps the menu registered at the
45 - // normal priority (so submenu URLs stay correct) yet survives Freemius's
46 - // removal pass.
47 - add_action( 'admin_menu', [$this, 'pxlbsadminify_capture_settings_menu'], 999999998 );
48 - add_action( 'admin_menu', [$this, 'pxlbsadminify_restore_settings_menu'], PHP_INT_MAX );
49 - add_filter(
50 - 'pxlbsadminify_render_field_html',
51 - array($this, 'render_pro_locked_field'),
52 - 10,
53 - 2
54 - );
55 32 }
56 33
57 - /**
58 - * Snapshot the wp-adminify-settings menu, submenu and page callback right
59 - * before Freemius's _prepare_admin_menu (priority 999999999) can remove them.
60 - */
61 - public function pxlbsadminify_capture_settings_menu() {
62 - global $menu, $submenu, $wp_filter;
63 - $slug = 'wp-adminify-settings';
64 - $hook = 'toplevel_page_' . $slug;
65 - if ( !empty( $menu ) ) {
66 - foreach ( $menu as $item ) {
67 - if ( isset( $item[2] ) && $item[2] === $slug ) {
68 - $this->captured_menu_item = $item;
69 - break;
70 - }
71 - }
72 - }
73 - if ( isset( $submenu[$slug] ) ) {
74 - $this->captured_submenu = $submenu[$slug];
75 - }
76 - if ( isset( $wp_filter[$hook] ) ) {
77 - foreach ( $wp_filter[$hook]->callbacks as $callbacks ) {
78 - foreach ( $callbacks as $callback ) {
79 - $this->captured_page_cb = $callback['function'];
80 - break 2;
81 - }
82 - }
83 - }
84 - }
85 -
86 - /**
87 - * Restore anything Freemius removed: the top-level menu entry, its submenus
88 - * and the page render callback. No-op when nothing was removed.
89 - */
90 - public function pxlbsadminify_restore_settings_menu() {
91 - global $menu, $submenu;
92 - $slug = 'wp-adminify-settings';
93 - $hook = 'toplevel_page_' . $slug;
94 - // Re-attach the page render callback so the page is loadable again.
95 - if ( !has_action( $hook ) && $this->captured_page_cb ) {
96 - add_action( $hook, $this->captured_page_cb );
97 - }
98 - // Re-add the top-level menu entry if it was removed.
99 - $has_top = false;
100 - if ( !empty( $menu ) ) {
101 - foreach ( $menu as $item ) {
102 - if ( isset( $item[2] ) && $item[2] === $slug ) {
103 - $has_top = true;
104 - break;
105 - }
106 - }
107 - }
108 - if ( !$has_top && $this->captured_menu_item ) {
109 - $menu[] = $this->captured_menu_item;
110 - }
111 - // Re-add submenus if they were removed (preserves their original URLs).
112 - if ( empty( $submenu[$slug] ) && $this->captured_submenu ) {
113 - $submenu[$slug] = $this->captured_submenu;
114 - }
115 - }
116 -
117 34 public function network_panel() {
118 35 add_menu_page(
119 36 $this->get_plugin_menu_label(),
120 37 $this->get_plugin_menu_label(),
@@ -120,9 +37,9 @@
120 37 $this->get_plugin_menu_label(),
121 38 'manage_options',
122 39 'wp-adminify-settings',
123 40 [$this, 'network_panel_display'],
124 - PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg',
41 + WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg',
125 42 30
126 43 );
127 44 }
128 45
@@ -145,9 +62,8 @@
145 62 return $sites;
146 63 }
147 64
148 65 public function get_sites_option_empty() {
149 - /* translators: 1: option value attribute, 2: option label text */
150 66 return sprintf( __( '<option value="%1$s">%2$s</option>', 'adminify' ), 0, __( 'Select', 'adminify' ) );
151 67 }
152 68
153 69 public function get_sites_option( $sites = [], $add_empty_slot = false ) {
@@ -158,9 +74,8 @@
158 74 if ( $add_empty_slot ) {
159 75 $_sites[] = $this->get_sites_option_empty();
160 76 }
161 77 foreach ( $sites as $site ) {
162 - /* translators: 1: site blog ID used as option value, 2: site name shown as option label */
163 78 $_sites[] = sprintf( __( '<option value="%1$s">%2$s</option>', 'adminify' ), $site->blog_id, $site->name );
164 79 }
165 80 return implode( '', $_sites );
166 81 }
@@ -169,29 +84,29 @@
169 84 if ( empty( $this->message ) ) {
170 85 return;
171 86 }
172 87 $classes = 'adminify-status adminify-status--' . esc_attr( $this->message['type'] );
173 - echo '<div class="' . esc_attr( $classes ) . '"><p>' . wp_kses_post( $this->message['message'] ) . '</p></div>';
88 + echo '<div class="' . esc_attr( $classes ) . '"><p>' . esc_html__( wp_kses_post( $this->message['message'] ), 'adminify' );
174 89 }
175 90
176 91 public function network_panel_display() {
177 92 $multisite_settings = sprintf(
178 93 wp_kses_post( '<div class="%1$s"><h2>%2$s</h2> <a href="%3$s" target="_blank">%4$s</a></div>', 'adminify' ),
179 - Utils::upgrade_pro_notice_class(),
94 + Utils::upgrade_pro_class(),
180 95 esc_html__( 'Network Settings', 'adminify' ),
181 96 esc_url( 'https://wpadminify.com/pricing' ),
182 - Utils::upgrade_pro_notice_class( 'Please Upgrade or Activate License' )
97 + Utils::adminify_upgrade_pro( 'Please Upgrade or Activate License' )
183 98 );
184 99 // Initialize the multisite_settings variable
185 - $multisite_settings = apply_filters( 'pxlbsadminify/admin_settings/network', $multisite_settings );
100 + $multisite_settings = apply_filters( 'adminify/admin_settings/network', $multisite_settings );
186 101 // Apply the filter
187 - echo wp_kses_post( $multisite_settings );
102 + echo $multisite_settings;
188 103 }
189 104
190 105 public function option_modules() {
191 106 $extra_data_merge = [];
192 107 $clonable_data = [
193 - 'pxlbsadminify_settings' => __( 'Adminify Options', 'adminify' ),
108 + '_wpadminify' => __( 'WP Adminify Options', 'adminify' ),
194 109 '_adminify_admin_columns_adminify_admin_page' => __( 'Admin Page Columns Data', 'adminify' ),
195 110 ];
196 111 // Activity Logs Active
197 112 if ( Utils::is_plugin_active( 'adminify-activity-logs/adminify-activity-logs.php' ) ) {
@@ -199,9 +114,9 @@
199 114 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
200 115 }
201 116 // Quick Circle Menu Active
202 117 if ( Utils::is_plugin_active( 'adminify-quick-circle-menu/adminify-quick-circle-menu.php' ) ) {
203 - $extra_data_merge['pxlbsadminify_quick_circle_menu'] = __( 'Quick Circle Menu', 'adminify' );
118 + $extra_data_merge['_wpadminify_quick_circle_menu'] = __( 'Quick Circle Menu', 'adminify' );
204 119 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
205 120 }
206 121 // Google Pagespeed Active
207 122 if ( Utils::is_plugin_active( 'adminify-google-pagespeed/adminify-google-pagespeed.php' ) ) {
@@ -209,19 +124,19 @@
209 124 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
210 125 }
211 126 // Login Customizer Active
212 127 if ( Utils::is_plugin_active( 'loginfy/loginfy.php' ) ) {
213 - $extra_data_merge['pxlbsadminify_login'] = __( 'Loginify Data', 'adminify' );
128 + $extra_data_merge['jltwp_adminify_login'] = __( 'Loginify Data', 'adminify' );
214 129 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
215 130 }
216 131 // Header Footer Scripts Active
217 132 if ( Utils::is_plugin_active( 'adminify-sidebar-generator/adminify-sidebar-generator.php' ) ) {
218 - $extra_data_merge['pxlbsadminify_sidebar_settings'] = __( 'Sidebar Generator', 'adminify' );
133 + $extra_data_merge['_wp_adminify_sidebar_settings'] = __( 'Sidebar Generator', 'adminify' );
219 134 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
220 135 }
221 136 // Sidebar Generator Active
222 137 if ( Utils::is_plugin_active( 'adminify-header-footer-scripts/adminify-header-footer-scripts.php' ) ) {
223 - $extra_data_merge['pxlbsadminify_custom_js_css'] = __( 'Custom JS/CSS', 'adminify' );
138 + $extra_data_merge['_wpadminify_custom_js_css'] = __( 'Custom JS/CSS', 'adminify' );
224 139 $clonable_data = array_merge( $clonable_data, $extra_data_merge );
225 140 }
226 141 // Admin Columns Active
227 142 if ( Utils::is_plugin_active( 'adminify-admin-columns/adminify-admin-columns.php' ) ) {
@@ -235,9 +150,8 @@
235 150 public function get_pagespeed_data( $copy_from ) {
236 151 switch_to_blog( $copy_from );
237 152 global $wpdb;
238 153 $table_name = $wpdb->prefix . 'adminify_page_speed';
239 - // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,PluginCheck.Security.DirectDB.UnescapedDBParameter -- table name derived from a sanitized internal value, no user input; direct query required for reading a custom plugin table; not cached intentionally.
240 154 $histories = $wpdb->get_results( "SELECT * FROM {$table_name}", ARRAY_A );
241 155 restore_current_blog();
242 156 return $histories;
243 157 }
@@ -247,9 +161,8 @@
247 161 global $wpdb;
248 162 $table_name = $wpdb->prefix . 'adminify_page_speed';
249 163 foreach ( $histories as $history ) {
250 164 unset($history['id']);
251 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- direct query required for writing to a custom plugin table; not cached intentionally.
252 165 $wpdb->insert( "{$table_name}", $history, [
253 166 'url' => '%s',
254 167 'score_desktop' => '%d',
255 168 'score_mobile' => '%d',
@@ -290,14 +203,14 @@
290 203 }
291 204
292 205 public static function get_pro_label() {
293 206 $is_pro = "";
294 - $is_pro = esc_html__( 'Adminify', 'adminify' );
207 + $is_pro = WP_ADMINIFY;
295 208 return $is_pro;
296 209 }
297 210
298 211 public function get_plugin_menu_icon() {
299 - $menu_icon = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/menu-icon-light.svg';
212 + $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon-light.svg';
300 213 $saved_data = get_option( $this->prefix );
301 214 if ( isset( $saved_data['white_label']['adminify']['menu_icon'] ) && !empty( $saved_data['white_label']['adminify']['menu_icon']['url'] ) ) {
302 215 $menu_icon = $saved_data['white_label']['adminify']['menu_icon']['url'];
303 216 }
@@ -318,19 +231,19 @@
318 231 $support_url = 'https://wordpress.org/support/plugin/adminify/#new-topic-0';
319 232 return $support_url;
320 233 }
321 234
322 - public function pxlbsadminify_options() {
235 + public function jltwp_adminify_options() {
323 236 if ( !class_exists( 'ADMINIFY' ) ) {
324 237 return;
325 238 }
326 - $submenu_position = apply_filters( 'pxlbsadminify_submenu_position', 30 );
239 + $submenu_position = apply_filters( 'jltwp_adminify_submenu_position', 30 );
327 240 $saved_data = get_option( $this->prefix );
328 241 $global_admin_ui_mode = ( empty( $saved_data['light_dark_mode']['admin_ui_mode'] ) ? 'light' : sanitize_text_field( $saved_data['light_dark_mode']['admin_ui_mode'] ) );
329 242 $admin_ui_mode = ( empty( get_user_meta( get_current_user_id(), 'color_mode', true ) ) ? $global_admin_ui_mode : get_user_meta( get_current_user_id(), 'color_mode', true ) );
330 - $light_logo_image_url = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/logo-text-light.svg';
331 - $dark_logo_image_url = PXLBSADMINIFY_ASSETS_IMAGE . 'logos/logo-text-dark.svg';
332 - $plugin_author_name = PXLBSADMINIFY_AUTHOR;
243 + $light_logo_image_url = WP_ADMINIFY_ASSETS_IMAGE . 'logos/logo-text-light.svg';
244 + $dark_logo_image_url = WP_ADMINIFY_ASSETS_IMAGE . 'logos/logo-text-dark.svg';
245 + $plugin_author_name = WP_ADMINIFY_AUTHOR;
333 246 // WP Adminify Options
334 247 \ADMINIFY::createOptions( $this->prefix, [
335 248 'framework_title' => '<img class="wp-adminify-settings-logo adminify-settings-light-logo" src=' . esc_url( $light_logo_image_url ) . '><img class="wp-adminify-settings-logo adminify-settings-dark-logo" src=' . esc_url( $dark_logo_image_url ) . '>' . ' <small>by ' . esc_html( $plugin_author_name ) . '</small>',
336 249 'framework_class' => '',
@@ -389,9 +302,9 @@
389 302 'title' => __( 'Backup', 'adminify' ),
390 303 'icon' => 'fas fa-database',
391 304 'fields' => [[
392 305 'type' => 'subheading',
393 - 'content' => Utils::help_urls(
306 + 'content' => Utils::adminfiy_help_urls(
394 307 __( 'Backup Config Settings', 'adminify' ),
395 308 'https://wpadminify.com/docs/adminify/export-import/backup',
396 309 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
397 310 'https://www.facebook.com/groups/jeweltheme',
@@ -419,96 +332,9 @@
419 332 }
420 333
421 334 public function get_prefix() {
422 335 return $this->prefix;
423 - }
424 -
425 - /**
426 - * Render-time hook that neutralizes Pro-locked controls in the
427 - * free build. Bypassed when the Pro plugin is active so the Pro
428 - * UI is unchanged.
429 - *
430 - * Two operating modes, both detected from the rendered HTML:
431 - *
432 - * 1. Field-level lock (the field's class array contains
433 - * 'adminify-pro-locked'): strip name="..." from every input/
434 - * select/textarea, add disabled + tabindex="-1", and wrap the
435 - * entire field with a <div class="adminify-pro-locked-wrapper">
436 - * that carries a lock-icon + "Upgrade to Pro" CTA overlay.
437 - *
438 - * 2. Option-level lock (a checkbox/radio option label contains
439 - * <span class="adminify-pro-locked-option">): for every <li>
440 - * that contains the marker span, strip name="..." from the
441 - * enclosed input and add disabled + tabindex="-1". Inline lock
442 - * icon is rendered by CSS off the marker class itself.
443 - *
444 - * @param string $html Rendered field HTML from the framework.
445 - * @param array $field Field config array.
446 - * @return string Possibly transformed HTML.
447 - */
448 - public function render_pro_locked_field( $html, $field ) {
449 - // Pro plugin active: leave HTML untouched.
450 - if ( function_exists( 'jltwp_adminify' ) && jltwp_adminify()->can_use_premium_code__premium_only() ) {
451 - return $html;
452 - }
453 - $field_class = '';
454 - if ( is_array( $field ) && isset( $field['class'] ) ) {
455 - $field_class = (string) $field['class'];
456 - }
457 - // Detect field-level lock from either the new marker class
458 - // (adminify-pro-locked) or the legacy Pro-feature classes that
459 - // pre-date the render-disable hook. Both signal a Pro-only
460 - // field that must not submit a value in the free build.
461 - $has_field_lock = strpos( $field_class, 'adminify-pro-locked' ) !== false || strpos( $field_class, 'adminify-pro-fieldset' ) !== false || strpos( $field_class, 'adminify-pro-feature' ) !== false || strpos( $field_class, 'adminify-pro-notice' ) !== false;
462 - // Per-option lock signal: the helper Utils::upgrade_pro_class()
463 - // emits a <span class="adminify-pro-checkbox"> next to a Pro-only
464 - // checkbox label. Match that span (or the historical
465 - // adminify-pro-locked-option marker) inside <li> blocks.
466 - $has_option_lock = strpos( $html, 'adminify-pro-checkbox' ) !== false || strpos( $html, 'adminify-pro-locked-option' ) !== false;
467 - if ( !$has_field_lock && !$has_option_lock ) {
468 - return $html;
469 - }
470 - if ( $has_field_lock ) {
471 - // Strip name attrs and disable inputs across the whole field.
472 - // The visual treatment is the inline <span class="adminify-pro-badge">Pro</span>
473 - // rendered by the helper — no extra wrapper / overlay.
474 - $html = $this->adminify_strip_inputs( $html );
475 - return $html;
476 - }
477 - // Option-level: only strip inputs inside <li> blocks that
478 - // carry the per-option marker. Match each <li> ... </li>
479 - // non-greedily.
480 - $html = preg_replace_callback( '#<li\\b[^>]*>(.*?)</li>#is', function ( $li_match ) {
481 - $li_inner = $li_match[1];
482 - if ( strpos( $li_inner, 'adminify-pro-checkbox' ) === false && strpos( $li_inner, 'adminify-pro-locked-option' ) === false ) {
483 - return $li_match[0];
484 - }
485 - $open_tag_end = strpos( $li_match[0], '>' );
486 - $open_tag = substr( $li_match[0], 0, $open_tag_end + 1 );
487 - return $open_tag . $this->adminify_strip_inputs( $li_inner ) . '</li>';
488 - }, $html );
489 - return $html;
490 - }
491 -
492 - /**
493 - * Strip name="..." from inputs/selects/textareas in the given
494 - * HTML and add disabled + tabindex="-1" if missing. Pure string
495 - * transform — the framework emits a known shape.
496 - */
497 - private function adminify_strip_inputs( $html ) {
498 - $html = preg_replace( '/\\s+name="[^"]*"/i', '', $html );
499 - $html = preg_replace_callback( '/<(input|select|textarea)\\b([^>]*)>/i', function ( $m ) {
500 - $attrs = $m[2];
501 - if ( strpos( $attrs, 'disabled' ) === false ) {
502 - $attrs .= ' disabled="disabled"';
503 - }
504 - if ( strpos( $attrs, 'tabindex=' ) === false ) {
505 - $attrs .= ' tabindex="-1"';
506 - }
507 - return '<' . $m[1] . $attrs . '>';
508 - }, $html );
509 - return $html;
510 336 }
511 337
512 338 }
513 339
514 340 }