admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('hvac_organizers_nonce') )); // Enqueue media uploader for logo upload if (is_page('trainer/organizer/manage')) { wp_enqueue_media(); } } } /** * Render organizers list */ public function render_organizers_list() { if (!is_user_logged_in()) { return '

You must be logged in to view this page.

'; } // Allow trainers, master trainers, or WordPress admins $user = wp_get_current_user(); if (!in_array('hvac_trainer', $user->roles) && !in_array('hvac_master_trainer', $user->roles) && !current_user_can('manage_options')) { return '

You must be a trainer to view this page.

'; } ob_start(); ?>

Training Organizers

Add New Organizer
render_breadcrumbs(); } ?> render_organizers_table(); ?>
class_exists('Tribe__Events__Main') ? Tribe__Events__Main::ORGANIZER_POST_TYPE : 'tribe_organizer', 'posts_per_page' => $per_page, 'offset' => $offset, 'orderby' => 'title', 'order' => 'ASC', 'post_status' => 'publish' ); // Master trainers can see all organizers, regular trainers only see their own $user = wp_get_current_user(); if (!in_array('hvac_master_trainer', $user->roles) && !current_user_can('manage_options')) { $query_args['author'] = $current_user_id; } // Filter handling $search = HVAC_Security_Helpers::get_input('GET', 'search', 'sanitize_text_field', ''); if (!empty($search)) { $query_args['s'] = $search; } // Get organizers $organizers_query = new WP_Query($query_args); // Get total count for pagination $total_organizers = $organizers_query->found_posts; $total_pages = ceil($total_organizers / $per_page); ?>
Clear
have_posts()) { while ($organizers_query->have_posts()) { $organizers_query->the_post(); $organizer_id = get_the_ID(); // Get organizer meta $phone = get_post_meta($organizer_id, '_OrganizerPhone', true); $email = get_post_meta($organizer_id, '_OrganizerEmail', true); $website = get_post_meta($organizer_id, '_OrganizerWebsite', true); // Get headquarters location $hq_city = get_post_meta($organizer_id, '_hvac_headquarters_city', true); $hq_state = get_post_meta($organizer_id, '_hvac_headquarters_state', true); $hq_country = get_post_meta($organizer_id, '_hvac_headquarters_country', true); $hq_parts = array_filter(array($hq_city, $hq_state, $hq_country)); $headquarters = implode(', ', $hq_parts); ?>
Logo Organization Name Headquarters Contact Website Actions

Visit Website Not specified Edit
No organizers found.
1): ?>
add_query_arg('paged', '%#%'), 'format' => '', 'current' => $page, 'total' => $total_pages, 'prev_text' => '« Previous', 'next_text' => 'Next »' )); ?>
You must be logged in to view this page.

'; } // Allow trainers, master trainers, or WordPress admins $user = wp_get_current_user(); if (!in_array('hvac_trainer', $user->roles) && !in_array('hvac_master_trainer', $user->roles) && !current_user_can('manage_options')) { return '

You must be a trainer to view this page.

'; } $organizer_id = HVAC_Security_Helpers::get_input('GET', 'organizer_id', 'absint', 0); $organizer = null; if ($organizer_id) { $organizer = get_post($organizer_id); // Check if user can edit this organizer if (!$organizer || $organizer->post_author != get_current_user_id()) { return '

You do not have permission to edit this organizer.

'; } } ob_start(); ?>

render_breadcrumbs(); } ?>

Organization Logo

Recommended size: 300x300px. Maximum file size: 2MB.

Organization Information

Headquarters Location

Contact Information

