PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.2.9
Adminify – White Label, Admin Menu Editor, Login Customizer v4.2.9
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 / ThirdPartyCompatibility.php

ThirdPartyCompatibility.php in Adminify – White Label, Admin Menu Editor, Login Customizer 4.2.9, at Inc/Classes/ThirdPartyCompatibility.php

836 lines 35.7 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;
4
5 use PXLBSAdminify\Inc\Utils;
6 use PXLBSAdminify\Inc\Admin\AdminSettings;
7 use PXLBSAdminify\Inc\Modules\MenuEditor\MenuEditorOptions;
8 // no direct access allowed
9 if ( !defined( 'ABSPATH' ) ) {
10 exit;
11 }
12 /**
13 * PXLBSAdminify
14 * Third Party Plugins Compatibility
15 *
16 * @author Jewel Theme <support@jeweltheme.com>
17 */
18 class ThirdPartyCompatibility {
19 public $menu_settings;
20
21 public function __construct() {
22 $this->menu_settings = ( new MenuEditorOptions() )->get();
23 add_action( 'init', [$this, 'register_actions_on_init'], 0 );
24 add_action( 'admin_init', [$this, 'register_actions_on_admin_init'], 0 );
25 // 24-3-24
26 add_action( 'admin_enqueue_scripts', [$this, 'reset_theme_conflicts'], 999999 );
27 // 28-6-24
28 add_action( 'admin_head', [$this, 'plugin_conflicts'], 999999 );
29 // Inject layout-tightening CSS INTO the block editor iframe (parent CSS
30 // cannot reach inside). Closes the huge top gap between the editor toolbar
31 // and the post title that's amplified inside the Adminify iframe wrapper.
32 add_filter( 'block_editor_settings_all', [$this, 'block_editor_iframe_layout_tweaks'] );
33 if ( Utils::is_plugin_active( 'gravityforms/gravityforms.php' ) ) {
34 add_filter(
35 'update_footer',
36 [$this, 'change_admin_footer'],
37 9999,
38 3
39 );
40 }
41 // All Fluent Plugin Assets Supports
42 $this->whitelist_assets_in_fluent_plugins();
43 }
44
45 /**
46 * Whitelist Adminify assets in Fluent ecosystem no-conflict mode.
47 *
48 * Fluent Boards, Fluent Booking, Fluent CRM, Fluent Community, Fluent Forms,
49 * and Fluent Snippets (easy-code-manager) iterate $wp_scripts->queue on their
50 * admin pages and dequeue every plugin script whose src isn't in their approved
51 * slug list. Without this whitelist, Adminify's frame-adminify--admin script is
52 * stripped, leaving an empty React mount (white screen).
53 */
54 public function whitelist_assets_in_fluent_plugins() {
55 $add_regex = function ( $slugs ) {
56 $slugs[] = '\\/adminify\\/';
57 return $slugs;
58 };
59 if ( Utils::is_plugin_active( 'fluent-boards/fluent-boards.php' ) ) {
60 add_filter( 'fluent_boards/asset_listed_slugs', $add_regex );
61 }
62 if ( Utils::is_plugin_active( 'fluent-booking/fluent-booking.php' ) ) {
63 add_filter( 'fluent_booking/asset_listed_slugs', $add_regex );
64 }
65 if ( Utils::is_plugin_active( 'fluent-crm/fluent-crm.php' ) ) {
66 add_filter( 'fluent_crm_asset_listed_slugs', $add_regex );
67 }
68 if ( Utils::is_plugin_active( 'fluent-community/fluent-community.php' ) ) {
69 add_filter( 'fluent_community/asset_listed_slugs', $add_regex );
70 add_filter( 'fluent_com_editor/asset_listed_slugs', $add_regex );
71 }
72 if ( Utils::is_plugin_active( 'easy-code-manager/easy-code-manager.php' ) ) {
73 add_filter( 'fluent_snippets_asset_listed_slugs', $add_regex );
74 }
75 if ( Utils::is_plugin_active( 'fluentform/fluentform.php' ) ) {
76 add_filter( 'fluentform/exclude_js_slugs_from_dequeue', function ( $slugs ) {
77 $slugs[] = 'adminify';
78 return $slugs;
79 } );
80 }
81 }
82
83 /**
84 * Gravity Form Custom Footer missing div closing support
85 */
86 public function change_admin_footer( $footer_text ) {
87 $current_screen = get_current_screen();
88 if ( !empty( $current_screen ) && ($current_screen->id === 'toplevel_page_gf_edit_forms' || $current_screen->id === 'forms_page_gf_new_form') ) {
89 return $footer_text . '</div>';
90 }
91 return $footer_text;
92 }
93
94 public function plugin_conflicts() {
95 $adminify_ui = AdminSettings::get_instance()->get( 'admin_ui' );
96 if ( !empty( $adminify_ui ) ) {
97 // Motopress Hotel Booking Lite
98 if ( Utils::is_plugin_active( 'motopress-hotel-booking-lite/motopress-hotel-booking.php' ) ) {
99 echo '<style>
100 .wp-adminify.bookings_page_mphb_calendar .widefat thead th,
101 .wp-adminify.bookings_page_mphb_calendar .widefat tfoot th,
102 .wp-adminify.bookings_page_mphb_calendar .widefat tbody td {
103 padding: 0 !important;
104 }
105 .adminify-ui .widefat tbody tr td:first-child {
106 border-left-color: inherit !important;
107 }
108 </style>';
109 }
110 // Fluent Support
111 if ( Utils::is_plugin_active( 'fluent-support/fluent-support.php' ) ) {
112 echo '<style>
113 body.adminify-ui .fs_main_navbar{width:100%;top:0;left:0;}
114 </style>';
115 }
116 // Fluent Affiliate
117 if ( Utils::is_plugin_active( 'fluent-affiliate/fluent-affiliate.php' ) ) {
118 echo '<style>
119 body.adminify-ui #fluent-affiliate-app #fa_aff_menu {top:0;}
120 </style>';
121 }
122 // Fluent Cart
123 if ( Utils::is_plugin_active( 'fluent-cart/fluent-cart.php' ) ) {
124 echo '<style>
125 body.adminify-ui #wpbody-content #fct_admin_menu_holder .fct_admin_menu_wrap {width:100%;top:0;left:0;}
126 </style>';
127 }
128 // Fluent CRM
129 if ( Utils::is_plugin_active( 'fluent-crm/fluent-crm.php' ) ) {
130 echo '<style>
131 .wp-adminify.adminify-ui .fcrm_topbar {top:0;}
132 </style>';
133 }
134 // WP 7.0+ Command Palette: kill the focus border on the cmdk input
135 // (Adminify UI input styles bleed in) and wire the Adminify topbar
136 // item (#adminify-top-menu-command-palette) to open the palette.
137 echo '<style>
138 .wp-adminify .commands-command-menu__container input[cmdk-input],
139 .wp-adminify .commands-command-menu__container input[cmdk-input]:focus,
140 .wp-adminify .commands-command-menu__container input[cmdk-input]:focus-visible {
141 border: 0 !important;
142 outline: 0 !important;
143 box-shadow: none !important;
144 }
145 </style>';
146 $pxlbsadminify_cmdk_js = "(function(){function openCmd(){try{if(window.wp&&wp.data&&wp.data.dispatch('core/commands')){wp.data.dispatch('core/commands').open();return;}}catch(e){}var isMac=/Mac|iPod|iPhone|iPad/.test(navigator.platform);document.dispatchEvent(new KeyboardEvent('keydown',{key:'k',code:'KeyK',keyCode:75,which:75,ctrlKey:!isMac,metaKey:isMac,bubbles:true,cancelable:true}));}document.addEventListener('click',function(e){var t=e.target&&e.target.closest&&e.target.closest('#adminify-top-menu-command-palette a, .adminify-top-menu-command-palette a');if(!t)return;e.preventDefault();openCmd();});}());";
147 if ( function_exists( 'wp_print_inline_script_tag' ) ) {
148 wp_print_inline_script_tag( $pxlbsadminify_cmdk_js );
149 } else {
150 echo '<script>' . $pxlbsadminify_cmdk_js . '</script>';
151 // phpcs:ignore WordPress.WP.EnqueuedResources
152 }
153 // WP 7.0 block editor interface skeleton: pin to 0/0 inside Adminify UI.
154 // WP's default left/top offsets are for the WP admin bar + sidebar which
155 // Adminify hides — without this, the editor shifts off-origin.
156 echo '<style>
157 body.wp-adminify.adminify-ui .editor-editor-interface.edit-post-layout.interface-interface-skeleton,
158 body.wp-adminify.adminify-ui .interface-interface-skeleton {
159 left: 0 !important;
160 top: 0 !important;
161 }
162 </style>';
163 }
164 if ( Utils::is_plugin_active( 'squirrly-seo/squirrly.php' ) ) {
165 // kept as-is for squirrly compat; the generic adminify-ui rule below covers all editor pages
166 }
167 if ( Utils::is_plugin_active( 'surecart/surecart.php' ) || Utils::is_plugin_active( 'suremember/suremember.php' ) ) {
168 if ( !empty( $adminify_ui ) ) {
169 echo '<style>
170 .css-wa3qun,.backdrop-blur-sm {
171 top: 0 !important;
172 }
173 #suremembers-settings-content::before, #sc-settings-content::before{
174 width: 250px !important;
175 }
176 </style>';
177 }
178 }
179 if ( Utils::is_plugin_active( 'advanced-database-cleaner-pro/advanced-db-cleaner.php' ) ) {
180 echo '<style>
181 .wp-adminify.toplevel_page_advanced_db_cleaner #wpbody-content .wp-list-table.widefat td{
182 padding: 10px 10px;
183 }
184 .wp-adminify.toplevel_page_advanced_db_cleaner #wpbody-content input#aDBc_keep_button_revision {
185 padding: 0px 3px !important;
186 line-height: inherit !important;
187 }
188 </style>';
189 }
190 if ( Utils::is_plugin_active( 'insert-headers-and-footers/ihaf.php' ) ) {
191 echo '<style>
192 .wp-adminify .wpcode-code-type-picker, .wp-adminify .wpcode-code-type-picker-backdrop {
193 left: 0;
194 }
195 </style>';
196 }
197 if ( Utils::is_plugin_active( 'advanced-access-manager/aam.php' ) ) {
198 add_filter(
199 'pxlbsadminify_menu_option_compatibility_filter',
200 array($this, 'apply_menu_restrictions_via_filter'),
201 10,
202 2
203 );
204 }
205 if ( Utils::is_plugin_active( 'meta-box/meta-box.php' ) ) {
206 echo '<style>
207 .adminify-ui .og.mb {
208 left: 0;
209 }
210 </style>';
211 }
212 if ( Utils::is_plugin_active( 'wp-security-audit-log/wp-security-audit-log.php' ) ) {
213 echo '<script>
214 jQuery(document).ready(function($) {
215 $("body.wp-adminify.adminify-ui ul.frame-adminify-admin-menu li a .frame-adminify-menu-item-name").find("style").remove();
216
217 setInterval(function() {
218 $("body.wp-adminify.adminify-ui ul.frame-adminify-admin-menu li a .frame-adminify-menu-item-name").find("style").remove();
219 }, 1000);
220 });
221 </script>';
222 }
223 if ( Utils::is_plugin_active( 'shopengine/shopengine.php' ) ) {
224 global $pagenow;
225 // e.g. "edit.php"
226 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
227 $post_type = ( isset( $_GET['post_type'] ) ? sanitize_key( wp_unslash( $_GET['post_type'] ) ) : '' );
228 // Build the slug
229 $slug = ( $post_type ? "{$pagenow}?post_type={$post_type}" : $pagenow );
230 // Example usage:
231 if ( $slug === 'edit.php?post_type=shopengine-template' ) {
232 echo '<style>
233 #wpfooter {
234 position: inherit !important;
235 display: flex;
236 flex-direction: column-reverse;
237 }
238 </style>';
239 }
240 }
241 if ( Utils::is_plugin_active( 'breeze/breeze.php' ) ) {
242 echo '<script>
243 jQuery(document).ready(function($) {
244
245 const iframe = document.getElementById("frame-adminify-app--iframe");
246
247 const fileBtn = document.getElementById("adminify-top-menu-breeze-purge-file-group");
248 const objectCacheBtn = document.getElementById("adminify-top-menu-breeze-purge-object-cache-group");
249
250 if( fileBtn ) {
251 fileBtn.addEventListener("click", function (e) {
252 handleClickBreezeBtn("#wp-admin-bar-breeze-purge-file-group");
253 });
254 }
255
256 if( objectCacheBtn ) {
257 objectCacheBtn.addEventListener("click", function (e) {
258 handleClickBreezeBtn("#wp-admin-bar-breeze-purge-object-cache-group");
259 });
260 }
261
262 function handleClickBreezeBtn(selector) {
263 try {
264 const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
265
266 // Find and click the button
267 const button = iframeDoc.querySelector(selector);
268 if (button) {
269 button.click();
270 }
271 } catch (error) {
272 console.error("Cannot access iframe content:", error);
273 }
274 }
275 });
276 </script>';
277 }
278 // Redis Object Cache plugin compatibility
279 if ( Utils::is_plugin_active( 'redis-cache/redis-cache.php' ) ) {
280 $nonce = wp_create_nonce();
281 $ajaxurl = esc_url( admin_url( 'admin-ajax.php' ) );
282 $flushingText = __( 'Flushing cache...', 'adminify' );
283 echo '<script>
284 jQuery(document).ready(function($) {
285 const flushBtn = document.getElementById("adminify-top-menu-redis-cache-flush");
286 const parentMenu = document.getElementById("adminify-top-menu-redis-cache");
287
288 if (flushBtn) {
289 const flushLink = flushBtn.querySelector("a");
290
291 flushBtn.addEventListener("click", async function(e) {
292 e.preventDefault();
293 e.stopPropagation();
294
295 if (!flushLink) return;
296
297 // Store original text
298 const originalText = flushLink.textContent || flushLink.innerText;
299
300 // Close dropdown and show flushing text on parent menu
301 const parentLink = parentMenu ? parentMenu.querySelector("a") : null;
302 const parentOriginalHTML = parentLink ? parentLink.innerHTML : null;
303
304 if (parentLink) {
305 parentLink.innerHTML = "' . esc_js( $flushingText ) . '";
306 }
307
308 // Close dropdown
309 const dropdown = flushBtn.closest(".adminify-dropdown");
310 if (dropdown) {
311 dropdown.classList.remove("show");
312 }
313
314 try {
315 const data = new FormData();
316 data.append("action", "roc_flush_cache");
317 data.append("nonce", "' . esc_js( $nonce ) . '");
318
319 const response = await fetch("' . esc_url( $ajaxurl ) . '", {
320 method: "POST",
321 body: data,
322 });
323
324 const resultText = await response.text();
325
326 // Show result text
327 if (parentLink) {
328 parentLink.innerHTML = resultText;
329 }
330
331 // Reset to original after 3 seconds
332 setTimeout(function() {
333 if (parentLink && parentOriginalHTML) {
334 parentLink.innerHTML = parentOriginalHTML;
335 }
336 }, 3000);
337
338 } catch (error) {
339 console.error("Object cache could not be flushed:", error);
340 // Reset on error
341 if (parentLink && parentOriginalHTML) {
342 parentLink.innerHTML = parentOriginalHTML;
343 }
344 }
345 });
346 }
347 });
348 </script>';
349 }
350 }
351
352 public function apply_menu_restrictions_via_filter( $menu_options, $menu ) {
353 $aam_options = get_option( 'aam_access_settings', [] );
354 if ( is_array( $aam_options ) ) {
355 $simplified_aam_option = $this->simplify_aam_menu_restriction( $aam_options );
356 $menu_options = $this->update_aam_menu_option( $menu_options, $simplified_aam_option );
357 }
358 return $menu_options;
359 }
360
361 public function simplify_aam_menu_restriction( $aam_option ) {
362 $simplified_aam_option = [];
363 foreach ( $aam_option['role'] as $role => $aam_role ) {
364 if ( !empty( $aam_role['menu'] ) ) {
365 foreach ( $aam_role['menu'] as $menu_item => $value ) {
366 if ( !$value ) {
367 continue;
368 }
369 $menu_item = str_replace( 'menu-', '', $menu_item );
370 if ( !isset( $simplified_aam_option[$menu_item] ) ) {
371 $simplified_aam_option[$menu_item] = [];
372 }
373 $simplified_aam_option[$menu_item][] = $role;
374 }
375 }
376 }
377 return $simplified_aam_option;
378 }
379
380 public function update_aam_menu_option( $menu_options, $simplified_aam_option ) {
381 foreach ( $menu_options as $key => $item ) {
382 // If this menu item is in restricted list, update hidden_for
383 if ( isset( $simplified_aam_option[$key] ) ) {
384 if ( !isset( $item['hidden_for'] ) ) {
385 $item['hidden_for'] = [];
386 }
387 $item['hidden_for'] = array_merge( $item['hidden_for'], $simplified_aam_option[$key] );
388 $item['hidden_for'] = array_unique( $item['hidden_for'] );
389 }
390 // If submenu exists, apply the function recursively
391 // if (isset($item['submenu']) && is_array($item['submenu'])) {
392 // $item['submenu'] = update_aam_menu_option($item['submenu'], $simplified_aam_option);
393 // }
394 $menu_options[$key] = $item;
395 }
396 return $menu_options;
397 }
398
399 public function reset_theme_conflicts() {
400 global $pagenow;
401 if ( $pagenow == 'wp-login.php' || $pagenow == 'wp-register.php' || $pagenow == 'customize.php' ) {
402 return;
403 }
404 $screen = get_current_screen();
405 $theme = wp_get_theme();
406 // Neve WordPress Theme
407 if ( 'Neve' == $theme->name || 'Neve' == $theme->parent_theme ) {
408 wp_enqueue_style(
409 'wp-adminify_neve-theme',
410 PXLBSADMINIFY_ASSETS . 'css/themes/neve.min.css',
411 false,
412 PXLBSADMINIFY_VER
413 );
414 }
415 // Phlox WordPress Theme
416 if ( 'Phlox' == $theme->name || 'Phlox' == $theme->parent_theme ) {
417 echo '<style>
418 .wp-adminify.adminify-ui #wpcontent .wp-adminify.adminify-top_bar {
419 opacity: 1 !important;
420 }
421 </style>';
422 }
423 // Enfold WordPress Theme
424 if ( 'Enfold' == $theme->name || 'Enfold' == $theme->parent_theme ) {
425 echo '<style>
426 .wp-adminify.avia-advanced-editor-enabled #wpadminbar{
427 display: none !important;
428 }
429 </style>';
430 }
431 // BrightHub theme compatibility fix
432 if ( 'BrightHub' == $theme->name || 'BrightHub' == $theme->parent_theme ) {
433 echo '<style>
434 body.wp-adminify.adminify-ui.wp-theme-brighthub #wpadminbar,
435 body.wp-adminify.adminify-ui.wp-theme-brighthub #adminmenumain{
436 display: none !important;
437 }
438 .adminify-toolbar-wrapper .adminify-toolbar ul.adminify-top-menu li.adminify-top-menu-item{
439 display: flex;
440 width: auto;
441 justify-content: center;
442 align-items: center;
443 }
444 </style>';
445 echo '<script>
446 document.addEventListener("DOMContentLoaded", function() {
447 document.documentElement.setAttribute("frame-adminify-app", "true");
448
449 var iframe = document.querySelector(".adminify-frame-wrapper iframe");
450 if (iframe) {
451 iframe.addEventListener("load", function() {
452 try {
453 iframe.contentDocument.documentElement.setAttribute("frame-adminify-iframe", "true");
454 } catch(e) {
455 console.log("Could not access iframe content");
456 }
457 });
458
459 try {
460 if (iframe.contentDocument && iframe.contentDocument.documentElement) {
461 iframe.contentDocument.documentElement.setAttribute("frame-adminify-iframe", "true");
462 }
463 } catch(e) {
464 // Cross-origin restrictions might prevent access
465 }
466 }
467 });
468 document.addEventListener("DOMContentLoaded", function() {
469 var menuItems = document.querySelectorAll(".wp-adminify.adminify-ui .adminify-toolbar-wrapper .adminify-toolbar .adminify-top-menu li");
470 menuItems.forEach(function(item) {
471 var link = item.querySelector("a");
472 var divInLink = item.querySelector("a > div");
473 if (link && divInLink) {
474 link.textContent = divInLink.textContent;
475 }
476 });
477 });
478 </script>';
479 }
480 // Third Party Plugin CSS Conflict
481 // $pxlbsadminify_plugin_conflict_css = '';
482 // if (Utils::is_plugin_active('quillforms/quillforms.php')) {
483 // $pxlbsadminify_plugin_conflict_css = '//css code here';
484 // $pxlbsadminify_plugin_conflict_css = preg_replace('#/\*.*?\*/#s', '', $pxlbsadminify_plugin_conflict_css);
485 // $pxlbsadminify_plugin_conflict_css = preg_replace('/\s*([{}|:;,])\s+/', '$1', $pxlbsadminify_plugin_conflict_css);
486 // $pxlbsadminify_plugin_conflict_css = preg_replace('/\s\s+(.*)/', '$1', $pxlbsadminify_plugin_conflict_css);
487 // }
488 // $adminify_ui = AdminSettings::get_instance()->get('admin_ui');
489 // if (!empty($adminify_ui)) {
490 // wp_add_inline_style('wp-adminify-admin', wp_strip_all_tags($pxlbsadminify_plugin_conflict_css));
491 // } else {
492 // wp_add_inline_style('wp-adminify-default-ui', wp_strip_all_tags($pxlbsadminify_plugin_conflict_css));
493 // }
494 if ( Utils::is_plugin_active( 'stackable-ultimate-gutenberg-blocks-premium/plugin.php' ) ) {
495 echo '<style>
496 .wp-adminify.adminify-ui #wpcontent .wp-adminify.adminify-top_bar {
497 opacity: 1 !important;
498 }
499 </style>';
500 }
501 if ( Utils::is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
502 echo '<style>
503 .adminify-ui #woocommerce-embedded-root .woocommerce-layout__header, .adminify-ui .woocommerce-layout .woocommerce-layout__header {
504 width: 100%;
505 top: 0;
506 }
507 .adminify-ui #woocommerce-embedded-root .woocommerce-layout__header .woocommerce-layout__header-wrapper, .adminify-ui .woocommerce-layout .woocommerce-layout__header .woocommerce-layout__header-wrapper {
508 margin-right: 1rem;
509 }
510 body.woocommerce-page #wpwrap #wpcontent,
511 body.woocommerce-page.woocommerce_page_wc-admin #wpwrap #wpbody-content {
512 overflow-x: unset !important;
513 position: unset !important;
514 }
515 </style>';
516 }
517 if ( Utils::is_plugin_active( 'tinymce-templates/tinymce-templates.php' ) ) {
518 echo '<style>#tinymce-templates-wrap #tinymce-templates-preview { height: 500px !important; }</style>';
519 }
520 if ( Utils::is_plugin_active( 'elementor/elementor.php' ) ) {
521 echo '<style>
522 body.wp-adminify-admin-bar.admin-bar .dialog-lightbox-widget {
523 height: calc(100vh - 0px) !important;
524 }
525 body.wp-adminify-admin-bar.admin-bar #e-admin-top-bar-root{
526 padding-top: 70px !important;
527 width: calc(100% + 20px) !important;
528 margin-left: -20px;
529 }
530 body.wp-adminify-admin-bar.admin-bar #e-admin-top-bar-root .e-admin-top-bar{
531 padding-left: 20px;
532 }
533
534 body.adminify-ui.e-has-sidebar-navigation #wpwrap #wpcontent #editor-one-top-bar > header {
535 top: 0!important;
536 }
537 </style>';
538 }
539 if ( Utils::is_plugin_active( 'one-click-demo-import/one-click-demo-import.php' ) ) {
540 echo '<style>
541 .wp-adminify.appearance_page_one-click-demo-import .button-hero {
542 min-height: auto !important;
543 }
544 </style>';
545 }
546 if ( Utils::is_plugin_active( 'wpforms-lite/wpforms.php' ) ) {
547 if ( Utils::currentpage_id( 'dashboard' ) ) {
548 wp_enqueue_style(
549 'wpforms-full',
550 WPFORMS_PLUGIN_URL . 'assets/css/frontend/classic/wpforms-full.css',
551 [],
552 WPFORMS_VERSION
553 );
554 }
555 }
556 if ( Utils::is_plugin_active( 'classic-editor/classic-editor.php' ) ) {
557 echo '<style>
558 #ed_toolbar{
559 width: 100% !important;
560 }
561 #ed_toolbar #qt_content_dfw{
562 line-height: inherit;
563 padding: 0;
564 }
565 </style>';
566 }
567 if ( Utils::is_plugin_active( 'updraftplus/updraftplus.php' ) ) {
568 echo '<style>
569 .wp-adminify.settings_page_updraftplus input{
570 border-radius: 4px !important;
571 border: 1px solid #CCC !important;
572 }
573 .wp-adminify.adminify-dark-mode .updraft_feat_table,
574 .wp-adminify.adminify-dark-mode .updraft_feat_table td,
575 .wp-adminify.adminify-dark-mode .updraft_next_scheduled_backups_wrapper > div,
576 .wp-adminify.adminify-dark-mode .updraft_migrate_widget_module_content{
577 background: inherit;
578 }
579 .wp-adminify.adminify-dark-mode .updraft_premium_cta,
580 .wp-adminify.adminify-dark-mode .updraft_premium_cta__bottom,
581 .wp-adminify.adminify-dark-mode .udp-box,
582 .wp-adminify.adminify-dark-mode .updraftcentral_cloud_connect,
583 .wp-adminify.adminify-dark-mode .updraft_advert_bottom,
584 .wp-adminify.adminify-dark-mode #remote-storage-container label{
585 background: #020407;
586 }
587 .wp-adminify.adminify-dark-mode .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{
588 color: inherit;
589 }
590 </style>';
591 }
592 if ( Utils::is_plugin_active( 'tinymce-advanced/tinymce-advanced.php' ) ) {
593 echo '<style>
594 .wp-editor-container .mce-container-body .mce-menubar.mce-toolbar{
595 position: initial !important;
596 }
597 .wp-editor-container .mce-container-body .mce-toolbar-grp .mce-container-body{
598 position: relative !important;
599 }
600 .wp-editor-container .mce-container-body .mce-toolbar-grp .mce-toolbar.mce-first {
601 padding-right: 0 !important;
602 }
603 #ed_toolbar{
604 width: 100% !important;
605 }
606 #ed_toolbar #qt_content_dfw{
607 line-height: inherit;
608 padding: 0;
609 }
610 </style>';
611 }
612 if ( Utils::is_plugin_active( 'email-template-customizer-for-woo/email-template-customizer-for-woo.php' ) ) {
613 if ( $screen->id === 'edit-viwec_template' ) {
614 echo '<style>
615 #wpfooter{
616 position: relative !important;
617 display: flex;
618 flex-direction: column-reverse;
619 }
620 </style>';
621 }
622 }
623 if ( Utils::is_plugin_active( 'woocommerce-orders-tracking/woocommerce-orders-tracking.php' ) ) {
624 if ( $screen->id === 'woocommerce_page_wc-orders' ) {
625 echo '<style>
626 #wpfooter{
627 position: relative !important;
628 display: block !important;
629 flex-direction: column-reverse;
630 }
631 </style>';
632 }
633 }
634 // Divi Theme - "Edit With Divi" link should reload parent page instead of iframe
635 if ( 'Divi' == $theme->name || 'Divi' == $theme->parent_theme ) {
636 echo '<script>
637 document.addEventListener("DOMContentLoaded", function() {
638 var iframe = document.getElementById("frame-adminify-app--iframe");
639 if (!iframe) return;
640
641 function handleDiviLinks(iframeDoc) {
642 var diviLinks = iframeDoc.querySelectorAll("a[href*=\\"et_fb=1\\"], a.et_pb_toggle_builder_wrapper, a[href*=\\"page=et_divi_options\\"]");
643 diviLinks.forEach(function(link) {
644 link.addEventListener("click", function(e) {
645 e.preventDefault();
646 e.stopPropagation();
647 window.top.location.href = link.href;
648 });
649 });
650 }
651
652 iframe.addEventListener("load", function() {
653 try {
654 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
655 handleDiviLinks(iframeDoc);
656
657 var observer = new MutationObserver(function() {
658 handleDiviLinks(iframeDoc);
659 });
660 observer.observe(iframeDoc.body, { childList: true, subtree: true });
661 } catch(e) {
662 console.log("Divi compatibility: Cannot access iframe content");
663 }
664 });
665 });
666 </script>';
667 echo '<style>
668 #adminify-top-menu-et-builder-shortcode-framework,
669 #adminify-top-menu-et-builder-shortcode-framework-loaded,
670 #adminify-top-menu-et-builder-shortcode-framework-option,
671 #adminify-top-menu-et-builder-shortcode-framework-constant,
672 #adminify-top-menu-et-builder-shortcode-framework-hook,
673 #adminify-top-menu-et-builder-shortcode-framework-constant-value {
674 display: none;
675 }
676 </style>';
677 }
678 if ( Utils::is_plugin_active( 'js_composer/js_composer.php' ) ) {
679 echo '<style>
680 .adminify-ui .vc_dropdown-list-item p{
681 color: #fff;
682 }
683 </style>';
684 }
685 // Third Party localize script
686 wp_localize_script( 'adminify-admin', 'PXLBSADMINIFY_THIRDPARTY', $this->thirdparty_create_js_object() );
687 }
688
689 public function thirdparty_create_js_object() {
690 // betterlinks menu settings
691 $betterlinks = [
692 'active' => false,
693 ];
694 if ( Utils::is_plugin_active( 'betterlinks/betterlinks.php' ) ) {
695 if ( is_array( $this->menu_settings ) && array_key_exists( 'betterlinks', $this->menu_settings ) ) {
696 $menu_name = ( !empty( $this->menu_settings['betterlinks']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['name'] ) : '' );
697 $submenu_manage = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks']['name'] ) : '' );
698 $submenu_name = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks-analytics']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks-analytics']['name'] ) : '' );
699 $submenu_settings = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks-settings']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks-settings']['name'] ) : '' );
700 $betterlinks = [
701 'active' => true,
702 'menu_name' => esc_html( $menu_name ),
703 'submenu_manage' => esc_html( $submenu_manage ),
704 'submenu_name' => esc_html( $submenu_name ),
705 'submenu_settings' => esc_html( $submenu_settings ),
706 ];
707 }
708 }
709 return [
710 'ajax_url' => admin_url( 'admin-ajax.php' ),
711 'better_links' => wp_kses_post_deep( $betterlinks ),
712 ];
713 }
714
715 public function register_actions_on_init() {
716 // Brizy Builder
717 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
718 if ( isset( $_REQUEST['brizy-edit-iframe'] ) ) {
719 add_filter( 'pxlbsadminify_defer_skip', '__return_true' );
720 add_filter( 'pxlbsadminify_skip_removing_dashicons', '__return_true' );
721 }
722 }
723
724 public function register_actions_on_admin_init() {
725 $adminify_ui = AdminSettings::get_instance()->get( 'admin_ui' );
726 if ( !empty( $adminify_ui ) ) {
727 // Commented On: 24-3-24
728 add_action( 'admin_enqueue_scripts', [$this, 'enqueue_scripts'], 999 );
729 }
730 // Commented On: 10-6-24
731 // add_filter('pxlbsadminify_third_party_styles', [$this, 'register_compatability_styles']);
732 // Fluent CRM
733 add_action( 'fluentcrm_skip_no_conflict', '__return_true' );
734 // Fluent FORM
735 add_action( 'fluentform_skip_no_conflict', '__return_true' );
736 }
737
738 /**
739 * Register Third Party Styles
740 *
741 * @since 1.0.0
742 */
743 public function register_compatability_styles( $plugin_supports ) {
744 if ( !is_array( $plugin_supports ) ) {
745 $plugin_supports = [];
746 }
747 $plugin_dir = PXLBSADMINIFY_ASSETS . 'css/plugins/';
748 $plugin_files = list_files( PXLBSADMINIFY_PATH . 'assets/css/plugins/', 1 );
749 if ( !empty( $plugin_files ) ) {
750 foreach ( $plugin_files as $file ) {
751 $plugin_supports[wp_basename( $file, '.min.css' )] = $plugin_dir . wp_basename( $file );
752 }
753 }
754 return $plugin_supports;
755 }
756
757 /**
758 * Admin Enqueue Third Party Scripts/Styles
759 *
760 * @return void
761 */
762 public function enqueue_scripts() {
763 $plugin_supports = [];
764 $plugin_supports = apply_filters( 'pxlbsadminify_third_party_styles', $plugin_supports );
765 // Check Plugin Activated for Site Wide
766 if ( is_multisite() ) {
767 $active_plugins = get_site_option( 'active_sitewide_plugins' );
768 foreach ( $active_plugins as $active_path => $active_plugin ) {
769 if ( is_plugin_active_for_network( $active_path ) ) {
770 $string = explode( '/', $active_path );
771 $pluginname = $string[0];
772 if ( isset( $plugin_supports[$pluginname] ) ) {
773 if ( $plugin_supports[$pluginname] != '' ) {
774 wp_register_style(
775 'adminify_site-wide_' . $pluginname . '_css',
776 $plugin_supports[$pluginname],
777 [],
778 PXLBSADMINIFY_VER
779 );
780 wp_enqueue_style( 'adminify_site-wide_' . $pluginname . '_css' );
781 }
782 }
783 }
784 }
785 }
786 // Check Plugin Activated for Individual Sites
787 $activeplugins = get_option( 'active_plugins' );
788 foreach ( $activeplugins as $plugin ) {
789 if ( Utils::is_plugin_active( $plugin ) ) {
790 $string = explode( '/', $plugin );
791 $pluginname = $string[0];
792 if ( isset( $plugin_supports[$pluginname] ) ) {
793 if ( $plugin_supports[$pluginname] != '' ) {
794 wp_register_style(
795 'adminify_' . $pluginname . '_css',
796 $plugin_supports[$pluginname],
797 [],
798 PXLBSADMINIFY_VER
799 );
800 wp_enqueue_style( 'adminify_' . $pluginname . '_css' );
801 }
802 }
803 }
804 }
805 }
806
807 /**
808 * Inject layout-tightening CSS INTO the WP 6.3+/7.0 block editor iframe canvas.
809 *
810 * The Gutenberg canvas runs inside an iframe; styles enqueued via
811 * `enqueue_block_editor_assets` only reach the parent admin chrome. The
812 * `block_editor_settings_all` `styles` array IS injected into the iframe.
813 *
814 * The default Gutenberg post-title wrapper carries large block padding which,
815 * inside Adminify's iframe wrapper (already framed by topbar + sidebar),
816 * reads as a huge dead area between the editor toolbar and "Add title".
817 * Compress that wrapper + leading content padding so the title sits close
818 * under the toolbar.
819 */
820 public function block_editor_iframe_layout_tweaks( $settings ) {
821 // Iframe body padding (Gutenberg ~50-60px default) + root container's first-child
822 // margin-block-start are the two real sources of the gap above "Add title".
823 // Multiple selectors cover WP 6.x ("edit-post-*") and WP 7.0+ ("editor-*", new
824 // "block-editor-iframe__body" body class on the iframe) class renames.
825 $css = 'html body.block-editor-iframe__body,' . 'html body.editor-styles-wrapper,' . '.block-editor-iframe__body,' . '.editor-styles-wrapper{padding-top:12px !important;margin-top:0 !important;}' . '.is-root-container,' . '.editor-styles-wrapper>.is-root-container,' . '.block-editor-block-list__layout.is-root-container,' . '.is-root-container.is-layout-flow,' . '.is-root-container.is-layout-constrained{padding-top:0 !important;margin-top:0 !important;}' . '.is-root-container>*:first-child,' . '.is-root-container>[data-block]:first-child,' . '.editor-styles-wrapper>[data-block]:first-child,' . '.editor-styles-wrapper>.wp-block:first-child{margin-block-start:0 !important;margin-top:0 !important;padding-top:0 !important;}' . '.wp-block-post-title,' . 'h1.wp-block-post-title,' . '.editor-post-title,' . 'h1.editor-post-title,' . '.editor-post-title__input,' . 'h1.editor-post-title__input{margin:0 !important;margin-block-start:0 !important;padding-top:0 !important;}' . '.edit-post-visual-editor,' . '.editor-visual-editor,' . '.edit-post-visual-editor__post-title-wrapper,' . '.editor-visual-editor__post-title-wrapper,' . '.edit-post-visual-editor__content-area,' . '.editor-visual-editor__content-area{padding-top:0 !important;margin-top:0 !important;}';
826 if ( !isset( $settings['styles'] ) || !is_array( $settings['styles'] ) ) {
827 $settings['styles'] = array();
828 }
829 $settings['styles'][] = array(
830 'css' => $css,
831 );
832 return $settings;
833 }
834
835 }
836