/** * Moves tickets to a new ticket type. * * The target ticket type *must* belong to the same provider as the tickets being * moved (ie, you cannot move RSVP tickets to a WooCommerce ticket type, nor can * a mix of RSVP and WooCommerce tickets be moved to a new ticket type). * * @param array $ticket_ids * @param int $tgt_ticket_type_id * @param int $src_event_id * @param int $tgt_event_id * * @return int number of successfully moved tickets (zero upon failure to move any) */ public function move_tickets(array $ticket_ids, $tgt_ticket_type_id, $src_event_id, $tgt_event_id) { $ticket_ids = array_map('intval', $ticket_ids); $instigator_id = get_current_user_id(); $ticket_type = Tribe__Tickets__Tickets::load_ticket_object($tgt_ticket_type_id); $successful_moves = 0; if (!$ticket_type) { return 0; } $ticket_objects = array(); $providers = array(); foreach (Tribe__Tickets__Tickets::get_event_attendees($src_event_id) as $issued_ticket) { if (in_array(absint($issued_ticket['attendee_id']), $ticket_ids)) { $ticket_objects[] = $issued_ticket; $providers[$issued_ticket['provider']] = true; } } // We expect to have found as many tickets as were specified if (count($ticket_objects) !== count($ticket_ids)) { return 0; } // Check that the tickets are homogenous in relation to the ticket provider if (1 !== count($providers)) { return 0; } $provider_class = key($providers); $ticket_type_key = constant($provider_class . '::ATTENDEE_PRODUCT_KEY'); $ticket_event_key = constant($provider_class . '::ATTENDEE_EVENT_KEY'); if (empty($ticket_type_key) || empty($ticket_event_key)) { return 0; } foreach ($ticket_objects as $single_ticket) { $ticket_id = $single_ticket['attendee_id']; $src_ticket_type_id = get_post_meta($ticket_id, $ticket_type_key, true); /** * Fires immediately before a ticket is moved. * * @param int $ticket_type_id * @param int $tgt_ticket_type_id * @param int $tgt_event_id * @param int $instigator_id */ do_action('tribe_tickets_ticket_before_move', $ticket_id, $tgt_ticket_type_id, $tgt_event_id, $instigator_id); update_post_meta($ticket_id, $ticket_type_key, $tgt_ticket_type_id); update_post_meta($ticket_id, $ticket_event_key, $tgt_event_id); $history_message = sprintf(__('This ticket was moved to %1$s %2$s from %3$s %4$s', 'event-tickets'), '<a href="' . esc_url(get_the_permalink($tgt_event_id)) . '" target="_blank">' . get_the_title($tgt_event_id) . '</a>', '<a href="' . esc_url(get_the_permalink($tgt_ticket_type_id)) . '" target="_blank">(' . get_the_title($tgt_ticket_type_id) . ')</a>', '<a href="' . esc_url(get_the_permalink($src_event_id)) . '" target="_blank">' . get_the_title($src_event_id) . '</a>', '<a href="' . esc_url(get_the_permalink($src_ticket_type_id)) . '" target="_blank">(' . get_the_title($src_ticket_type_id) . ')</a>'); $history_data = array('ticket_ids' => $ticket_ids, 'src_event_id' => $src_event_id, 'tgt_event_id' => $tgt_event_id, 'tgt_ticket_type_id' => $tgt_ticket_type_id); Tribe__Post_History::load($ticket_id)->add_entry($history_message, $history_data); /** * Fires when a ticket is relocated from ticket type to another, which may be in * a different post altogether. * * @param int $ticket_id the ticket which has been moved * @param int $src_ticket_type_id the ticket type it belonged to originally * @param int $tgt_ticket_type_id the ticket type it now belongs to * @param int $src_event_id the event/post which the ticket originally belonged to * @param int $tgt_event_id the event/post which the ticket now belongs to * @param int $instigator_id the user who initiated the change */ do_action('tribe_tickets_ticket_moved', $ticket_id, $src_ticket_type_id, $tgt_ticket_type_id, $src_event_id, $tgt_event_id, $instigator_id); $successful_moves++; } /** * Fires when all of the specified ticket IDs have been moved * * @param array $ticket_ids each ticket ID * @param int $tgt_ticket_type_id the ticket type they were moved to * @param int $src_event_id the event they belonged to prior to the move * @param int $tgt_event_id the event they belong to after the move */ do_action('tribe_tickets_all_tickets_moved', $ticket_ids, $tgt_ticket_type_id, $src_event_id, $tgt_event_id); return $successful_moves; }