add_filter( 'pricing_url', [$this, 'pxlbsadminify_pricing_url'] ); } /** * Record whether this plugin was active when its own update starts. * * @param bool|\WP_Error $response Install response. * @param array $hook_extra Extra arguments passed to hooked filters. * * @return bool|\WP_Error */ public function pxlbsadminify_remember_active_state( $response, $hook_extra ) { if ( !empty( $hook_extra['plugin'] ) && PXLBSADMINIFY_BASE === $hook_extra['plugin'] ) { $this->was_active_before_update = in_array( PXLBSADMINIFY_BASE, (array) get_option( 'active_plugins', array() ), true ); } return $response; } /** * Put this plugin back into `active_plugins` after its own update. * * The Freemius SDK assumes the free and the premium build never run side by side, * so FS_Plugin_Updater::_maybe_update_folder_name() rewrites our `active_plugins` * entry to the premium basename once the free package is updated while Adminify Pro * is installed - which silently deactivates this plugin. Both packages have to stay * active here, so restore the entry the SDK removed. * * Network activations are unaffected: those live in `active_sitewide_plugins`, which * the SDK handler never touches. * * @param bool|\WP_Error $response Install response. * @param array $hook_extra Extra arguments passed to hooked filters. * @param array $result Installation result data. * * @return bool|\WP_Error */ public function pxlbsadminify_restore_active_state( $response, $hook_extra, $result ) { if ( empty( $hook_extra['plugin'] ) || PXLBSADMINIFY_BASE !== $hook_extra['plugin'] || !$this->was_active_before_update ) { return $response; } $active_plugins = (array) get_option( 'active_plugins', array() ); if ( !in_array( PXLBSADMINIFY_BASE, $active_plugins, true ) ) { $active_plugins[] = PXLBSADMINIFY_BASE; $active_plugins = array_values( array_unique( $active_plugins ) ); sort( $active_plugins ); update_option( 'active_plugins', $active_plugins ); } return $response; } function pxlbsadminify_pricing_url( $pricing_url ) { $pricing_url = 'https://wpadminify.com/pricing'; return $pricing_url; } public function pxlbsadminify_is_plugin_row_meta() { add_filter( 'plugin_row_meta', array($this, 'pxlbsadminify_plugin_row_meta'), 10, 2 ); add_filter( 'network_admin_plugin_row_meta', array($this, 'pxlbsadminify_plugin_row_meta'), 10, 2 ); } /** * Add Body Class */ public function pxlbsadminify_body_class( $classes ) { $classes .= ' wp-adminify '; $adminify_ui = AdminSettings::get_instance()->get( 'admin_ui' ); if ( !empty( $adminify_ui ) ) { $classes .= ' adminify-ui'; } if ( is_rtl() ) { $classes .= ' adminify-rtl '; } return $classes; } /** * Plugin action links * * @param array $links * * @return array */ public function plugin_action_links( $links ) { $links['settings'] = apply_filters( 'adminify_settings_link', sprintf( '%2$s', admin_url( 'admin.php?page=wp-adminify-settings' ), __( 'Settings', 'adminify' ) ) ); $links['pricing'] = apply_filters( 'pxlbsadminify_upgrade_now_link', sprintf( '%2$s', 'https://wpadminify.com/pricing', __( 'Upgrade Now', 'adminify' ) ) ); return apply_filters( 'adminify_plugin_row_links', $links ); } public function pxlbsadminify_plugin_row_meta( $plugin_meta, $plugin_file ) { if ( PXLBSADMINIFY_BASE === $plugin_file ) { $row_meta = array( 'docs' => sprintf( '%2$s', esc_url_raw( 'https://wpadminify.com/docs/adminify/getting-started' ), __( 'Docs', 'adminify' ) ), 'changelogs' => sprintf( '%2$s', esc_url_raw( 'https://wpadminify.com/changelogs/' ), __( 'Changelogs', 'adminify' ) ), 'tutorials' => '' . __( 'Video Tutorials', 'adminify' ) . '', ); $plugin_meta = array_merge( $plugin_meta, $row_meta ); } return $plugin_meta; } public function pxlbsadminify_plugins_loaded() { self::pxlbsadminify_activation_hook(); } /** * Addons Loaded Method * * @return void */ public function maybe_loaded_addons() { do_action( 'pxlbsadminify_plugin_loaded', WP_Adminify::get_instance() ); } public function maybe_run_upgrades() { if ( !is_admin() && !current_user_can( 'manage_options' ) ) { return; } $upgrade = new Upgrade(); if ( $upgrade->if_updates_available() ) { $upgrade->run_updates(); } } public function pxlbsadminify_include_files() { new Assets(); new IconPicker_Assets(); new Admin(); new Featured(); new Feedback(); new Notifications(); new Pro_Upgrade(); new Addons_Plugins(); // Initialize Google Fonts Local early to catch option updates GoogleFontsLocal::get_instance(); } public function pxlbsadminify_init() { // Backup for OLD Database $current_version = get_option( 'pxlbsadminify_version' ); $is_backup = $old_data = get_option( 'pxlbsadminify_settings_backup' ); if ( version_compare( $current_version, PXLBSADMINIFY_VER, '<' ) && empty( $is_backup ) ) { $old_data = get_option( 'pxlbsadminify_settings' ); update_option( 'pxlbsadminify_settings_backup', $old_data ); } } /** * Loads the text domain for localization. * * This function sets up the text domain for the WP Adminify plugin, * allowing it to load translation files for the specified locale. * It first attempts to load a custom translation file from the WordPress * languages directory and then loads the default translation file from * the plugin's languages directory. * * @return void */ public function pxlbsadminify_load_textdomain() { $locale = apply_filters( 'plugin_locale', get_locale(), 'adminify' ); load_textdomain( 'adminify', WP_LANG_DIR . '/adminify/adminify-' . $locale . '.mo' ); // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- retained for non-hosted / older-WP installs. load_plugin_textdomain( 'adminify', false, dirname( PXLBSADMINIFY_BASE ) . '/languages/' ); } // Activation Hook public static function pxlbsadminify_activation_hook() { $current_adminify_version = get_option( 'pxlbsadminify_version', null ); if ( get_option( 'pxlbsadminify_activation_time' ) === false ) { update_option( 'pxlbsadminify_activation_time', strtotime( 'now' ) ); } if ( "dismissed" === get_option( 'pxlbsadminify_plugin_update_info_notice', true ) ) { update_option( 'pxlbsadminify_plugin_update_info_notice', '' ); } if ( is_null( $current_adminify_version ) ) { update_option( 'pxlbsadminify_version', self::VERSION ); } //database upgrade logic here $old_data = get_option( 'pxlbsadminify_settings' ); update_option( 'pxlbsadminify_settings_backup', $old_data ); // Create term_order collumn in terms table, to support post type order global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- direct query required for one-time schema inspection on activation; not cached intentionally. $check_term_order_column = $wpdb->query( "SHOW COLUMNS FROM {$wpdb->terms} LIKE 'term_order'" ); if ( $check_term_order_column == 0 ) { // 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. $wpdb->query( "ALTER TABLE {$wpdb->terms} ADD term_order INT( 4 ) NULL DEFAULT '0'" ); } } // Deactivation Hook public static function pxlbsadminify_deactivation_hook() { delete_option( 'pxlbsadminify_activation_time' ); delete_option( 'pxlbsadminify_customizer_flush_url' ); } /** * Returns the singleton instance of the class. */ public static function get_instance() { if ( !isset( self::$instance ) && !self::$instance instanceof WP_Adminify ) { self::$instance = new WP_Adminify(); self::$instance->pxlbsadminify_init(); } return self::$instance; } } WP_Adminify::get_instance(); }