'); // Add top-level menu with custom SVG icon $menu_slug = 'patternswp-plugin-menu'; add_menu_page( 'PatternsWP', 'PatternsWP', 'manage_options', $menu_slug, array($this, 'render_main_page'), $custom_icon, 60 ); // Add subpages $this->add_subpage($menu_slug, 'Dashboard', 'Dashboard', 'patternswp-plugin-menu', array($this, 'render_main_page')); $this->add_subpage($menu_slug, 'Support', 'Support', 'patternswp-plugin-page-1', array($this, 'patternswp_support')); $this->add_subpage($menu_slug, 'Clear Cache', 'Clear Cache', 'patternswp-clear-cache', array($this, 'patternswp_clear_cache_form')); } /** * Add subpage */ private function add_subpage($parent_slug, $page_title, $menu_title, $menu_slug, $callback) { // Add subpage add_submenu_page($parent_slug, $page_title, $menu_title, 'manage_options', $menu_slug, $callback); } /** * Render tabs */ public function patterswp_tab( $tab ) { $tabs = array( 'Dashboard' => 'patternswp-plugin-menu', 'Support' => 'patternswp-plugin-page-1', 'Clear Cache' => 'patternswp-clear-cache', 'License' => 'patternswp-license_section' ); foreach ($tabs as $name => $slug) { $class = ( $tab === $name ) ? 'nav-tab-active' : ''; echo '' . esc_html($name) . ''; } } /** * Render main page */ public function render_main_page() { ?>

display_name . ' 👋'); ?>

'; ?>

'; ?>

'; ?>

'.esc_attr('contact us via the support form →', 'patternswp').'' ); ?>

get_col($wpdb->prepare("SELECT option_name FROM $wpdb->options WHERE option_name LIKE %s", $wpdb->esc_like($pattern) . '%')); // Delete all patterns cache $patterns = 'patterns_cache_'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE option_name LIKE %s", $wpdb->esc_like($patterns) . '%' ) ); foreach ($results as $transient) { delete_option($transient); delete_option(str_replace('_transient_', '_transient_timeout_', $transient)); } //load patterns in background $this->patternswp_load_patterns_by_remote_ajax(); wp_redirect(add_query_arg(array( 'page' => 'patternswp-clear-cache', 'pt_msg' => urlencode('Clear Cache Successfully'), 'status' => 'success' ), admin_url('admin.php'))); exit; } } /** * Ensure hourly cron job is scheduled */ public function patternswp_ensure_hourly_cron() { if ( ! wp_next_scheduled( 'patternswp_hourly_transient_load' ) ) { wp_schedule_event( time(), 'hourly', 'patternswp_hourly_transient_load' ); } } /** * AJAX handler to load transient data */ public function patternswp_background_transient_load_ajaxcc() { do_action( 'patternswp_hourly_transient_load' ); wp_die(); } /** * Load patterns via AJAX */ public function patternswp_load_patterns_by_remote_ajax() { $ajax_url = admin_url('admin-ajax.php'); wp_remote_post( $ajax_url , array( 'body' => array( 'action' => 'patternswp_background_transient_load_ajax' ), 'timeout' => 1, 'blocking' => false, 'sslverify' => false, )); } /** * Set transient on plugin activation */ public function patternswp_on_activation() { set_transient('patternswp_activation_redirect', true, 30); } /** * Redirect to welcome page after activation */ public function patternswp_redirect_on_activation() { if (get_transient('patternswp_activation_redirect')) { delete_transient('patternswp_activation_redirect'); if (!is_network_admin() && !isset($_GET['activate-multi'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Safe usage: only checking if 'activate-multi' is set wp_safe_redirect(admin_url('admin.php?page=patternswp-plugin-menu')); exit; } } } } new PatternsWP_Admin();