PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.1.3
Adminify – White Label, Admin Menu Editor, Login Customizer v4.1.3
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
← All changes | Inc/utils.php +113 -338 4.2.254.1.3 View file →
@@ -1,8 +1,10 @@
1 1 <?php
2 2
3 -namespace PXLBSAdminify\Inc;
3 +namespace WPAdminify\Inc;
4 4
5 +use ReturnTypeWillChange;
6 +use WPAdminify\Inc\Classes\Helper;
5 7 // no direct access allowed
6 8 if (!defined('ABSPATH')) {
7 9 exit;
8 10 }
@@ -53,15 +55,10 @@
53 55 if (empty($disabled_for)) {
54 56 return false;
55 57 }
56 58
57 - // wp_get_current_user() lives in wp-includes/pluggable.php and is
58 - // always available in normal plugin execution. If it is somehow
59 - // unavailable (e.g. very early bootstrap), bail out instead of
60 - // manually loading core files, which is disallowed by the
61 - // WordPress.org plugin guidelines.
62 59 if (!function_exists('wp_get_current_user')) {
63 - return false;
60 + include ABSPATH . 'wp-includes/pluggable.php';
64 61 }
65 62
66 63 $restrict_for = array();
67 64
@@ -160,12 +157,10 @@
160 157 if (!is_array($disabled_for)) {
161 158 return false;
162 159 }
163 160
164 - // wp_get_current_user() is provided by wp-includes/pluggable.php and
165 - // is loaded by core early in normal plugin execution. Manually
166 - // loading core files is disallowed by the plugin guidelines, so we
167 - // simply bail out if it is unavailable for any reason.
161 + require_once ABSPATH . '/wp-includes/pluggable.php';
162 +
168 163 if (!function_exists('wp_get_current_user')) {
169 164 return false;
170 165 }
171 166
@@ -227,9 +222,9 @@
227 222 }
228 223
229 224
230 225 // verfiy current page id
231 - public static function currentpage_id($id)
226 + public static function jltwp_adminify_currentpage_id($id)
232 227 {
233 228 if (!function_exists('get_current_screen')) {
234 229 return true;
235 230 }
@@ -246,14 +241,14 @@
246 241 * @return void
247 242 */
248 243 public static function admin_page_title($title = '')
249 244 {
250 - $title = isset($title) && !empty($title) ? $title : PXLBSADMINIFY;
245 + $title = isset($title) && !empty($title) ? $title : WP_ADMINIFY;
251 246 echo esc_html($title);
252 247
253 248 if (is_multisite()) {
254 249 $text = ' | ' . esc_html__('Current Blog ID', 'adminify') . ': ' . get_current_blog_id(); ?>
255 - <?php echo self::kses_custom(self::admin_page_subtitle($text)); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- kses_custom() is a wp_kses() wrapper; output already escaped. ?>
250 + <?php echo self::wp_kses_custom(self::admin_page_subtitle($text)); ?>
256 251 <?php } ?>
257 252 <?php
258 253 }
259 254
@@ -280,9 +275,9 @@
280 275 $class = str_replace([' ', ',', '.', '"', "'", '/', '\\', '+', '=', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!', '~', '`', '<', '>', '?', '[', ']', '{', '}', '|', ':'], '', $name);
281 276 return $class;
282 277 }
283 278
284 - public static function class_cleanup($string)
279 + public static function jltwp_adminify_class_cleanup($string)
285 280 {
286 281 // Lower case everything
287 282 $string = strtolower($string);
288 283 // Make alphanumeric (removes all other characters)
@@ -356,11 +351,9 @@
356 351 * @return boolean
357 352 */
358 353 public static function is_plugin_active( $plugin_path )
359 354 {
360 - if (!function_exists('is_plugin_active')) {
361 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
362 - }
355 + include_once ABSPATH . 'wp-admin/includes/plugin.php';
363 356 return is_plugin_active( $plugin_path );
364 357 }
365 358
366 359 /**
@@ -400,9 +393,9 @@
400 393 $installed_plugins = get_plugins();
401 394 return isset($installed_plugins[$plugin_file]);
402 395 }
403 396
404 - public static function notification_bar()
397 + public static function jltwp_adminify_notification_bar()
405 398 {
406 399 $plugin_slug = 'adminify-notification-bar';
407 400 $plugin_file = 'adminify-notification-bar/adminify-notification-bar.php';
408 401 $addons_page_url = network_admin_url('admin.php?page=wp-adminify-settings-addons');
@@ -447,9 +440,9 @@
447 440
448 441 public static function get_user_preference($key)
449 442 {
450 443 $userid = get_current_user_id();
451 - $current = get_user_meta($userid, 'pxlbsadminify_preferences', true);
444 + $current = get_user_meta($userid, '_wpadminify_preferences', true);
452 445 $value = false;
453 446
454 447 if (is_array($current)) {
455 448 if (isset($current[$key])) {
@@ -472,13 +465,13 @@
472 465 foreach ($values as $index => $in) {
473 466 if (is_array($in)) {
474 467 $values[$index] = self::clean_ajax_input($in);
475 468 } else {
476 - $values[$index] = wp_strip_all_tags($in);
469 + $values[$index] = strip_tags($in);
477 470 }
478 471 }
479 472 } else {
480 - $values = wp_strip_all_tags($values);
473 + $values = strip_tags($values);
481 474 }
482 475
483 476 return $values;
484 477 }
@@ -494,9 +487,9 @@
494 487 {
495 488 $returndata = [];
496 489 $returndata['error'] = true;
497 490 $returndata['error_message'] = $message;
498 - return wp_json_encode($returndata);
491 + return json_encode($returndata);
499 492 }
500 493
501 494 /**
502 495 * Get All Updates
@@ -551,11 +544,11 @@
551 544
552 545 /**
553 546 * Upgrade Pro Icon
554 547 *
555 - * @return string
548 + * @return void
556 549 */
557 - public static function upgrade_pro_icon()
550 + public static function jltwp_adminify_upgrade_pro_icon()
558 551 {
559 552 return '<svg class="adminify-pro-notice-icon is-pulled-left mr-2" width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
560 553 <path fill-rule="evenodd" clip-rule="evenodd" d="M21.8233 0.18318C21.8541 0.215042 21.8753 0.255055 21.8843 0.298527C22.5767 3.32046 20.085 9.8239 16.4731 13.4209C15.8343 14.064 15.1407 14.6502 14.4002 15.1727C14.4955 16.2787 14.411 17.3846 13.9985 18.3318C12.8302 21.0043 9.75855 21.7824 8.44197 21.9937C8.36979 22.0059 8.29577 22.0012 8.22571 21.9799C8.15566 21.9587 8.09147 21.9215 8.03819 21.8713C7.9849 21.821 7.94397 21.7591 7.9186 21.6904C7.89323 21.6217 7.88411 21.548 7.89196 21.4751L8.36241 17.189C8.04096 17.1858 7.71987 17.1663 7.40039 17.1305C7.17735 17.1087 6.96893 17.0096 6.81109 16.8503L5.15076 15.1924C4.99146 15.0346 4.89242 14.8259 4.87084 14.6026C4.83497 14.281 4.81547 13.9578 4.8124 13.6343L0.524795 14.1076C0.451994 14.1156 0.378341 14.1065 0.309629 14.0811C0.240917 14.0558 0.17902 14.0148 0.128806 13.9615C0.0785915 13.9081 0.0414297 13.8438 0.0202432 13.7736C-0.000943262 13.7035 -0.0055768 13.6293 0.00670721 13.5571C0.223273 12.2368 1.00065 9.16771 3.67065 7.99148C4.61695 7.57859 5.72728 7.4965 6.83761 7.59481C7.35968 6.85546 7.94513 6.16306 8.58733 5.52547C12.1879 1.92304 18.8337 -0.585245 21.7099 0.118627C21.7531 0.128924 21.7924 0.151317 21.8233 0.18318ZM12.224 7.92186C12.3151 8.37957 12.5397 8.79996 12.8695 9.12986C13.0882 9.34908 13.348 9.52298 13.6339 9.64164C13.9198 9.7603 14.2263 9.82137 14.5358 9.82137C14.8453 9.82137 15.1517 9.7603 15.4377 9.64164C15.7236 9.52298 15.9833 9.34908 16.202 9.12986C16.5318 8.79996 16.7565 8.37957 16.8475 7.92186C16.9386 7.46415 16.892 6.98968 16.7137 6.55848C16.5353 6.12727 16.2332 5.7587 15.8455 5.49939C15.4578 5.24007 15.002 5.10166 14.5358 5.10166C14.0695 5.10166 13.6137 5.24007 13.226 5.49939C12.8384 5.7587 12.5362 6.12727 12.3579 6.55848C12.1795 6.98968 12.1329 7.46415 12.224 7.92186ZM5.47798 18.5161C5.99754 18.4262 6.4292 18.321 6.69831 18.0511C6.83974 17.9032 7.0897 18.0256 7.07153 18.2311C6.99299 18.8853 6.69667 19.4941 6.23032 19.9593C5.07579 21.1158 0.785726 21.225 0.785726 21.225C0.785726 21.225 0.894746 16.9334 2.04927 15.7768C2.51439 15.3115 3.12167 15.0153 3.77443 14.9353C3.81912 14.9292 3.86459 14.9374 3.90439 14.9586C3.94419 14.9799 3.97629 15.0131 3.99613 15.0537C4.01597 15.0942 4.02255 15.14 4.01493 15.1845C4.00731 15.229 3.98588 15.2699 3.95368 15.3015C3.80635 15.449 3.56965 16.0767 3.48961 16.5245C3.27991 17.7056 4.31069 18.7152 5.47798 18.5161Z" fill="#000"/>
561 554 </svg>';
@@ -562,29 +555,29 @@
562 555 }
563 556
564 557
565 558 // Upgrade to Pro Notice
566 - public static function upgrade_pro_img_notice( $image ){
559 + public static function adminify_upgrade_pro_img_notice( $image ){
567 560 return '<div class="adminify-pro-notice"><img src="' . esc_url_raw($image ) . '" /></div>';
568 561 }
569 562
570 563 // Upgrade to Pro Notice Class
571 - public static function upgrade_pro_notice_class($notice = '')
564 + public static function upgrade_pro_class($classname = '')
572 565 {
573 - if(empty($notice)){
566 + if(empty($classname)){
574 567 // return ' adminify-depend-visible adminify-depend-on adminify-pro-notice ';
575 568 return ' adminify-pro-feature adminify-pro-notice';
576 569 } else {
577 - echo esc_attr($notice);
570 + echo esc_attr($classname);
578 571 }
579 572 }
580 573
581 574 // Upgrade to Pro Notice
582 - public static function upgrade_pro_notice($custom_message = '', $style='')
575 + public static function adminify_upgrade_pro($custom_message = '', $style='')
583 576 {
584 577
585 578 if (empty($custom_message)) {
586 - $pro_content = '<strong>' . __('(Upgrade to Pro)', 'adminify') . '</strong>';
579 + $pro_content = sprintf(__('<strong>(Upgrade to Pro)</strong>', 'adminify'));
587 580 } else {
588 581 $pro_content = $custom_message;
589 582 }
590 583
@@ -592,13 +585,13 @@
592 585 return '<strong style="font-size:16px;">' . $pro_content . '</strong>';
593 586 }
594 587
595 588 $upgrade_notice_msg = sprintf(
596 - '<div class="adminify-pro-notice adminify-missing-addons"> %1$s %2$s </div>',
597 - self::upgrade_pro_icon(),
598 - self::kses_custom($pro_content)
589 + __('<div class="adminify-pro-notice adminify-missing-addons"> %1$s %2$s </div>', 'adminify'),
590 + self::jltwp_adminify_upgrade_pro_icon(),
591 + self::wp_kses_custom($pro_content)
599 592 );
600 - return self::kses_custom($upgrade_notice_msg);
593 + return self::wp_kses_custom($upgrade_notice_msg);
601 594 }
602 595
603 596
604 597
@@ -641,22 +634,21 @@
641 634 </svg>';
642 635 }
643 636
644 637 /* White Label Upgrade Pro */
645 - public static function white_label_upgrade()
638 + public static function jltwp_adminify_white_label_upgrade()
646 639 {
647 640 ?>
648 641 <div class="wp-adminify-white-label-notice-content">
649 642 <div class="wp-adminify-white-label-notice-logo">
650 - <img src="<?php echo esc_url(PXLBSADMINIFY_ASSETS_IMAGE) . 'logos/logo-text-light.svg'; ?>" alt="<?php echo esc_attr(PXLBSADMINIFY); ?>">
643 + <img src="<?php echo esc_url(WP_ADMINIFY_ASSETS_IMAGE) . 'logos/logo-text-light.svg'; ?>" alt="<?php echo esc_attr(WP_ADMINIFY); ?>">
651 644 </div>
652 645 <h2>
653 - <?php echo wp_kses_post( sprintf(__('Upgrade <span>Pro</span> for White Labeling', 'adminify')) ); ?>
646 + <?php echo sprintf(__('Upgrade <span>Pro</span> for White Labeling', 'adminify')); ?>
654 647 </h2>
655 648 <p>
656 649 <?php
657 - /* translators: %s: Plugin name */
658 - echo wp_kses_post( sprintf(__('<strong>%1$s</strong> can be completely re-branded with your own brand Logo, Name and Author Details. Your clients will never know what tools you are using to build their website and will think that this is your own tool set. White-labeling works as long as your license is active. ', 'adminify'), esc_html(PXLBSADMINIFY)) );
650 + echo sprintf(__('<strong>%1$s</strong> can be completely re-branded with your own brand Logo, Name and Author Details. Your clients will never know what tools you are using to build their website and will think that this is your own tool set. White-labeling works as long as your license is active. ', 'adminify'), esc_html(WP_ADMINIFY));
659 651 ?>
660 652 <br>
661 653 <em><?php esc_html_e('Note: Agency or Higher Plans Only', 'adminify'); ?></em>
662 654 </p>
@@ -670,9 +662,9 @@
670 662
671 663 public static function get_widget_template_options()
672 664 {
673 665 $type = 'widget';
674 - $page_templates = self::get_page_templates($type);
666 + $page_templates = self::jltwp_adminify_get_page_templates($type);
675 667
676 668 $options[-1] = __('Select', 'adminify');
677 669
678 670 if (count($page_templates)) {
@@ -688,9 +680,9 @@
688 680
689 681 public static function get_section_template_options()
690 682 {
691 683 $type = 'section';
692 - $page_templates = self::get_page_templates($type);
684 + $page_templates = self::jltwp_adminify_get_page_templates($type);
693 685
694 686 $options[-1] = __('Select', 'adminify');
695 687
696 688 if (count($page_templates)) {
@@ -706,9 +698,9 @@
706 698
707 699 public static function get_page_template_options()
708 700 {
709 701 $type = 'page';
710 - $page_templates = self::get_page_templates($type);
702 + $page_templates = self::jltwp_adminify_get_page_templates($type);
711 703
712 704 $options[-1] = __('Select', 'adminify');
713 705
714 706 if (count($page_templates)) {
@@ -721,22 +713,14 @@
721 713
722 714 return $options;
723 715 }
724 716
725 - /**
726 - * Common preset CSS variables (padding / sizing / typography
727 - * defaults) shared by every theme preset and by the Pro
728 - * custom-color preset path. Extracted so the Pro filter
729 - * (Pro/Classes/OutputCSS_Body_Pro::build_custom_color_preset())
730 - * can reuse the same defaults instead of re-declaring them.
731 - *
732 - * @return array<string,string>
733 - */
734 - public static function get_common_preset_vars()
717 + public static function get_theme_presets($theme = null)
735 718 {
736 - return [
719 +
720 + $common_var = [
737 721 '--adminify-menu-vertical-padding' => '10px',
738 - '--adminify-menu-horizontal-padding' => '8px',
722 + '--adminify-menu-horizontal-padding' => '8px',
739 723 '--adminify-menu-wrapper-padding-top' => '16px',
740 724 '--adminify-menu-wrapper-padding-right' => '8px',
741 725 '--adminify-menu-wrapper-padding-bottom' => '16px',
742 726 '--adminify-menu-wrapper-padding-left' => '8px',
@@ -744,20 +728,17 @@
744 728 '--adminify-submenu-wrapper-padding-top' => '8px',
745 729 '--adminify-submenu-wrapper-padding-right' => '0px',
746 730 '--adminify-submenu-wrapper-padding-bottom' => '8px',
747 731 '--adminify-submenu-wrapper-padding-left' => '28px',
748 - '--adminify-menu-font-size' => '13px',
749 - '--adminify-menu-line-height' => '20px',
750 - '--adminify-menu-letter-spacing' => '',
751 - '--adminify-menu-width' => '260px',
732 + // '--adminify-menu-text-align' => 'left',
733 + // '--adminify-menu-text-transform' => '',
734 + // '--adminify-menu-text-decoration' => 'none',
735 + '--adminify-menu-font-size' => '13px',
736 + '--adminify-menu-line-height' => '20px',
737 + '--adminify-menu-letter-spacing' => '',
738 + '--adminify-menu-width' => '260px'
752 739 ];
753 - }
754 740
755 - public static function get_theme_presets($theme = null)
756 - {
757 -
758 - $common_var = self::get_common_preset_vars();
759 -
760 741 $presets = [
761 742
762 743 // Base/ Default Preset
763 744 'preset1' => [
@@ -803,9 +784,9 @@
803 784 '--adminify-notif-color' => '#ffffff',
804 785 ],
805 786 ];
806 787
807 - $pro_presets = apply_filters('pxlbsadminify_settings/color_presets', $common_var);
788 + $pro_presets = apply_filters('adminify_settings/color_presets', $common_var);
808 789
809 790 if( !empty(array_key_exists('preset3', $pro_presets)) ) {
810 791 $presets = array_merge($presets, $pro_presets);
811 792 }
@@ -824,14 +805,13 @@
824 805 if (array_key_exists($theme, $presets)) {
825 806 return $presets[$theme];
826 807 }
827 808
828 - // specific preset not found (Pro-only/custom theme saved while Pro add-on inactive).
829 - // Fall back to base preset so core CSS vars (--adminify-menu-width) always emit.
830 - return isset($presets['preset1']) ? $presets['preset1'] : $common_var;
809 + // specific preset not found
810 + return [];
831 811 }
832 812
833 - public static function get_page_templates($type = '')
813 + public static function jltwp_adminify_get_page_templates($type = '')
834 814 {
835 815 $args = [
836 816 'post_type' => 'elementor_library',
837 817 'posts_per_page' => -1,
@@ -837,9 +817,9 @@
837 817 'posts_per_page' => -1,
838 818 ];
839 819
840 820 if ($type) {
841 - $args['tax_query'] = [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query -- intentional taxonomy filter on an admin-side query.
821 + $args['tax_query'] = [
842 822 [
843 823 'taxonomy' => 'elementor_library_type',
844 824 'field' => 'slug',
845 825 'terms' => $type,
@@ -866,112 +846,70 @@
866 846 }
867 847 return '.min' . $ext;
868 848 }
869 849
870 - public static function kses_atts_map(array $attrs)
850 + public static function wp_kses_atts_map(array $attrs)
871 851 {
872 852 return array_fill_keys(array_values($attrs), true);
873 853 }
874 854
875 - /**
876 - * Whether the site is served over HTTPS well enough to run the Adminify UI.
877 - *
878 - * Mirrors the exact condition that gates the dashboard frame in
879 - * Inc/Admin/Admin.php ( is_ssl() + an https:// site URL ), so the AJAX
880 - * gate behaviour stays consistent with where the UI actually loads.
881 - *
882 - * @return array{ready:bool,message:string}
883 - */
884 - public static function adminify_ui_https_status()
855 + public static function wp_kses_custom($content)
885 856 {
886 - $is_ssl = is_ssl();
887 - $site_https = ( 0 === stripos( (string) site_url(), 'https://' ) );
888 -
889 - if ( $is_ssl && $site_https ) {
890 - return [
891 - 'ready' => true,
892 - 'message' => '',
893 - ];
894 - }
895 -
896 - if ( ! $site_https ) {
897 - $message = esc_html__( 'Site URL is not HTTPS. Switch to HTTPS first.', 'adminify' );
898 - } else {
899 - $message = esc_html__( 'Open the dashboard over HTTPS first.', 'adminify' );
900 - }
901 -
902 - return [
903 - 'ready' => false,
904 - 'message' => $message,
905 - ];
906 - }
907 -
908 - public static function kses_allowed_html()
909 - {
910 857 /**
911 - * 'post' returns the tags allowed in post content (a, p, strong, em, etc.),
912 - * which we then extend with the custom tags below (svg, form fields, style).
913 - * https://developer.wordpress.org/reference/functions/wp_kses_allowed_html/
914 - */
915 - $allowed_tags = wp_kses_allowed_html('post');
858 + * the context can be different
859 + * The context for which to retrieve tags. Allowed values are 'post', 'strip', 'data', 'entities', or the name of a field filter such as 'pre_user_description', or an array of allowed HTML elements and attributes.
860 + * the post means here it will return all the tags that are allowed in post such as a, p, strong, em etc
861 + */
862 + $allowed_tags = wp_kses_allowed_html('post'); // Details : https://developer.wordpress.org/reference/functions/wp_kses_allowed_html/
916 863 if( !is_array($allowed_tags) ) $allowed_tags = [];
917 864
918 865 $custom_tags = [
919 - 'select' => self::kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'multiple', 'required', 'size']),
920 - 'input' => self::kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'required', 'size', 'type', 'checked', 'readonly', 'placeholder', 'value', 'maxlength', 'min', 'max', 'multiple', 'pattern', 'step', 'autocomplete']),
921 - 'textarea' => self::kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'required', 'rows', 'cols', 'wrap', 'maxlength']),
922 - 'option' => self::kses_atts_map(['class', 'id', 'label', 'disabled', 'label', 'selected', 'value']),
923 - 'optgroup' => self::kses_atts_map(['disabled', 'label', 'class', 'id']),
924 - 'form' => self::kses_atts_map(['class', 'id', 'data', 'style', 'width', 'height', 'accept-charset', 'action', 'autocomplete', 'enctype', 'method', 'name', 'novalidate', 'rel', 'target']),
925 - 'svg' => self::kses_atts_map(['class', 'xmlns', 'viewbox', 'width', 'height', 'fill', 'stroke', 'aria-hidden', 'aria-labelledby', 'role']),
926 - 'rect' => self::kses_atts_map(['rx', 'width', 'height', 'fill']),
927 - 'path' => self::kses_atts_map(['d', 'fill', 'fill-rule', 'clip-rule', 'stroke', 'stroke-width', 'stroke-linecap', 'stroke-linejoin']),
928 - 'g' => self::kses_atts_map(['fill']),
929 - 'defs' => self::kses_atts_map(['fill']),
930 - 'linearGradient' => self::kses_atts_map(['id', 'x1', 'x2', 'y1', 'y2', 'gradientUnits']),
931 - 'stop' => self::kses_atts_map(['stop-color', 'offset', 'stop-opacity']),
932 - 'style' => self::kses_atts_map(['type']),
933 - 'div' => self::kses_atts_map(['class', 'id', 'style']),
934 - 'ul' => self::kses_atts_map(['class', 'id', 'style']),
935 - 'li' => self::kses_atts_map(['class', 'id', 'style']),
936 - 'label' => self::kses_atts_map(['class', 'for']),
937 - 'span' => self::kses_atts_map(['class', 'id', 'style']),
938 - 'h1' => self::kses_atts_map(['class', 'id', 'style']),
939 - 'h2' => self::kses_atts_map(['class', 'id', 'style']),
940 - 'h3' => self::kses_atts_map(['class', 'id', 'style']),
941 - 'h4' => self::kses_atts_map(['class', 'id', 'style']),
942 - 'h5' => self::kses_atts_map(['class', 'id', 'style']),
943 - 'h6' => self::kses_atts_map(['class', 'id', 'style']),
944 - 'a' => self::kses_atts_map(['class', 'href', 'target', 'rel']),
945 - 'p' => self::kses_atts_map(['class', 'id', 'style', 'data']),
946 - 'table' => self::kses_atts_map(['class', 'id', 'style']),
947 - 'thead' => self::kses_atts_map(['class', 'id', 'style']),
948 - 'tbody' => self::kses_atts_map(['class', 'id', 'style']),
949 - 'tr' => self::kses_atts_map(['class', 'id', 'style']),
950 - 'th' => self::kses_atts_map(['class', 'id', 'style']),
951 - 'td' => self::kses_atts_map(['class', 'id', 'style']),
952 - 'i' => self::kses_atts_map(['class', 'id', 'style']),
953 - 'button' => self::kses_atts_map(['class', 'id']),
954 - 'nav' => self::kses_atts_map(['class', 'id', 'style']),
955 - 'time' => self::kses_atts_map(['datetime']),
866 + 'select' => self::wp_kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'multiple', 'required', 'size']),
867 + 'input' => self::wp_kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'required', 'size', 'type', 'checked', 'readonly', 'placeholder', 'value', 'maxlength', 'min', 'max', 'multiple', 'pattern', 'step', 'autocomplete']),
868 + 'textarea' => self::wp_kses_atts_map(['class', 'id', 'style', 'width', 'height', 'title', 'data', 'name', 'autofocus', 'disabled', 'required', 'rows', 'cols', 'wrap', 'maxlength']),
869 + 'option' => self::wp_kses_atts_map(['class', 'id', 'label', 'disabled', 'label', 'selected', 'value']),
870 + 'optgroup' => self::wp_kses_atts_map(['disabled', 'label', 'class', 'id']),
871 + 'form' => self::wp_kses_atts_map(['class', 'id', 'data', 'style', 'width', 'height', 'accept-charset', 'action', 'autocomplete', 'enctype', 'method', 'name', 'novalidate', 'rel', 'target']),
872 + 'svg' => self::wp_kses_atts_map(['class', 'xmlns', 'viewbox', 'width', 'height', 'fill', 'aria-hidden', 'aria-labelledby', 'role']),
873 + 'rect' => self::wp_kses_atts_map(['rx', 'width', 'height', 'fill']),
874 + 'path' => self::wp_kses_atts_map(['d', 'fill']),
875 + 'g' => self::wp_kses_atts_map(['fill']),
876 + 'defs' => self::wp_kses_atts_map(['fill']),
877 + 'linearGradient' => self::wp_kses_atts_map(['id', 'x1', 'x2', 'y1', 'y2', 'gradientUnits']),
878 + 'stop' => self::wp_kses_atts_map(['stop-color', 'offset', 'stop-opacity']),
879 + 'style' => self::wp_kses_atts_map(['type']),
880 + 'div' => self::wp_kses_atts_map(['class', 'id', 'style']),
881 + 'ul' => self::wp_kses_atts_map(['class', 'id', 'style']),
882 + 'li' => self::wp_kses_atts_map(['class', 'id', 'style']),
883 + 'label' => self::wp_kses_atts_map(['class', 'for']),
884 + 'span' => self::wp_kses_atts_map(['class', 'id', 'style']),
885 + 'h1' => self::wp_kses_atts_map(['class', 'id', 'style']),
886 + 'h2' => self::wp_kses_atts_map(['class', 'id', 'style']),
887 + 'h3' => self::wp_kses_atts_map(['class', 'id', 'style']),
888 + 'h4' => self::wp_kses_atts_map(['class', 'id', 'style']),
889 + 'h5' => self::wp_kses_atts_map(['class', 'id', 'style']),
890 + 'h6' => self::wp_kses_atts_map(['class', 'id', 'style']),
891 + 'a' => self::wp_kses_atts_map(['class', 'href', 'target', 'rel']),
892 + 'p' => self::wp_kses_atts_map(['class', 'id', 'style', 'data']),
893 + 'table' => self::wp_kses_atts_map(['class', 'id', 'style']),
894 + 'thead' => self::wp_kses_atts_map(['class', 'id', 'style']),
895 + 'tbody' => self::wp_kses_atts_map(['class', 'id', 'style']),
896 + 'tr' => self::wp_kses_atts_map(['class', 'id', 'style']),
897 + 'th' => self::wp_kses_atts_map(['class', 'id', 'style']),
898 + 'td' => self::wp_kses_atts_map(['class', 'id', 'style']),
899 + 'i' => self::wp_kses_atts_map(['class', 'id', 'style']),
900 + 'button' => self::wp_kses_atts_map(['class', 'id']),
901 + 'nav' => self::wp_kses_atts_map(['class', 'id', 'style']),
902 + 'time' => self::wp_kses_atts_map(['datetime']),
956 903 'br' => [],
957 904 'strong' => [],
958 905 'style' => [],
959 - 'img' => self::kses_atts_map(['class', 'src', 'alt', 'height', 'width', 'srcset', 'id', 'loading']),
906 + 'img' => self::wp_kses_atts_map(['class', 'src', 'alt', 'height', 'width', 'srcset', 'id', 'loading']),
960 907 ];
961 908
962 - return array_merge_recursive($allowed_tags, $custom_tags);
963 - }
909 + $allowed_tags = array_merge_recursive($allowed_tags, $custom_tags);
964 910
965 - /**
966 - * Sanitize a string with wp_kses() using the extended allowed-tags list.
967 - *
968 - * @param string $content
969 - * @return string
970 - */
971 - public static function kses_custom($content)
972 - {
973 - return wp_kses( stripslashes_deep($content), self::kses_allowed_html() );
911 + return wp_kses(stripslashes_deep($content), $allowed_tags);
974 912 }
975 913
976 914
977 915 /**
@@ -982,16 +920,16 @@
982 920 * @return void
983 921 */
984 922 public static function missing_plugin_notice( $plugin_name = '' )
985 923 {
924 + /* translators: %s: Plugin Name */
986 925 $missing_plugin_notice = sprintf(
987 - /* translators: 1: Plugin name, 2: Addons/plugins admin page URL, 3: "Install Now" link text */
988 926 __('<strong>"%1$s"</strong> plugin is not Activated! Please install and activate <strong>%1$s</strong> Plugin <p> <a class="adminify-missing-addons" href="%2$s">%3$s</a></p>', 'adminify'),
989 927 esc_html($plugin_name),
990 928 admin_url('admin.php?page=wp-adminify-addons-plugins'),
991 929 __('Install Now', 'adminify')
992 930 );
993 - return '<div class="adminify-missing-addons">' . self::upgrade_pro_icon() . self::kses_custom( $missing_plugin_notice ) . '</div>';
931 + return '<div class="adminify-missing-addons">' . self::jltwp_adminify_upgrade_pro_icon() . self::wp_kses_custom( $missing_plugin_notice ) . '</div>';
994 932 }
995 933
996 934
997 935 /**
@@ -1195,62 +1133,21 @@
1195 1133
1196 1134 return array_merge_recursive($old_db, $result);
1197 1135 }
1198 1136
1199 - /**
1200 - * Inline "Upgrade to Pro" marker rendered next to a checkbox option
1201 - * label in the free build.
1202 - *
1203 - * Returns the rocket-icon + (Upgrade to Pro) span the settings UI
1204 - * has rendered historically. The
1205 - * Inc/Admin/AdminSettings::render_pro_locked_field() handler
1206 - * detects this span inside a checkbox <li> and strips name= + sets
1207 - * disabled on the enclosed input so the locked option cannot submit
1208 - * a value.
1209 - *
1210 - * Returns an empty string when the Pro plugin is active so the Pro
1211 - * UI is unchanged.
1212 - */
1213 - public static function upgrade_pro_class($inline_badge = false){
1214 - if (function_exists('jltwp_adminify') && jltwp_adminify()->can_use_premium_code__premium_only()) {
1215 - return '';
1216 - }
1217 - if (!empty($inline_badge)){
1137 + public static function adminify_upgrade_pro_class($inline_badge=false){
1138 + if(!empty($inline_badge)){
1218 1139 return '<span class="adminify-pro-checkbox adminify-pro-badge adminify-pro-notice">Pro</span>';
1219 1140 }
1220 - return '<span class="adminify-pro-checkbox">' . self::upgrade_pro_icon() . ' <strong>(Upgrade to Pro)</strong>' . '</span>';
1141 + return '<span class="adminify-pro-checkbox">' . self::jltwp_adminify_upgrade_pro_icon() . ' <strong>(Upgrade to Pro)</strong>' . '</span>';
1221 1142 }
1222 1143
1223 - /**
1224 - * Inline "Pro" badge rendered next to a field title in the free
1225 - * build.
1226 - *
1227 - * Returns the legacy <span class="adminify-pro-badge">Pro</span>
1228 - * markup. The render handler detects fields whose class list
1229 - * contains adminify-pro-fieldset / -feature / -notice (the
1230 - * Pro-style classes used alongside this badge) and neutralises
1231 - * the inputs at render time.
1232 - *
1233 - * Returns an empty string when the Pro plugin is active.
1234 - */
1235 - public static function upgrade_pro_badge($badge_text = 'Pro'){
1236 - if (function_exists('jltwp_adminify') && jltwp_adminify()->can_use_premium_code__premium_only()) {
1237 - return '';
1144 + public static function adminify_upgrade_pro_badge($badge_text = 'Pro'){
1145 + if(!empty($badge_text)){
1146 + return '<span class="adminify-pro-badge">' . $badge_text . '</span>';
1238 1147 }
1239 - if (!empty($badge_text)){
1240 - return '<span class="adminify-pro-badge">' . esc_html($badge_text) . '</span>';
1241 - }
1242 - return '';
1243 1148 }
1244 1149
1245 - public static function new_badge($badge_text = 'New') {
1246 - if( empty( $badge_text ) ) {
1247 - return '';
1248 - }
1249 -
1250 - return '<span class="adminify-new-badge">' . esc_html($badge_text) . '</span>';
1251 - }
1252 -
1253 1150 /*
1254 1151 * Compares the version of WordPress running to the $version specified.
1255 1152 * Usage: Utils::check_wp_version('>=', '4.0')
1256 1153 version_compare( $wp_version, '4.3', '>=' )
@@ -1262,17 +1159,18 @@
1262 1159 global $wp_version;
1263 1160 return version_compare( $wp_version, $version, $operator );
1264 1161 }
1265 1162
1266 - public static function help_urls($module_name = '', $docs = '', $youtube = '', $facebook_grp = '', $support = '')
1163 + public static function adminfiy_help_urls($module_name = '', $docs = '', $youtube = '', $facebook_grp = '', $support = '')
1267 1164 {
1268 1165 $help_content = '';
1269 1166
1270 - // Modules ( sanitize the label so the returned template is safe to echo ).
1271 - // Callers may pass benign markup (e.g. an empty <span></span> used for layout/icons),
1272 - // so use wp_kses_post() — it keeps that markup while stripping scripts. esc_html()
1273 - // would print the tags literally (e.g. "<span></span>" shown as text).
1274 - $module_name = empty($module_name) ? '' : wp_kses_post($module_name);
1167 + // Modules
1168 + if (empty($module_name)) {
1169 + $module_name = '';
1170 + } else {
1171 + $module_name = $module_name;
1172 + }
1275 1173
1276 1174 $help_content_urls = '';
1277 1175
1278 1176 // Docs
@@ -1296,130 +1194,7 @@
1296 1194 }
1297 1195
1298 1196 $help_content = sprintf( '%1$s <div class="adminify-helps">%2$s</div>', $module_name, $help_content_urls );
1299 1197 return $help_content;
1300 - }
1301 -
1302 - /**
1303 - * Check if the request is coming from an iframe.
1304 - *
1305 - * @param None
1306 - * @throws None
1307 - * @return bool
1308 - */
1309 - public static function is_iframe()
1310 - {
1311 - return isset($_SERVER["HTTP_SEC_FETCH_DEST"]) && strtolower(sanitize_text_field(wp_unslash($_SERVER["HTTP_SEC_FETCH_DEST"]))) === "iframe";
1312 - // $isIframe = isset($_SERVER["HTTP_SEC_FETCH_DEST"]) && strtolower($_SERVER["HTTP_SEC_FETCH_DEST"]) === "iframe";
1313 - // if ( $isIframe ) return true;
1314 - // if ( isset($_GET['adminify-iframe']) ) return true;
1315 - // return false;
1316 - }
1317 -
1318 - /**
1319 - * Whether the request carries Fetch Metadata headers at all.
1320 - *
1321 - * `Sec-Fetch-*` is attached by the browser below the Service Worker layer, so
1322 - * installs served through a Service Worker - WordPress Playground, offline
1323 - * setups - never pass it to PHP. Older browsers do not send it either. When it
1324 - * is missing, is_iframe() cannot tell an iframe request from a top-level one
1325 - * and the client has to settle it instead.
1326 - *
1327 - * @return bool
1328 - */
1329 - public static function has_fetch_metadata()
1330 - {
1331 - return isset( $_SERVER['HTTP_SEC_FETCH_DEST'] )
1332 - || isset( $_SERVER['HTTP_SEC_FETCH_MODE'] )
1333 - || isset( $_SERVER['HTTP_SEC_FETCH_SITE'] );
1334 - }
1335 -
1336 - /**
1337 - * Whether this is a plain GET request.
1338 - *
1339 - * @return bool
1340 - */
1341 - public static function is_get_request()
1342 - {
1343 - $method = isset( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ) ) : 'GET';
1344 -
1345 - return 'GET' === $method || 'HEAD' === $method;
1346 - }
1347 -
1348 - /**
1349 - * Whether the current request renders a full admin page.
1350 - *
1351 - * Endpoints like async-upload.php run through wp-admin/admin.php (so `admin_init`
1352 - * fires) but answer with a raw payload - an attachment ID, JSON, an HTML fragment.
1353 - * Printing the Admin UI frame into those responses corrupts them: the media uploader
1354 - * on media-new.php reads the response as an attachment ID and gives up when it is not
1355 - * numeric. `wp_doing_ajax()` does not catch these: async-upload.php only defines
1356 - * DOING_AJAX for the `upload-attachment` action, which media-new.php does not send.
1357 - *
1358 - * @return bool
1359 - */
1360 - public static function is_admin_page_request()
1361 - {
1362 - if ( wp_doing_ajax() || wp_doing_cron() || wp_is_json_request() ) {
1363 - return false;
1364 - }
1365 -
1366 - if ( ( defined('REST_REQUEST') && REST_REQUEST ) || ( defined('XMLRPC_REQUEST') && XMLRPC_REQUEST ) || ( defined('WP_CLI') && WP_CLI ) ) {
1367 - return false;
1368 - }
1369 -
1370 - $pagenow = isset($GLOBALS['pagenow']) ? $GLOBALS['pagenow'] : '';
1371 -
1372 - if ( empty($pagenow) && isset($_SERVER['PHP_SELF']) ) {
1373 - $pagenow = basename( sanitize_text_field( wp_unslash($_SERVER['PHP_SELF']) ) );
1374 - }
1375 -
1376 - $raw_response_endpoints = [
1377 - 'admin-ajax.php',
1378 - 'admin-post.php',
1379 - 'async-upload.php',
1380 - 'load-scripts.php',
1381 - 'load-styles.php',
1382 - 'ms-files.php',
1383 - 'wp-cron.php',
1384 - ];
1385 -
1386 - return ! in_array( $pagenow, $raw_response_endpoints, true );
1387 - }
1388 -
1389 - /**
1390 - * Load a template file.
1391 - *
1392 - * @param string $template_name The name of the template file to load.
1393 - * @throws None
1394 - * @return void
1395 - */
1396 - public static function load_template($template_name)
1397 - {
1398 - require_once PXLBSADMINIFY_PATH . 'Inc/Admin/Frames/Templates/' . $template_name;
1399 - }
1400 -
1401 - /**
1402 - * Multisite Check
1403 - * @param URL
1404 - * @return Admin_URL
1405 - */
1406 - public static function maybe_network_admin_url($url) {
1407 - if ( is_network_admin() ) {
1408 - return network_admin_url($url);
1409 - }
1410 - return admin_url($url);
1411 - }
1412 -
1413 - /**
1414 - * Sluggify a string and replace hyphens with underscores.
1415 - * @param string $string The string to sluggify.
1416 - * @return string The sluggified string with underscores.
1417 - */
1418 - public static function sluggify_with_underscores($string) {
1419 - $slug = sanitize_title($string);
1420 - $slug = str_replace('-', '_', $slug);
1421 -
1422 - return $slug;
1423 1198 }
1424 1199
1425 1200 }