PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.2.23
Adminify – White Label, Admin Menu Editor, Login Customizer v4.2.23
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.23, at Inc/Classes/ThirdPartyCompatibility.php

851 lines 37.2 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']); // TODO: comment because not product this issue. if we product this issue then think about why create this this and solve it all type of users
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 // WPML (sitepress-multilingual-cms) admin language switcher
164 // (#WPML_ALS) is mirrored into the Adminify topbar. Its language
165 // links otherwise switch inside the iframe, so the parent admin
166 // chrome keeps the old language. Force a full top-window reload to
167 // the chosen language URL so the whole admin re-renders.
168 if ( Utils::is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
169 $pxlbsadminify_wpml_js = "(function(){document.addEventListener('click',function(e){var li=e.target&&e.target.closest&&e.target.closest('[id^=\"adminify-top-menu-WPML_ALS_\"]');if(!li)return;var a=li.querySelector('a')||(e.target.closest('a'));if(!a)return;var href=a.getAttribute('href')||a.href;if(!href||href==='#')return;e.preventDefault();e.stopPropagation();window.top.location.href=href;},true);}());";
170 if ( function_exists( 'wp_print_inline_script_tag' ) ) {
171 wp_print_inline_script_tag( $pxlbsadminify_wpml_js );
172 } else {
173 echo '<script>' . $pxlbsadminify_wpml_js . '</script>';
174 // phpcs:ignore WordPress.WP.EnqueuedResources
175 }
176 }
177 }
178 if ( Utils::is_plugin_active( 'squirrly-seo/squirrly.php' ) ) {
179 // kept as-is for squirrly compat; the generic adminify-ui rule below covers all editor pages
180 }
181 if ( Utils::is_plugin_active( 'surecart/surecart.php' ) || Utils::is_plugin_active( 'suremember/suremember.php' ) ) {
182 if ( !empty( $adminify_ui ) ) {
183 echo '<style>
184 .css-wa3qun,.backdrop-blur-sm {
185 top: 0 !important;
186 }
187 #suremembers-settings-content::before, #sc-settings-content::before{
188 width: 250px !important;
189 }
190 </style>';
191 }
192 }
193 if ( Utils::is_plugin_active( 'advanced-database-cleaner-pro/advanced-db-cleaner.php' ) ) {
194 echo '<style>
195 .wp-adminify.toplevel_page_advanced_db_cleaner #wpbody-content .wp-list-table.widefat td{
196 padding: 10px 10px;
197 }
198 .wp-adminify.toplevel_page_advanced_db_cleaner #wpbody-content input#aDBc_keep_button_revision {
199 padding: 0px 3px !important;
200 line-height: inherit !important;
201 }
202 </style>';
203 }
204 if ( Utils::is_plugin_active( 'insert-headers-and-footers/ihaf.php' ) ) {
205 echo '<style>
206 .wp-adminify .wpcode-code-type-picker, .wp-adminify .wpcode-code-type-picker-backdrop {
207 left: 0;
208 }
209 </style>';
210 }
211 if ( Utils::is_plugin_active( 'advanced-access-manager/aam.php' ) ) {
212 add_filter(
213 'pxlbsadminify_menu_option_compatibility_filter',
214 array($this, 'apply_menu_restrictions_via_filter'),
215 10,
216 2
217 );
218 }
219 if ( Utils::is_plugin_active( 'meta-box/meta-box.php' ) ) {
220 echo '<style>
221 .adminify-ui .og.mb {
222 left: 0;
223 }
224 </style>';
225 }
226 if ( Utils::is_plugin_active( 'wp-security-audit-log/wp-security-audit-log.php' ) ) {
227 echo '<script>
228 jQuery(document).ready(function($) {
229 $("body.wp-adminify.adminify-ui ul.frame-adminify-admin-menu li a .frame-adminify-menu-item-name").find("style").remove();
230
231 setInterval(function() {
232 $("body.wp-adminify.adminify-ui ul.frame-adminify-admin-menu li a .frame-adminify-menu-item-name").find("style").remove();
233 }, 1000);
234 });
235 </script>';
236 }
237 if ( Utils::is_plugin_active( 'shopengine/shopengine.php' ) ) {
238 global $pagenow;
239 // e.g. "edit.php"
240 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
241 $post_type = ( isset( $_GET['post_type'] ) ? sanitize_key( wp_unslash( $_GET['post_type'] ) ) : '' );
242 // Build the slug
243 $slug = ( $post_type ? "{$pagenow}?post_type={$post_type}" : $pagenow );
244 // Example usage:
245 if ( $slug === 'edit.php?post_type=shopengine-template' ) {
246 echo '<style>
247 #wpfooter {
248 position: inherit !important;
249 display: flex;
250 flex-direction: column-reverse;
251 }
252 </style>';
253 }
254 }
255 if ( Utils::is_plugin_active( 'breeze/breeze.php' ) ) {
256 echo '<script>
257 jQuery(document).ready(function($) {
258
259 const iframe = document.getElementById("frame-adminify-app--iframe");
260
261 const fileBtn = document.getElementById("adminify-top-menu-breeze-purge-file-group");
262 const objectCacheBtn = document.getElementById("adminify-top-menu-breeze-purge-object-cache-group");
263
264 if( fileBtn ) {
265 fileBtn.addEventListener("click", function (e) {
266 handleClickBreezeBtn("#wp-admin-bar-breeze-purge-file-group");
267 });
268 }
269
270 if( objectCacheBtn ) {
271 objectCacheBtn.addEventListener("click", function (e) {
272 handleClickBreezeBtn("#wp-admin-bar-breeze-purge-object-cache-group");
273 });
274 }
275
276 function handleClickBreezeBtn(selector) {
277 try {
278 const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
279
280 // Find and click the button
281 const button = iframeDoc.querySelector(selector);
282 if (button) {
283 button.click();
284 }
285 } catch (error) {
286 console.error("Cannot access iframe content:", error);
287 }
288 }
289 });
290 </script>';
291 }
292 // Redis Object Cache plugin compatibility
293 if ( Utils::is_plugin_active( 'redis-cache/redis-cache.php' ) ) {
294 $nonce = wp_create_nonce();
295 $ajaxurl = esc_url( admin_url( 'admin-ajax.php' ) );
296 $flushingText = __( 'Flushing cache...', 'adminify' );
297 echo '<script>
298 jQuery(document).ready(function($) {
299 const flushBtn = document.getElementById("adminify-top-menu-redis-cache-flush");
300 const parentMenu = document.getElementById("adminify-top-menu-redis-cache");
301
302 if (flushBtn) {
303 const flushLink = flushBtn.querySelector("a");
304
305 flushBtn.addEventListener("click", async function(e) {
306 e.preventDefault();
307 e.stopPropagation();
308
309 if (!flushLink) return;
310
311 // Store original text
312 const originalText = flushLink.textContent || flushLink.innerText;
313
314 // Close dropdown and show flushing text on parent menu
315 const parentLink = parentMenu ? parentMenu.querySelector("a") : null;
316 const parentOriginalHTML = parentLink ? parentLink.innerHTML : null;
317
318 if (parentLink) {
319 parentLink.innerHTML = "' . esc_js( $flushingText ) . '";
320 }
321
322 // Close dropdown
323 const dropdown = flushBtn.closest(".adminify-dropdown");
324 if (dropdown) {
325 dropdown.classList.remove("show");
326 }
327
328 try {
329 const data = new FormData();
330 data.append("action", "roc_flush_cache");
331 data.append("nonce", "' . esc_js( $nonce ) . '");
332
333 const response = await fetch("' . esc_url( $ajaxurl ) . '", {
334 method: "POST",
335 body: data,
336 });
337
338 const resultText = await response.text();
339
340 // Show result text
341 if (parentLink) {
342 parentLink.innerHTML = resultText;
343 }
344
345 // Reset to original after 3 seconds
346 setTimeout(function() {
347 if (parentLink && parentOriginalHTML) {
348 parentLink.innerHTML = parentOriginalHTML;
349 }
350 }, 3000);
351
352 } catch (error) {
353 console.error("Object cache could not be flushed:", error);
354 // Reset on error
355 if (parentLink && parentOriginalHTML) {
356 parentLink.innerHTML = parentOriginalHTML;
357 }
358 }
359 });
360 }
361 });
362 </script>';
363 }
364 }
365
366 public function apply_menu_restrictions_via_filter( $menu_options, $menu ) {
367 $aam_options = get_option( 'aam_access_settings', [] );
368 if ( is_array( $aam_options ) ) {
369 $simplified_aam_option = $this->simplify_aam_menu_restriction( $aam_options );
370 $menu_options = $this->update_aam_menu_option( $menu_options, $simplified_aam_option );
371 }
372 return $menu_options;
373 }
374
375 public function simplify_aam_menu_restriction( $aam_option ) {
376 $simplified_aam_option = [];
377 foreach ( $aam_option['role'] as $role => $aam_role ) {
378 if ( !empty( $aam_role['menu'] ) ) {
379 foreach ( $aam_role['menu'] as $menu_item => $value ) {
380 if ( !$value ) {
381 continue;
382 }
383 $menu_item = str_replace( 'menu-', '', $menu_item );
384 if ( !isset( $simplified_aam_option[$menu_item] ) ) {
385 $simplified_aam_option[$menu_item] = [];
386 }
387 $simplified_aam_option[$menu_item][] = $role;
388 }
389 }
390 }
391 return $simplified_aam_option;
392 }
393
394 public function update_aam_menu_option( $menu_options, $simplified_aam_option ) {
395 foreach ( $menu_options as $key => $item ) {
396 // If this menu item is in restricted list, update hidden_for
397 if ( isset( $simplified_aam_option[$key] ) ) {
398 if ( !isset( $item['hidden_for'] ) ) {
399 $item['hidden_for'] = [];
400 }
401 $item['hidden_for'] = array_merge( $item['hidden_for'], $simplified_aam_option[$key] );
402 $item['hidden_for'] = array_unique( $item['hidden_for'] );
403 }
404 // If submenu exists, apply the function recursively
405 // if (isset($item['submenu']) && is_array($item['submenu'])) {
406 // $item['submenu'] = update_aam_menu_option($item['submenu'], $simplified_aam_option);
407 // }
408 $menu_options[$key] = $item;
409 }
410 return $menu_options;
411 }
412
413 public function reset_theme_conflicts() {
414 global $pagenow;
415 if ( $pagenow == 'wp-login.php' || $pagenow == 'wp-register.php' || $pagenow == 'customize.php' ) {
416 return;
417 }
418 $screen = get_current_screen();
419 $theme = wp_get_theme();
420 // Neve WordPress Theme
421 if ( 'Neve' == $theme->name || 'Neve' == $theme->parent_theme ) {
422 wp_enqueue_style(
423 'wp-adminify_neve-theme',
424 PXLBSADMINIFY_ASSETS . 'css/themes/neve.min.css',
425 false,
426 PXLBSADMINIFY_VER
427 );
428 }
429 // Phlox WordPress Theme
430 if ( 'Phlox' == $theme->name || 'Phlox' == $theme->parent_theme ) {
431 echo '<style>
432 .wp-adminify.adminify-ui #wpcontent .wp-adminify.adminify-top_bar {
433 opacity: 1 !important;
434 }
435 </style>';
436 }
437 // Enfold WordPress Theme
438 if ( 'Enfold' == $theme->name || 'Enfold' == $theme->parent_theme ) {
439 echo '<style>
440 .wp-adminify.avia-advanced-editor-enabled #wpadminbar{
441 display: none !important;
442 }
443 </style>';
444 }
445 // BrightHub theme compatibility fix
446 if ( 'BrightHub' == $theme->name || 'BrightHub' == $theme->parent_theme ) {
447 echo '<style>
448 body.wp-adminify.adminify-ui.wp-theme-brighthub #wpadminbar,
449 body.wp-adminify.adminify-ui.wp-theme-brighthub #adminmenumain{
450 display: none !important;
451 }
452 .adminify-toolbar-wrapper .adminify-toolbar ul.adminify-top-menu li.adminify-top-menu-item{
453 display: flex;
454 width: auto;
455 justify-content: center;
456 align-items: center;
457 }
458 </style>';
459 echo '<script>
460 document.addEventListener("DOMContentLoaded", function() {
461 document.documentElement.setAttribute("frame-adminify-app", "true");
462
463 var iframe = document.querySelector(".adminify-frame-wrapper iframe");
464 if (iframe) {
465 iframe.addEventListener("load", function() {
466 try {
467 iframe.contentDocument.documentElement.setAttribute("frame-adminify-iframe", "true");
468 } catch(e) {
469 console.log("Could not access iframe content");
470 }
471 });
472
473 try {
474 if (iframe.contentDocument && iframe.contentDocument.documentElement) {
475 iframe.contentDocument.documentElement.setAttribute("frame-adminify-iframe", "true");
476 }
477 } catch(e) {
478 // Cross-origin restrictions might prevent access
479 }
480 }
481 });
482 document.addEventListener("DOMContentLoaded", function() {
483 var menuItems = document.querySelectorAll(".wp-adminify.adminify-ui .adminify-toolbar-wrapper .adminify-toolbar .adminify-top-menu li");
484 menuItems.forEach(function(item) {
485 var link = item.querySelector("a");
486 var divInLink = item.querySelector("a > div");
487 if (link && divInLink) {
488 link.textContent = divInLink.textContent;
489 }
490 });
491 });
492 </script>';
493 }
494 // Third Party Plugin CSS Conflict
495 // $pxlbsadminify_plugin_conflict_css = '';
496 // if (Utils::is_plugin_active('quillforms/quillforms.php')) {
497 // $pxlbsadminify_plugin_conflict_css = '//css code here';
498 // $pxlbsadminify_plugin_conflict_css = preg_replace('#/\*.*?\*/#s', '', $pxlbsadminify_plugin_conflict_css);
499 // $pxlbsadminify_plugin_conflict_css = preg_replace('/\s*([{}|:;,])\s+/', '$1', $pxlbsadminify_plugin_conflict_css);
500 // $pxlbsadminify_plugin_conflict_css = preg_replace('/\s\s+(.*)/', '$1', $pxlbsadminify_plugin_conflict_css);
501 // }
502 // $adminify_ui = AdminSettings::get_instance()->get('admin_ui');
503 // if (!empty($adminify_ui)) {
504 // wp_add_inline_style('wp-adminify-admin', wp_strip_all_tags($pxlbsadminify_plugin_conflict_css));
505 // } else {
506 // wp_add_inline_style('wp-adminify-default-ui', wp_strip_all_tags($pxlbsadminify_plugin_conflict_css));
507 // }
508 if ( Utils::is_plugin_active( 'stackable-ultimate-gutenberg-blocks-premium/plugin.php' ) ) {
509 echo '<style>
510 .wp-adminify.adminify-ui #wpcontent .wp-adminify.adminify-top_bar {
511 opacity: 1 !important;
512 }
513 </style>';
514 }
515 if ( Utils::is_plugin_active( 'woocommerce/woocommerce.php' ) ) {
516 echo '<style>
517 .adminify-ui #woocommerce-embedded-root .woocommerce-layout__header, .adminify-ui .woocommerce-layout .woocommerce-layout__header {
518 width: 100%;
519 top: 0;
520 }
521 .adminify-ui #woocommerce-embedded-root .woocommerce-layout__header .woocommerce-layout__header-wrapper, .adminify-ui .woocommerce-layout .woocommerce-layout__header .woocommerce-layout__header-wrapper {
522 margin-right: 1rem;
523 }
524 body.woocommerce-page #wpwrap #wpcontent,
525 body.woocommerce-page.woocommerce_page_wc-admin #wpwrap #wpbody-content {
526 overflow-x: unset !important;
527 position: unset !important;
528 }
529 </style>';
530 }
531 if ( Utils::is_plugin_active( 'tinymce-templates/tinymce-templates.php' ) ) {
532 echo '<style>#tinymce-templates-wrap #tinymce-templates-preview { height: 500px !important; }</style>';
533 }
534 if ( Utils::is_plugin_active( 'elementor/elementor.php' ) ) {
535 echo '<style>
536 body.wp-adminify-admin-bar.admin-bar .dialog-lightbox-widget {
537 height: calc(100vh - 0px) !important;
538 }
539 body.wp-adminify-admin-bar.admin-bar #e-admin-top-bar-root{
540 padding-top: 70px !important;
541 width: calc(100% + 20px) !important;
542 margin-left: -20px;
543 }
544 body.wp-adminify-admin-bar.admin-bar #e-admin-top-bar-root .e-admin-top-bar{
545 padding-left: 20px;
546 }
547
548 body.adminify-ui.e-has-sidebar-navigation #wpwrap #wpcontent #editor-one-top-bar > header {
549 top: 0!important;
550 }
551 body.adminify-ui #wpbody-content #elementor-home-app main header {top: 0!important}
552 </style>';
553 }
554 if ( Utils::is_plugin_active( 'one-click-demo-import/one-click-demo-import.php' ) ) {
555 echo '<style>
556 .wp-adminify.appearance_page_one-click-demo-import .button-hero {
557 min-height: auto !important;
558 }
559 </style>';
560 }
561 if ( Utils::is_plugin_active( 'wpforms-lite/wpforms.php' ) ) {
562 if ( Utils::currentpage_id( 'dashboard' ) ) {
563 wp_enqueue_style(
564 'wpforms-full',
565 WPFORMS_PLUGIN_URL . 'assets/css/frontend/classic/wpforms-full.css',
566 [],
567 WPFORMS_VERSION
568 );
569 }
570 }
571 if ( Utils::is_plugin_active( 'classic-editor/classic-editor.php' ) ) {
572 echo '<style>
573 #ed_toolbar{
574 width: 100% !important;
575 }
576 #ed_toolbar #qt_content_dfw{
577 line-height: inherit;
578 padding: 0;
579 }
580 </style>';
581 }
582 if ( Utils::is_plugin_active( 'updraftplus/updraftplus.php' ) ) {
583 echo '<style>
584 .wp-adminify.settings_page_updraftplus input{
585 border-radius: 4px !important;
586 border: 1px solid #CCC !important;
587 }
588 .wp-adminify.adminify-dark-mode .updraft_feat_table,
589 .wp-adminify.adminify-dark-mode .updraft_feat_table td,
590 .wp-adminify.adminify-dark-mode .updraft_next_scheduled_backups_wrapper > div,
591 .wp-adminify.adminify-dark-mode .updraft_migrate_widget_module_content{
592 background: inherit;
593 }
594 .wp-adminify.adminify-dark-mode .updraft_premium_cta,
595 .wp-adminify.adminify-dark-mode .updraft_premium_cta__bottom,
596 .wp-adminify.adminify-dark-mode .udp-box,
597 .wp-adminify.adminify-dark-mode .updraftcentral_cloud_connect,
598 .wp-adminify.adminify-dark-mode .updraft_advert_bottom,
599 .wp-adminify.adminify-dark-mode #remote-storage-container label{
600 background: #020407;
601 }
602 .wp-adminify.adminify-dark-mode .expertmode .advanced_settings_container .advanced_settings_menu .advanced_tools_button{
603 color: inherit;
604 }
605 </style>';
606 }
607 if ( Utils::is_plugin_active( 'tinymce-advanced/tinymce-advanced.php' ) ) {
608 echo '<style>
609 .wp-editor-container .mce-container-body .mce-menubar.mce-toolbar{
610 position: initial !important;
611 }
612 .wp-editor-container .mce-container-body .mce-toolbar-grp .mce-container-body{
613 position: relative !important;
614 }
615 .wp-editor-container .mce-container-body .mce-toolbar-grp .mce-toolbar.mce-first {
616 padding-right: 0 !important;
617 }
618 #ed_toolbar{
619 width: 100% !important;
620 }
621 #ed_toolbar #qt_content_dfw{
622 line-height: inherit;
623 padding: 0;
624 }
625 </style>';
626 }
627 if ( Utils::is_plugin_active( 'email-template-customizer-for-woo/email-template-customizer-for-woo.php' ) ) {
628 if ( $screen->id === 'edit-viwec_template' ) {
629 echo '<style>
630 #wpfooter{
631 position: relative !important;
632 display: flex;
633 flex-direction: column-reverse;
634 }
635 </style>';
636 }
637 }
638 if ( Utils::is_plugin_active( 'woocommerce-orders-tracking/woocommerce-orders-tracking.php' ) ) {
639 if ( $screen->id === 'woocommerce_page_wc-orders' ) {
640 echo '<style>
641 #wpfooter{
642 position: relative !important;
643 display: block !important;
644 flex-direction: column-reverse;
645 }
646 </style>';
647 }
648 }
649 // Divi Theme - "Edit With Divi" link should reload parent page instead of iframe
650 if ( 'Divi' == $theme->name || 'Divi' == $theme->parent_theme ) {
651 echo '<script>
652 document.addEventListener("DOMContentLoaded", function() {
653 var iframe = document.getElementById("frame-adminify-app--iframe");
654 if (!iframe) return;
655
656 function handleDiviLinks(iframeDoc) {
657 var diviLinks = iframeDoc.querySelectorAll("a[href*=\\"et_fb=1\\"], a.et_pb_toggle_builder_wrapper, a[href*=\\"page=et_divi_options\\"]");
658 diviLinks.forEach(function(link) {
659 link.addEventListener("click", function(e) {
660 e.preventDefault();
661 e.stopPropagation();
662 window.top.location.href = link.href;
663 });
664 });
665 }
666
667 iframe.addEventListener("load", function() {
668 try {
669 var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
670 handleDiviLinks(iframeDoc);
671
672 var observer = new MutationObserver(function() {
673 handleDiviLinks(iframeDoc);
674 });
675 observer.observe(iframeDoc.body, { childList: true, subtree: true });
676 } catch(e) {
677 console.log("Divi compatibility: Cannot access iframe content");
678 }
679 });
680 });
681 </script>';
682 echo '<style>
683 #adminify-top-menu-et-builder-shortcode-framework,
684 #adminify-top-menu-et-builder-shortcode-framework-loaded,
685 #adminify-top-menu-et-builder-shortcode-framework-option,
686 #adminify-top-menu-et-builder-shortcode-framework-constant,
687 #adminify-top-menu-et-builder-shortcode-framework-hook,
688 #adminify-top-menu-et-builder-shortcode-framework-constant-value {
689 display: none;
690 }
691 </style>';
692 }
693 if ( Utils::is_plugin_active( 'js_composer/js_composer.php' ) ) {
694 echo '<style>
695 .adminify-ui .vc_dropdown-list-item p{
696 color: #fff;
697 }
698 </style>';
699 }
700 // Third Party localize script
701 wp_localize_script( 'adminify-admin', 'PXLBSADMINIFY_THIRDPARTY', $this->thirdparty_create_js_object() );
702 }
703
704 public function thirdparty_create_js_object() {
705 // betterlinks menu settings
706 $betterlinks = [
707 'active' => false,
708 ];
709 if ( Utils::is_plugin_active( 'betterlinks/betterlinks.php' ) ) {
710 if ( is_array( $this->menu_settings ) && array_key_exists( 'betterlinks', $this->menu_settings ) ) {
711 $menu_name = ( !empty( $this->menu_settings['betterlinks']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['name'] ) : '' );
712 $submenu_manage = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks']['name'] ) : '' );
713 $submenu_name = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks-analytics']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks-analytics']['name'] ) : '' );
714 $submenu_settings = ( !empty( $this->menu_settings['betterlinks']['submenu']['betterlinks-settings']['name'] ) ? esc_html( $this->menu_settings['betterlinks']['submenu']['betterlinks-settings']['name'] ) : '' );
715 $betterlinks = [
716 'active' => true,
717 'menu_name' => esc_html( $menu_name ),
718 'submenu_manage' => esc_html( $submenu_manage ),
719 'submenu_name' => esc_html( $submenu_name ),
720 'submenu_settings' => esc_html( $submenu_settings ),
721 ];
722 }
723 }
724 return [
725 'ajax_url' => admin_url( 'admin-ajax.php' ),
726 'better_links' => wp_kses_post_deep( $betterlinks ),
727 ];
728 }
729
730 public function register_actions_on_init() {
731 // Brizy Builder
732 // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only check, no state change.
733 if ( isset( $_REQUEST['brizy-edit-iframe'] ) ) {
734 add_filter( 'pxlbsadminify_defer_skip', '__return_true' );
735 add_filter( 'pxlbsadminify_skip_removing_dashicons', '__return_true' );
736 }
737 }
738
739 public function register_actions_on_admin_init() {
740 $adminify_ui = AdminSettings::get_instance()->get( 'admin_ui' );
741 if ( !empty( $adminify_ui ) ) {
742 // Commented On: 24-3-24
743 add_action( 'admin_enqueue_scripts', [$this, 'enqueue_scripts'], 999 );
744 }
745 // Commented On: 10-6-24
746 // add_filter('pxlbsadminify_third_party_styles', [$this, 'register_compatability_styles']);
747 // Fluent CRM
748 add_action( 'fluentcrm_skip_no_conflict', '__return_true' );
749 // Fluent FORM
750 add_action( 'fluentform_skip_no_conflict', '__return_true' );
751 }
752
753 /**
754 * Register Third Party Styles
755 *
756 * @since 1.0.0
757 */
758 public function register_compatability_styles( $plugin_supports ) {
759 if ( !is_array( $plugin_supports ) ) {
760 $plugin_supports = [];
761 }
762 $plugin_dir = PXLBSADMINIFY_ASSETS . 'css/plugins/';
763 $plugin_files = list_files( PXLBSADMINIFY_PATH . 'assets/css/plugins/', 1 );
764 if ( !empty( $plugin_files ) ) {
765 foreach ( $plugin_files as $file ) {
766 $plugin_supports[wp_basename( $file, '.min.css' )] = $plugin_dir . wp_basename( $file );
767 }
768 }
769 return $plugin_supports;
770 }
771
772 /**
773 * Admin Enqueue Third Party Scripts/Styles
774 *
775 * @return void
776 */
777 public function enqueue_scripts() {
778 $plugin_supports = [];
779 $plugin_supports = apply_filters( 'pxlbsadminify_third_party_styles', $plugin_supports );
780 // Check Plugin Activated for Site Wide
781 if ( is_multisite() ) {
782 $active_plugins = get_site_option( 'active_sitewide_plugins' );
783 foreach ( $active_plugins as $active_path => $active_plugin ) {
784 if ( is_plugin_active_for_network( $active_path ) ) {
785 $string = explode( '/', $active_path );
786 $pluginname = $string[0];
787 if ( isset( $plugin_supports[$pluginname] ) ) {
788 if ( $plugin_supports[$pluginname] != '' ) {
789 wp_register_style(
790 'adminify_site-wide_' . $pluginname . '_css',
791 $plugin_supports[$pluginname],
792 [],
793 PXLBSADMINIFY_VER
794 );
795 wp_enqueue_style( 'adminify_site-wide_' . $pluginname . '_css' );
796 }
797 }
798 }
799 }
800 }
801 // Check Plugin Activated for Individual Sites
802 $activeplugins = get_option( 'active_plugins' );
803 foreach ( $activeplugins as $plugin ) {
804 if ( Utils::is_plugin_active( $plugin ) ) {
805 $string = explode( '/', $plugin );
806 $pluginname = $string[0];
807 if ( isset( $plugin_supports[$pluginname] ) ) {
808 if ( $plugin_supports[$pluginname] != '' ) {
809 wp_register_style(
810 'adminify_' . $pluginname . '_css',
811 $plugin_supports[$pluginname],
812 [],
813 PXLBSADMINIFY_VER
814 );
815 wp_enqueue_style( 'adminify_' . $pluginname . '_css' );
816 }
817 }
818 }
819 }
820 }
821
822 /**
823 * Inject layout-tightening CSS INTO the WP 6.3+/7.0 block editor iframe canvas.
824 *
825 * The Gutenberg canvas runs inside an iframe; styles enqueued via
826 * `enqueue_block_editor_assets` only reach the parent admin chrome. The
827 * `block_editor_settings_all` `styles` array IS injected into the iframe.
828 *
829 * The default Gutenberg post-title wrapper carries large block padding which,
830 * inside Adminify's iframe wrapper (already framed by topbar + sidebar),
831 * reads as a huge dead area between the editor toolbar and "Add title".
832 * Compress that wrapper + leading content padding so the title sits close
833 * under the toolbar.
834 */
835 public function block_editor_iframe_layout_tweaks( $settings ) {
836 // Iframe body padding (Gutenberg ~50-60px default) + root container's first-child
837 // margin-block-start are the two real sources of the gap above "Add title".
838 // Multiple selectors cover WP 6.x ("edit-post-*") and WP 7.0+ ("editor-*", new
839 // "block-editor-iframe__body" body class on the iframe) class renames.
840 $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;}';
841 if ( !isset( $settings['styles'] ) || !is_array( $settings['styles'] ) ) {
842 $settings['styles'] = array();
843 }
844 $settings['styles'][] = array(
845 'css' => $css,
846 );
847 return $settings;
848 }
849
850 }
851