✅ Fixed the core issue - plugin now automatically creates pages on activation ## Changes Made - Updated HVAC_Announcements_Manager::activate() to create all required pages - Fixed duplicate method issue by removing instance methods - Added page creation to HVAC_Activator::activate() hook - Added deactivation cleanup to HVAC_Deactivator::deactivate() ## Pages Auto-Created - /master-trainer/manage-announcements/ (with [hvac_announcements_manager]) - /trainer/announcements/ (with [hvac_announcements_timeline]) - /trainer/training-resources/ (with Google Drive embed) ## Verification ✅ All pages now exist and load successfully ✅ Shortcodes are properly displayed ✅ Components are loading (timeline, iframe) ✅ No more manual page creation required Plugin activation now handles complete announcements system setup automatically. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
346 lines
No EOL
11 KiB
PHP
346 lines
No EOL
11 KiB
PHP
<?php
|
|
/**
|
|
* HVAC Announcements Manager
|
|
*
|
|
* @package HVAC_Community_Events
|
|
* @since 1.0.0
|
|
*/
|
|
|
|
if (!defined('ABSPATH')) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class HVAC_Announcements_Manager
|
|
*
|
|
* Main orchestrator for the announcements system
|
|
*/
|
|
class HVAC_Announcements_Manager {
|
|
|
|
/**
|
|
* Instance of this class
|
|
*
|
|
* @var HVAC_Announcements_Manager
|
|
*/
|
|
private static $instance = null;
|
|
|
|
/**
|
|
* Component instances
|
|
*
|
|
* @var array
|
|
*/
|
|
private $components = array();
|
|
|
|
/**
|
|
* Get instance of this class
|
|
*
|
|
* @return HVAC_Announcements_Manager
|
|
*/
|
|
public static function get_instance() {
|
|
if (null === self::$instance) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
private function __construct() {
|
|
$this->load_dependencies();
|
|
$this->init_components();
|
|
$this->init_hooks();
|
|
}
|
|
|
|
/**
|
|
* Load required files
|
|
*/
|
|
private function load_dependencies() {
|
|
$base_path = plugin_dir_path(dirname(__FILE__)) . 'includes/';
|
|
|
|
// Load component classes
|
|
require_once $base_path . 'class-hvac-announcements-cpt.php';
|
|
require_once $base_path . 'class-hvac-announcements-permissions.php';
|
|
require_once $base_path . 'class-hvac-announcements-ajax.php';
|
|
require_once $base_path . 'class-hvac-announcements-email.php';
|
|
require_once $base_path . 'class-hvac-announcements-display.php';
|
|
}
|
|
|
|
/**
|
|
* Initialize components
|
|
*/
|
|
private function init_components() {
|
|
$this->components['cpt'] = HVAC_Announcements_CPT::get_instance();
|
|
$this->components['permissions'] = HVAC_Announcements_Permissions::get_instance();
|
|
$this->components['ajax'] = HVAC_Announcements_Ajax::get_instance();
|
|
$this->components['email'] = HVAC_Announcements_Email::get_instance();
|
|
$this->components['display'] = HVAC_Announcements_Display::get_instance();
|
|
}
|
|
|
|
/**
|
|
* Initialize hooks
|
|
*/
|
|
private function init_hooks() {
|
|
// Activation/deactivation hooks
|
|
register_activation_hook(HVAC_PLUGIN_FILE, array($this, 'activate'));
|
|
register_deactivation_hook(HVAC_PLUGIN_FILE, array($this, 'deactivate'));
|
|
|
|
// Page creation
|
|
add_action('init', array($this, 'maybe_create_pages'), 20);
|
|
|
|
// Scripts and styles
|
|
add_action('wp_enqueue_scripts', array($this, 'enqueue_frontend_assets'));
|
|
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_assets'));
|
|
|
|
// Add to plugin's script management
|
|
add_filter('hvac_plugin_page_slugs', array($this, 'add_page_slugs'));
|
|
}
|
|
|
|
|
|
/**
|
|
* Create required pages
|
|
*/
|
|
private function create_pages() {
|
|
$pages = array(
|
|
array(
|
|
'title' => 'Manage Announcements',
|
|
'slug' => 'manage-announcements',
|
|
'parent_slug' => 'master-trainer',
|
|
'content' => '[hvac_announcements_manager]',
|
|
'template' => 'templates/page-master-manage-announcements.php',
|
|
'meta_key' => '_hvac_page_manage_announcements_created',
|
|
),
|
|
array(
|
|
'title' => 'Announcements',
|
|
'slug' => 'announcements',
|
|
'parent_slug' => 'trainer',
|
|
'content' => '[hvac_announcements_timeline]',
|
|
'template' => 'templates/page-trainer-announcements.php',
|
|
'meta_key' => '_hvac_page_trainer_announcements_created',
|
|
),
|
|
array(
|
|
'title' => 'Training Resources',
|
|
'slug' => 'training-resources',
|
|
'parent_slug' => 'trainer',
|
|
'content' => '[hvac_google_drive_embed url="https://drive.google.com/drive/folders/1-G8gICMsih5E9YJ2FqaC5OqG0o4rwuSP"]',
|
|
'template' => 'templates/page-trainer-training-resources.php',
|
|
'meta_key' => '_hvac_page_training_resources_created',
|
|
),
|
|
);
|
|
|
|
foreach ($pages as $page_data) {
|
|
// Check if page was already created
|
|
if (get_option($page_data['meta_key'])) {
|
|
continue;
|
|
}
|
|
|
|
// Find parent page
|
|
$parent_id = 0;
|
|
if (!empty($page_data['parent_slug'])) {
|
|
$parent_page = get_page_by_path($page_data['parent_slug']);
|
|
if ($parent_page) {
|
|
$parent_id = $parent_page->ID;
|
|
}
|
|
}
|
|
|
|
// Create page
|
|
$page_id = wp_insert_post(array(
|
|
'post_title' => $page_data['title'],
|
|
'post_name' => $page_data['slug'],
|
|
'post_content' => isset($page_data['content']) ? $page_data['content'] : '',
|
|
'post_status' => 'publish',
|
|
'post_type' => 'page',
|
|
'post_parent' => $parent_id,
|
|
'meta_input' => array(
|
|
'_wp_page_template' => $page_data['template'],
|
|
),
|
|
));
|
|
|
|
if (!is_wp_error($page_id)) {
|
|
update_option($page_data['meta_key'], $page_id);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Plugin activation hook
|
|
*/
|
|
public static function activate() {
|
|
$instance = self::get_instance();
|
|
|
|
// Create pages
|
|
$instance->create_pages();
|
|
|
|
// Add capabilities
|
|
if (class_exists('HVAC_Announcements_Permissions')) {
|
|
HVAC_Announcements_Permissions::add_capabilities();
|
|
}
|
|
|
|
// Flush rewrite rules
|
|
flush_rewrite_rules();
|
|
}
|
|
|
|
/**
|
|
* Plugin deactivation hook
|
|
*/
|
|
public static function deactivate() {
|
|
// Remove capabilities
|
|
if (class_exists('HVAC_Announcements_Permissions')) {
|
|
HVAC_Announcements_Permissions::remove_capabilities();
|
|
}
|
|
|
|
// Flush rewrite rules
|
|
flush_rewrite_rules();
|
|
}
|
|
|
|
/**
|
|
* Maybe create pages if they don't exist
|
|
*/
|
|
public function maybe_create_pages() {
|
|
// Check if pages exist
|
|
$manage_page = get_page_by_path('master-trainer/manage-announcements');
|
|
$announcements_page = get_page_by_path('trainer/announcements');
|
|
$resources_page = get_page_by_path('trainer/training-resources');
|
|
|
|
if (!$manage_page || !$announcements_page || !$resources_page) {
|
|
$this->create_pages();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add announcement page slugs to plugin pages list
|
|
*
|
|
* @param array $slugs Existing page slugs
|
|
* @return array
|
|
*/
|
|
public function add_page_slugs($slugs) {
|
|
$slugs[] = 'manage-announcements';
|
|
$slugs[] = 'announcements';
|
|
$slugs[] = 'training-resources';
|
|
return $slugs;
|
|
}
|
|
|
|
/**
|
|
* Enqueue frontend assets
|
|
*/
|
|
public function enqueue_frontend_assets() {
|
|
// Check if we're on a relevant page
|
|
if (!$this->is_announcement_page()) {
|
|
return;
|
|
}
|
|
|
|
// Enqueue styles
|
|
wp_enqueue_style(
|
|
'hvac-announcements',
|
|
plugin_dir_url(dirname(__FILE__)) . 'assets/css/hvac-announcements.css',
|
|
array(),
|
|
HVAC_VERSION
|
|
);
|
|
|
|
// Enqueue view script for trainer resources page
|
|
if (is_page('trainer-resources') || strpos(home_url($GLOBALS['wp']->request), '/trainer/resources') !== false) {
|
|
wp_enqueue_script(
|
|
'hvac-announcements-view',
|
|
plugin_dir_url(dirname(__FILE__)) . 'assets/js/hvac-announcements-view.js',
|
|
array('jquery'),
|
|
HVAC_VERSION,
|
|
true
|
|
);
|
|
|
|
// Localize script for viewing
|
|
wp_localize_script('hvac-announcements-view', 'hvac_ajax', array(
|
|
'ajax_url' => admin_url('admin-ajax.php'),
|
|
'nonce' => wp_create_nonce('hvac_announcements_nonce'),
|
|
));
|
|
}
|
|
|
|
// Enqueue scripts for master announcements page
|
|
if (is_page('master-announcements')) {
|
|
wp_enqueue_script(
|
|
'hvac-announcements-admin',
|
|
plugin_dir_url(dirname(__FILE__)) . 'assets/js/hvac-announcements-admin.js',
|
|
array('jquery', 'wp-util'),
|
|
HVAC_VERSION,
|
|
true
|
|
);
|
|
|
|
// Add TinyMCE
|
|
wp_enqueue_editor();
|
|
|
|
// Add media uploader
|
|
wp_enqueue_media();
|
|
|
|
// Localize script
|
|
wp_localize_script('hvac-announcements-admin', 'hvac_announcements', array(
|
|
'ajax_url' => admin_url('admin-ajax.php'),
|
|
'nonce' => wp_create_nonce('hvac_announcements_nonce'),
|
|
'strings' => array(
|
|
'confirm_delete' => __('Are you sure you want to delete this announcement?', 'hvac'),
|
|
'error_loading' => __('Error loading announcements', 'hvac'),
|
|
'error_saving' => __('Error saving announcement', 'hvac'),
|
|
'success_created' => __('Announcement created successfully', 'hvac'),
|
|
'success_updated' => __('Announcement updated successfully', 'hvac'),
|
|
'success_deleted' => __('Announcement deleted successfully', 'hvac'),
|
|
),
|
|
));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enqueue admin assets
|
|
*/
|
|
public function enqueue_admin_assets($hook) {
|
|
// Only load on our custom pages
|
|
if (!$this->is_announcement_page()) {
|
|
return;
|
|
}
|
|
|
|
// Admin styles
|
|
wp_enqueue_style(
|
|
'hvac-announcements-admin',
|
|
plugin_dir_url(dirname(__FILE__)) . 'assets/css/hvac-announcements-admin.css',
|
|
array(),
|
|
HVAC_VERSION
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Check if current page is an announcement-related page
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_announcement_page() {
|
|
if (is_page('master-announcements') || is_page('trainer-resources')) {
|
|
return true;
|
|
}
|
|
|
|
// Check for hierarchical URLs
|
|
global $wp;
|
|
$current_url = home_url($wp->request);
|
|
|
|
if (strpos($current_url, '/master-trainer/announcements') !== false ||
|
|
strpos($current_url, '/trainer/resources') !== false) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get component instance
|
|
*
|
|
* @param string $component Component name
|
|
* @return object|null
|
|
*/
|
|
public function get_component($component) {
|
|
return isset($this->components[$component]) ? $this->components[$component] : null;
|
|
}
|
|
|
|
/**
|
|
* Initialize the announcements system
|
|
* Called from main plugin file
|
|
*/
|
|
public static function init() {
|
|
return self::get_instance();
|
|
}
|
|
} |