PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 4.3.0
Adminify – White Label, Admin Menu Editor, Login Customizer v4.3.0
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 / class-wp-adminify.php

class-wp-adminify.php in Adminify – White Label, Admin Menu Editor, Login Customizer 4.3.0, at class-wp-adminify.php

281 lines 12.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace PXLBSAdminify;
4
5 use PXLBSAdminify\Libs\Featured;
6 use PXLBSAdminify\Inc\Admin\Admin;
7 use PXLBSAdminify\Inc\Classes\Assets;
8 use PXLBSAdminify\Inc\Classes\IconPicker_Assets;
9 use PXLBSAdminify\Inc\Classes\Upgrade;
10 use PXLBSAdminify\Inc\Classes\Feedback;
11 use PXLBSAdminify\Inc\Admin\AdminSettings;
12 use PXLBSAdminify\Inc\Classes\Pro_Upgrade;
13 use PXLBSAdminify\Inc\Classes\Addons_Plugins;
14 use PXLBSAdminify\Inc\Classes\GoogleFontsLocal;
15 use PXLBSAdminify\Inc\Classes\Notifications\Notifications;
16 // No, Direct access Sir !!!
17 if ( !defined( 'ABSPATH' ) ) {
18 exit;
19 }
20 if ( !class_exists( 'WP_Adminify' ) ) {
21 class WP_Adminify {
22 const VERSION = PXLBSADMINIFY_VER;
23
24 private static $instance = null;
25
26 private $was_active_before_update = false;
27
28 public function __construct() {
29 add_action( 'plugins_loaded', array($this, 'maybe_run_upgrades'), -100 );
30 // This should run earlier
31 add_action( 'plugins_loaded', array($this, 'maybe_loaded_addons'), -200 );
32 // add_action('plugins_loaded', array($this, 'pxlbsadminify_plugins_loaded'), 999);
33 add_filter( 'plugin_action_links_' . PXLBSADMINIFY_BASE, array($this, 'plugin_action_links') );
34 add_filter( 'network_admin_plugin_action_links_' . PXLBSADMINIFY_BASE, array($this, 'plugin_action_links') );
35 // Freemius drops this plugin from `active_plugins` when it updates itself.
36 add_filter(
37 'upgrader_pre_install',
38 array($this, 'pxlbsadminify_remember_active_state'),
39 1,
40 2
41 );
42 add_filter(
43 'upgrader_post_install',
44 array($this, 'pxlbsadminify_restore_active_state'),
45 20,
46 3
47 );
48 add_filter( 'admin_body_class', array($this, 'pxlbsadminify_body_class'), 99 );
49 // Load textdomain and include files on init for WP 6.7+ compatibility
50 // Textdomain must be loaded before files that use translations
51 // Priority order: 0=textdomain, 1=include files (registers options), 5=framework setup
52 add_action( 'init', array($this, 'pxlbsadminify_load_textdomain'), 0 );
53 add_action( 'init', array($this, 'pxlbsadminify_include_files'), 1 );
54 add_action( 'init', array($this, 'pxlbsadminify_is_plugin_row_meta'), 1 );
55 $is_finished = get_option( 'pxlbsadminify_setup_wizard_ran' );
56 if ( $is_finished !== '1' ) {
57 if ( apply_filters( 'pxlbsadminify_show_setup_wizard', true ) ) {
58 new \PXLBSAdminify\Inc\Classes\Wizard\Setup_Wizard();
59 set_transient( 'pxlbsadminify_activation_redirect', 1, 30 );
60 }
61 }
62 jltwp_adminify()->add_filter( 'pricing_url', [$this, 'pxlbsadminify_pricing_url'] );
63 }
64
65 /**
66 * Record whether this plugin was active when its own update starts.
67 *
68 * @param bool|\WP_Error $response Install response.
69 * @param array $hook_extra Extra arguments passed to hooked filters.
70 *
71 * @return bool|\WP_Error
72 */
73 public function pxlbsadminify_remember_active_state( $response, $hook_extra ) {
74 if ( !empty( $hook_extra['plugin'] ) && PXLBSADMINIFY_BASE === $hook_extra['plugin'] ) {
75 $this->was_active_before_update = in_array( PXLBSADMINIFY_BASE, (array) get_option( 'active_plugins', array() ), true );
76 }
77 return $response;
78 }
79
80 /**
81 * Put this plugin back into `active_plugins` after its own update.
82 *
83 * The Freemius SDK assumes the free and the premium build never run side by side,
84 * so FS_Plugin_Updater::_maybe_update_folder_name() rewrites our `active_plugins`
85 * entry to the premium basename once the free package is updated while Adminify Pro
86 * is installed - which silently deactivates this plugin. Both packages have to stay
87 * active here, so restore the entry the SDK removed.
88 *
89 * Network activations are unaffected: those live in `active_sitewide_plugins`, which
90 * the SDK handler never touches.
91 *
92 * @param bool|\WP_Error $response Install response.
93 * @param array $hook_extra Extra arguments passed to hooked filters.
94 * @param array $result Installation result data.
95 *
96 * @return bool|\WP_Error
97 */
98 public function pxlbsadminify_restore_active_state( $response, $hook_extra, $result ) {
99 if ( empty( $hook_extra['plugin'] ) || PXLBSADMINIFY_BASE !== $hook_extra['plugin'] || !$this->was_active_before_update ) {
100 return $response;
101 }
102 $active_plugins = (array) get_option( 'active_plugins', array() );
103 if ( !in_array( PXLBSADMINIFY_BASE, $active_plugins, true ) ) {
104 $active_plugins[] = PXLBSADMINIFY_BASE;
105 $active_plugins = array_values( array_unique( $active_plugins ) );
106 sort( $active_plugins );
107 update_option( 'active_plugins', $active_plugins );
108 }
109 return $response;
110 }
111
112 function pxlbsadminify_pricing_url( $pricing_url ) {
113 $pricing_url = 'https://wpadminify.com/pricing';
114 return $pricing_url;
115 }
116
117 public function pxlbsadminify_is_plugin_row_meta() {
118 add_filter(
119 'plugin_row_meta',
120 array($this, 'pxlbsadminify_plugin_row_meta'),
121 10,
122 2
123 );
124 add_filter(
125 'network_admin_plugin_row_meta',
126 array($this, 'pxlbsadminify_plugin_row_meta'),
127 10,
128 2
129 );
130 }
131
132 /**
133 * Add Body Class
134 */
135 public function pxlbsadminify_body_class( $classes ) {
136 $classes .= ' wp-adminify ';
137 $adminify_ui = AdminSettings::get_instance()->get( 'admin_ui' );
138 if ( !empty( $adminify_ui ) ) {
139 $classes .= ' adminify-ui';
140 }
141 if ( is_rtl() ) {
142 $classes .= ' adminify-rtl ';
143 }
144 return $classes;
145 }
146
147 /**
148 * Plugin action links
149 *
150 * @param array $links
151 *
152 * @return array
153 */
154 public function plugin_action_links( $links ) {
155 $links['settings'] = apply_filters( 'adminify_settings_link', sprintf( '<a class="adminify-plugin-settings" href="%1$s">%2$s</a>', admin_url( 'admin.php?page=wp-adminify-settings' ), __( 'Settings', 'adminify' ) ) );
156 $links['pricing'] = apply_filters( 'pxlbsadminify_upgrade_now_link', sprintf( '<a href="%1$s" class="adminify-upgrade-pro" target="_blank" style="color: orangered;font-weight: bold;">%2$s</a>', 'https://wpadminify.com/pricing', __( 'Upgrade Now', 'adminify' ) ) );
157 return apply_filters( 'adminify_plugin_row_links', $links );
158 }
159
160 public function pxlbsadminify_plugin_row_meta( $plugin_meta, $plugin_file ) {
161 if ( PXLBSADMINIFY_BASE === $plugin_file ) {
162 $row_meta = array(
163 'docs' => sprintf( '<a href="%1$s" target="_blank">%2$s</a>', esc_url_raw( 'https://wpadminify.com/docs/adminify/getting-started' ), __( 'Docs', 'adminify' ) ),
164 'changelogs' => sprintf( '<a href="%1$s" target="_blank">%2$s</a>', esc_url_raw( 'https://wpadminify.com/changelogs/' ), __( 'Changelogs', 'adminify' ) ),
165 'tutorials' => '<a href="https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8" aria-label="' . esc_attr( __( 'View Adminify Video Tutorials', 'adminify' ) ) . '" target="_blank">' . __( 'Video Tutorials', 'adminify' ) . '</a>',
166 );
167 $plugin_meta = array_merge( $plugin_meta, $row_meta );
168 }
169 return $plugin_meta;
170 }
171
172 public function pxlbsadminify_plugins_loaded() {
173 self::pxlbsadminify_activation_hook();
174 }
175
176 /**
177 * Addons Loaded Method
178 *
179 * @return void
180 */
181 public function maybe_loaded_addons() {
182 do_action( 'pxlbsadminify_plugin_loaded', WP_Adminify::get_instance() );
183 }
184
185 public function maybe_run_upgrades() {
186 if ( !is_admin() && !current_user_can( 'manage_options' ) ) {
187 return;
188 }
189 $upgrade = new Upgrade();
190 if ( $upgrade->if_updates_available() ) {
191 $upgrade->run_updates();
192 }
193 }
194
195 public function pxlbsadminify_include_files() {
196 new Assets();
197 new IconPicker_Assets();
198 new Admin();
199 new Featured();
200 new Feedback();
201 new Notifications();
202 new Pro_Upgrade();
203 new Addons_Plugins();
204 // Initialize Google Fonts Local early to catch option updates
205 GoogleFontsLocal::get_instance();
206 }
207
208 public function pxlbsadminify_init() {
209 // Backup for OLD Database
210 $current_version = get_option( 'pxlbsadminify_version' );
211 $is_backup = $old_data = get_option( 'pxlbsadminify_settings_backup' );
212 if ( version_compare( $current_version, PXLBSADMINIFY_VER, '<' ) && empty( $is_backup ) ) {
213 $old_data = get_option( 'pxlbsadminify_settings' );
214 update_option( 'pxlbsadminify_settings_backup', $old_data );
215 }
216 }
217
218 /**
219 * Loads the text domain for localization.
220 *
221 * This function sets up the text domain for the WP Adminify plugin,
222 * allowing it to load translation files for the specified locale.
223 * It first attempts to load a custom translation file from the WordPress
224 * languages directory and then loads the default translation file from
225 * the plugin's languages directory.
226 *
227 * @return void
228 */
229 public function pxlbsadminify_load_textdomain() {
230 $locale = apply_filters( 'plugin_locale', get_locale(), 'adminify' );
231 load_textdomain( 'adminify', WP_LANG_DIR . '/adminify/adminify-' . $locale . '.mo' );
232 // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- retained for non-hosted / older-WP installs.
233 load_plugin_textdomain( 'adminify', false, dirname( PXLBSADMINIFY_BASE ) . '/languages/' );
234 }
235
236 // Activation Hook
237 public static function pxlbsadminify_activation_hook() {
238 $current_adminify_version = get_option( 'pxlbsadminify_version', null );
239 if ( get_option( 'pxlbsadminify_activation_time' ) === false ) {
240 update_option( 'pxlbsadminify_activation_time', strtotime( 'now' ) );
241 }
242 if ( "dismissed" === get_option( 'pxlbsadminify_plugin_update_info_notice', true ) ) {
243 update_option( 'pxlbsadminify_plugin_update_info_notice', '' );
244 }
245 if ( is_null( $current_adminify_version ) ) {
246 update_option( 'pxlbsadminify_version', self::VERSION );
247 }
248 //database upgrade logic here
249 $old_data = get_option( 'pxlbsadminify_settings' );
250 update_option( 'pxlbsadminify_settings_backup', $old_data );
251 // Create term_order collumn in terms table, to support post type order
252 global $wpdb;
253 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- direct query required for one-time schema inspection on activation; not cached intentionally.
254 $check_term_order_column = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->terms} LIKE 'term_order'" );
255 if ( $check_term_order_column == 0 ) {
256 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange -- direct query required for one-time schema change on activation; not cached intentionally.
257 $wpdb->query( "ALTER TABLE {$wpdb->terms} ADD term_order INT( 4 ) NULL DEFAULT '0'" );
258 }
259 }
260
261 // Deactivation Hook
262 public static function pxlbsadminify_deactivation_hook() {
263 delete_option( 'pxlbsadminify_activation_time' );
264 delete_option( 'pxlbsadminify_customizer_flush_url' );
265 }
266
267 /**
268 * Returns the singleton instance of the class.
269 */
270 public static function get_instance() {
271 if ( !isset( self::$instance ) && !self::$instance instanceof WP_Adminify ) {
272 self::$instance = new WP_Adminify();
273 self::$instance->pxlbsadminify_init();
274 }
275 return self::$instance;
276 }
277
278 }
279
280 WP_Adminify::get_instance();
281 }