init_components(); // Hook into WordPress $this->init_hooks(); // Load text domain for translations $this->load_textdomain(); } /** * Initialize plugin components * * @since 1.0.0 */ private function init_components() { // Manually require class files (since they don't follow exact autoloader pattern) require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-slides-cpt.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-rest-api.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-admin.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-frontend.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-notifications.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-api-client.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-slider.php'; require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-shortcode.php'; // Initialize slides custom post type $this->slides_cpt = new HSSM_Slides_CPT(); // Initialize REST API endpoints $this->rest_api = new HSSM_REST_API(); // Initialize admin functionality $this->admin = new HSSM_Admin(); // Initialize frontend functionality $this->frontend = new HSSM_Frontend(); // Initialize shortcode $this->shortcode = new HSSM_Shortcode(); // Initialize email notifications $this->email_notifications = new HSSM_Notifications(); } /** * Initialize WordPress hooks * * @since 1.0.0 */ private function init_hooks() { $plugin_mode = get_option( 'hssm_plugin_mode', 'manager' ); // Core WordPress hooks if ( 'manager' === $plugin_mode ) { add_action( 'init', array( $this, 'register_post_types' ) ); add_action( 'init', array( $this, 'register_taxonomies' ) ); add_action( 'rest_api_init', array( $this, 'register_rest_routes' ) ); } // Frontend hooks add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_frontend_assets' ), 20 ); add_action( 'template_redirect', array( $this, 'handle_frontend_pages' ) ); // Admin hooks add_action( 'admin_init', array( $this, 'admin_init' ) ); add_action( 'admin_menu', array( $this, 'add_admin_menus' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); // AJAX hooks for authenticated users // Note: Main AJAX handlers are in HSSM_Frontend class add_action( 'wp_ajax_hssm_send_preview_email', array( $this, 'ajax_send_preview_email' ) ); // Cron hooks for scheduled slides add_action( 'hssm_check_scheduled_slides', array( $this, 'check_scheduled_slides' ) ); } /** * Load plugin text domain * * @since 1.0.0 */ private function load_textdomain() { load_plugin_textdomain( 'hi-school-slide-manager', false, dirname( HSSM_PLUGIN_BASENAME ) . '/languages' ); } /** * Register custom post types * * @since 1.0.0 */ public function register_post_types() { if ( $this->slides_cpt ) { $this->slides_cpt->register(); } } /** * Register custom taxonomies * * @since 1.0.0 */ public function register_taxonomies() { if ( $this->slides_cpt ) { $this->slides_cpt->register_taxonomies(); } } /** * Register REST API routes * * @since 1.0.0 */ public function register_rest_routes() { if ( $this->rest_api ) { $this->rest_api->register_routes(); } } /** * Enqueue frontend assets * * @since 1.0.0 */ public function enqueue_frontend_assets() { // Prevent slider assets from loading on admin-facing "frontend" pages if ( is_page_template('page-slide-dashboard.php') || is_page_template('page-slide-preview.php') ) { // These pages will load their own specific styles (admin-slides-dashboard.css) or rely on explicit shortcode enqueueing. return; } // Enqueue slider assets globally so they are available for the shortcode on regular frontend pages wp_enqueue_style( 'hssm-slider', HSSM_PLUGIN_URL . 'assets/css/slider.css', array(), HSSM_VERSION ); wp_enqueue_script( 'hssm-slider', HSSM_PLUGIN_URL . 'assets/js/slider.js', array( 'jquery' ), HSSM_VERSION, true ); if ( $this->frontend ) { $this->frontend->enqueue_assets(); } } /** * Handle frontend page routing * * @since 1.0.0 */ public function handle_frontend_pages() { if ( $this->frontend ) { $this->frontend->handle_page_routing(); } } /** * Initialize admin functionality * * @since 1.0.0 */ public function admin_init() { if ( $this->admin ) { $this->admin->init(); } } /** * Add admin menus * * @since 1.0.0 */ public function add_admin_menus() { if ( $this->admin ) { $this->admin->add_menus(); } } /** * Enqueue admin assets * * @since 1.0.0 * @param string $hook Current admin page hook */ public function enqueue_admin_assets( $hook ) { if ( $this->admin ) { $this->admin->enqueue_assets( $hook ); } } /** * Get companion sites configuration * * Centralized source of truth for companion sites * * @since 1.0.0 * @return array List of companion sites */ public static function get_companion_sites() { return array( array( 'slug' => 'hi-school', 'name' => 'Hi-School Pharmacy', 'description' => 'Hi-School Pharmacy companion site' ), array( 'slug' => 'one-stop', 'name' => 'One Stop Hardware', 'description' => 'One Stop Hardware companion site' ), array( 'slug' => 'ace', 'name' => 'Ace Hardware', 'description' => 'Ace Hardware companion site' ) ); } /** * Check for scheduled slides that need to be activated/deactivated * * @since 1.0.0 */ public function check_scheduled_slides() { if ( $this->slides_cpt ) { $this->slides_cpt->check_scheduled_slides(); } } /** * Plugin activation * * @since 1.0.0 */ public static function activate() { // Create custom capability $roles = [ 'administrator', 'editor' ]; foreach ( $roles as $role_name ) { $role = get_role( $role_name ); if ( $role ) { $role->add_cap( 'hssm_manage_slides' ); } } // Set up cron jobs self::setup_cron_jobs(); // Flush rewrite rules flush_rewrite_rules(); // Set default options self::set_default_options(); // Create default taxonomy terms self::create_default_terms(); } /** * Plugin deactivation * * @since 1.0.0 */ public static function deactivate() { // Remove custom capability $roles = [ 'administrator', 'editor' ]; foreach ( $roles as $role_name ) { $role = get_role( $role_name ); if ( $role ) { $role->remove_cap( 'hssm_manage_slides' ); } } // Clear cron jobs wp_clear_scheduled_hook( 'hssm_check_scheduled_slides' ); // Flush rewrite rules flush_rewrite_rules(); } /** * Plugin uninstall * * @since 1.0.0 */ public static function uninstall() { // Remove plugin options self::remove_plugin_options(); // Remove user meta self::remove_user_meta(); // Remove taxonomy terms and slides self::remove_plugin_data(); } /** * Create default taxonomy terms for sites * * @since 1.0.0 */ private static function create_default_terms() { // Load the CPT class manually during activation require_once HSSM_PLUGIN_DIR . 'includes/class-hssm-slides-cpt.php'; // Create a temporary instance to set up default terms $slides_cpt = new HSSM_Slides_CPT(); // Register the taxonomies first $slides_cpt->register_taxonomies(); // Default terms are created automatically in the register_taxonomies method } /** * Setup cron jobs * * @since 1.0.0 */ private static function setup_cron_jobs() { if ( ! wp_next_scheduled( 'hssm_check_scheduled_slides' ) ) { wp_schedule_event( time(), 'hourly', 'hssm_check_scheduled_slides' ); } } /** * Set default plugin options * * @since 1.0.0 */ private static function set_default_options() { $default_options = array( 'hssm_plugin_mode' => 'manager', 'hssm_api_url' => '', 'hssm_client_site_slug' => '', 'hssm_notification_emails' => array( get_option( 'admin_email' ) ), 'hssm_default_slide_duration' => 30, // days 'hssm_cache_duration' => 3600, // 1 hour 'hssm_api_version' => 'v1', 'hssm_preview_page_slug' => 'slide-preview', 'hssm_manager_page_slug' => 'slide-manager', 'hssm_api_keys' => array( wp_generate_password( 32, false ) ), // Generate initial API key ); foreach ( $default_options as $option_name => $option_value ) { if ( ! get_option( $option_name ) ) { add_option( $option_name, $option_value ); } } } /** * Remove plugin options * * @since 1.0.0 */ private static function remove_plugin_options() { $options = array( 'hssm_plugin_mode', 'hssm_api_url', 'hssm_client_site_slug', 'hssm_notification_emails', 'hssm_default_slide_duration', 'hssm_cache_duration', 'hssm_api_version', 'hssm_preview_page_slug', 'hssm_manager_page_slug', 'hssm_api_keys', 'hssm_notification_settings', ); foreach ( $options as $option ) { delete_option( $option ); } } /** * Remove user meta * * @since 1.0.0 */ private static function remove_user_meta() { global $wpdb; $wpdb->delete( $wpdb->usermeta, array( 'meta_key' => 'hssm_user_preferences' ) ); } /** * Remove plugin data including slides and taxonomy terms * * @since 1.0.0 */ private static function remove_plugin_data() { // Get all slide posts $slides = get_posts( array( 'post_type' => 'hssm_slide', 'numberposts' => -1, 'post_status' => 'any' ) ); // Delete all slides foreach ( $slides as $slide ) { wp_delete_post( $slide->ID, true ); } // Remove taxonomy terms $taxonomies = array( 'hssm_site', 'hssm_client' ); foreach ( $taxonomies as $taxonomy ) { $terms = get_terms( array( 'taxonomy' => $taxonomy, 'hide_empty' => false, ) ); if ( ! is_wp_error( $terms ) ) { foreach ( $terms as $term ) { wp_delete_term( $term->term_id, $taxonomy ); } } } } }