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 if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !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 if (!current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { $query_args['author'] = $current_user_id; } // Filter handling if (!empty($_GET['search'])) { $query_args['s'] = sanitize_text_field($_GET['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 if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { return '

You must be a trainer to view this page.

'; } $organizer_id = isset($_GET['organizer_id']) ? intval($_GET['organizer_id']) : 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.'); } } // Prepare organizer data $organizer_data = array( 'Organizer' => sanitize_text_field($_POST['org_name']), 'Description' => wp_kses_post($_POST['org_description']), 'Phone' => sanitize_text_field($_POST['org_phone']), 'Email' => sanitize_email($_POST['org_email']), 'Website' => esc_url_raw($_POST['org_website']) ); 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_post_meta($organizer_id, '_hvac_headquarters_city', sanitize_text_field($_POST['hq_city'])); update_post_meta($organizer_id, '_hvac_headquarters_state', sanitize_text_field($_POST['hq_state'])); update_post_meta($organizer_id, '_hvac_headquarters_country', sanitize_text_field($_POST['hq_country'])); // Update phone, email, website meta update_post_meta($organizer_id, '_OrganizerPhone', sanitize_text_field($_POST['org_phone'])); update_post_meta($organizer_id, '_OrganizerEmail', sanitize_email($_POST['org_email'])); update_post_meta($organizer_id, '_OrganizerWebsite', esc_url_raw($_POST['org_website'])); // Handle logo if (isset($_POST['org_logo_id'])) { $logo_id = intval($_POST['org_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 (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } $organizer_id = isset($_POST['organizer_id']) ? intval($_POST['organizer_id']) : 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'); if (!current_user_can('hvac_trainer') && !current_user_can('hvac_master_trainer') && !current_user_can('manage_options')) { wp_send_json_error('Unauthorized'); } if (!isset($_FILES['org_logo'])) { wp_send_json_error('No file uploaded'); } 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') )); } }