Cancel
post_author != get_current_user_id()) { wp_send_json_error('You do not have permission to edit this organizer.'); } } // Validate required fields $org_name = HVAC_Security_Helpers::get_input('POST', 'org_name', 'sanitize_text_field', ''); if (empty($org_name)) { wp_send_json_error('Organization name is required.'); } // Prepare organizer data with proper sanitization $organizer_data = array( 'Organizer' => $org_name, 'Description' => HVAC_Security_Helpers::get_input('POST', 'org_description', 'wp_kses_post', ''), 'Phone' => HVAC_Security_Helpers::get_input('POST', 'org_phone', 'sanitize_text_field', ''), 'Email' => HVAC_Security_Helpers::get_input('POST', 'org_email', 'sanitize_email', ''), 'Website' => HVAC_Security_Helpers::get_input('POST', 'org_website', 'esc_url_raw', '') ); if ($organizer_id) { $organizer_data['ID'] = $organizer_id; $result = function_exists('tribe_update_organizer') ? tribe_update_organizer($organizer_id, $organizer_data) : wp_update_post(array( 'ID' => $organizer_id, 'post_title' => $organizer_data['Organizer'], 'post_content' => $organizer_data['Description'] )); } else { $organizer_data['post_status'] = 'publish'; $organizer_data['post_author'] = get_current_user_id(); $result = function_exists('tribe_create_organizer') ? tribe_create_organizer($organizer_data) : wp_insert_post(array( 'post_type' => 'tribe_organizer', 'post_title' => $organizer_data['Organizer'], 'post_content' => $organizer_data['Description'], 'post_status' => 'publish', 'post_author' => get_current_user_id() )); } if (is_wp_error($result)) { wp_send_json_error($result->get_error_message()); } // Update custom meta fields $organizer_id = $organizer_id ?: $result; // Update headquarters data using security helpers $hq_city = HVAC_Security_Helpers::get_input('POST', 'hq_city', 'sanitize_text_field', ''); if (!empty($hq_city)) { update_post_meta($organizer_id, '_hvac_headquarters_city', $hq_city); } $hq_state = HVAC_Security_Helpers::get_input('POST', 'hq_state', 'sanitize_text_field', ''); if (!empty($hq_state)) { update_post_meta($organizer_id, '_hvac_headquarters_state', $hq_state); } $hq_country = HVAC_Security_Helpers::get_input('POST', 'hq_country', 'sanitize_text_field', ''); if (!empty($hq_country)) { update_post_meta($organizer_id, '_hvac_headquarters_country', $hq_country); } // Update phone, email, website meta using security helpers $org_phone = HVAC_Security_Helpers::get_input('POST', 'org_phone', 'sanitize_text_field', ''); if (!empty($org_phone)) { update_post_meta($organizer_id, '_OrganizerPhone', $org_phone); } $org_email = HVAC_Security_Helpers::get_input('POST', 'org_email', 'sanitize_email', ''); if (!empty($org_email)) { update_post_meta($organizer_id, '_OrganizerEmail', $org_email); } $org_website = HVAC_Security_Helpers::get_input('POST', 'org_website', 'esc_url_raw', ''); if (!empty($org_website)) { update_post_meta($organizer_id, '_OrganizerWebsite', $org_website); } // Handle logo $logo_id = HVAC_Security_Helpers::get_input('POST', 'org_logo_id', 'absint', 0); if ($logo_id) { if ($logo_id) { set_post_thumbnail($organizer_id, $logo_id); } else { delete_post_thumbnail($organizer_id); } } // Update user's organizer_id if this is their first organizer $user_organizer_id = get_user_meta(get_current_user_id(), 'organizer_id', true); if (!$user_organizer_id) { update_user_meta(get_current_user_id(), 'organizer_id', $organizer_id); } wp_send_json_success(array( 'message' => $organizer_id ? 'Organizer updated successfully.' : 'Organizer created successfully.', 'organizer_id' => $organizer_id )); } /** * AJAX handler for deleting organizer */ public function ajax_delete_organizer() { check_ajax_referer('hvac_organizers_nonce', 'nonce'); if (!HVAC_Security_Helpers::is_hvac_trainer() && !current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } $organizer_id = HVAC_Security_Helpers::get_input('POST', 'organizer_id', 'absint', 0); if (!$organizer_id) { wp_send_json_error('Invalid organizer ID'); } $organizer = get_post($organizer_id); if (!$organizer || $organizer->post_author != get_current_user_id()) { wp_send_json_error('You do not have permission to delete this organizer.'); } // Check if organizer is being used by any events $events_using_organizer = get_posts(array( 'post_type' => class_exists('Tribe__Events__Main') ? Tribe__Events__Main::POSTTYPE : 'tribe_events', 'meta_query' => array( array( 'key' => '_EventOrganizerID', 'value' => $organizer_id, 'compare' => '=' ) ), 'posts_per_page' => 1 )); if (!empty($events_using_organizer)) { wp_send_json_error('Cannot delete organizer. It is being used by one or more events.'); } $result = wp_trash_post($organizer_id); if ($result) { // If this was the user's primary organizer, clear it $user_organizer_id = get_user_meta(get_current_user_id(), 'organizer_id', true); if ($user_organizer_id == $organizer_id) { delete_user_meta(get_current_user_id(), 'organizer_id'); } wp_send_json_success('Organizer deleted successfully.'); } else { wp_send_json_error('Failed to delete organizer.'); } } /** * AJAX handler for uploading organization logo */ public function ajax_upload_org_logo() { check_ajax_referer('hvac_organizers_nonce', 'nonce'); $user = wp_get_current_user(); if (!in_array('hvac_trainer', $user->roles) && !in_array('hvac_master_trainer', $user->roles) && !current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } if (!isset($_FILES['org_logo']) || $_FILES['org_logo']['error'] !== UPLOAD_ERR_OK) { wp_send_json_error('No file uploaded or upload error occurred'); } // Validate file type $allowed_types = array('image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'); $file_type = wp_check_filetype($_FILES['org_logo']['name']); if (!in_array($file_type['type'], $allowed_types)) { wp_send_json_error('Invalid file type. Only JPG, PNG, GIF, and WebP images are allowed.'); } // Validate file size (5MB max) $max_size = 5 * 1024 * 1024; // 5MB in bytes if ($_FILES['org_logo']['size'] > $max_size) { wp_send_json_error('File too large. Maximum size is 5MB.'); } // Additional security check if (!is_uploaded_file($_FILES['org_logo']['tmp_name'])) { wp_send_json_error('Security error: Invalid file upload.'); } require_once(ABSPATH . 'wp-admin/includes/image.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); require_once(ABSPATH . 'wp-admin/includes/media.php'); $attachment_id = media_handle_upload('org_logo', 0); if (is_wp_error($attachment_id)) { wp_send_json_error($attachment_id->get_error_message()); } wp_send_json_success(array( 'attachment_id' => $attachment_id, 'url' => wp_get_attachment_image_url($attachment_id, 'medium') )); } }