Tribe__Events__Aggregator__Record__Abstract::insert_posts( array $items = array() )

Inserts events, venues, and organizers for the Import Record


Parameters

$items

(array) (Optional) Dummy data var to allow children to optionally react to passed in data.

Default value: array()


Top ↑

Return

(Tribe__Events__Aggregator__Record__Activity) The import activity record.


Top ↑

Source

File: src/Tribe/Aggregator/Record/Abstract.php

	public function insert_posts( $items = array() ) {
		add_filter( 'tribe-post-origin', array( Tribe__Events__Aggregator__Records::instance(), 'filter_post_origin' ), 10 );

		/**
		 * Fires before events and linked posts are inserted in the database.
		 *
		 * @since 4.5.13
		 *
		 * @param array $items An array of items to insert.
		 * @param array $meta  The record meta information.
		 */
		do_action( 'tribe_aggregator_before_insert_posts', $items, $this->meta );

		// sets the default user ID to that of the first user that can edit events
		$default_user_id = $this->get_default_user_id();

		// Creates an Activity to log what Happened
		$activity = new Tribe__Events__Aggregator__Record__Activity();
		$initial_created_events = $activity->count( Tribe__Events__Main::POSTTYPE );
		$expected_created_events = $initial_created_events + count( $items );

		$args = array(
			'post_status' => 'draft',
		);

		if ( ! empty( $this->meta['post_status'] ) && 'do_not_override' !== $this->meta['post_status'] ) {
			$args['post_status'] = $this->meta['post_status'];
		}

		$unique_field = $this->get_unique_field();
		$existing_ids = $this->get_existing_ids_from_import_data( $items );

		// cache
		$possible_parents = array();
		$found_organizers = array();
		$found_venues     = array();

		$origin                   = $this->meta['origin'];
		$show_map_setting         = tribe_is_truthy( tribe( 'events-aggregator.settings' )->default_map( $origin ) );
		$update_authority_setting = tribe( 'events-aggregator.settings' )->default_update_authority( $origin );

		$import_settings = tribe( 'events-aggregator.settings' )->default_settings_import( $origin );
		$should_import_settings = tribe_is_truthy( $import_settings ) ? true : false;

		/**
		 * When an event/venue/organizer is being updated/inserted in the context of an import then any change
		 * should not be tracked as if made by the user. So doing would result results in posts
		 * "locked", under the "Import events but preserve local changes to event fields" event
		 * authority, after an update/insertion.
		 */
		add_filter( 'tribe_tracker_enabled', '__return_false' );

		foreach ( $items as $item ) {
			$event = Tribe__Events__Aggregator__Event::translate_service_data( $item );

			// Configure the Post Type (enforcing)
			$event['post_type'] = Tribe__Events__Main::POSTTYPE;

			// Set the event ID if it can be set
			if (
				$this->origin !== 'url'
				&& $unique_field
				&& isset( $event[ $unique_field['target'] ] )
				&& isset( $existing_ids[ $event[ $unique_field['target'] ] ] )
			) {
				$event_post_id = $existing_ids[ $event[ $unique_field['target'] ] ]->post_id;
				if ( tribe_is_event( $event_post_id ) ) {
					$event['ID'] = $event_post_id;
				}
			}

			// Checks if we need to search for Global ID
			if ( ! empty( $item->global_id ) ) {
				$global_event = Tribe__Events__Aggregator__Event::get_post_by_meta( 'global_id', $item->global_id );

				// If we found something we will only update that Post
				if ( $global_event ) {
					$event['ID'] = $global_event->ID;
				}
			}

			// Only set the post status if there isn't an ID
			if ( empty( $event['ID'] ) ) {

				$event['post_status'] = Tribe__Utils__Array::get( $args, 'post_status', $this->meta['post_status'] );

				/**
				 * Allows services to provide their own filtering of event post statuses before import, especially
				 * to handle the (do not override) status.
				 *
				 * @since 4.8.2
				 *
				 * @param string $post_status The event's post status before being filtered.
				 * @param array $event The WP event data about to imported and saved to the DB.
				 * @param Tribe__Events__Aggregator__Record__Abstract $record The import's EA Import Record.
				 */
				$event['post_status'] = apply_filters( 'tribe_aggregator_new_event_post_status_before_import', $event['post_status'], $event, $this );
			}

			/**
			 * Should events that have previously been imported be overwritten?
			 *
			 * By default this is turned off (since it would reset the post status, description
			 * and any other fields that have subsequently been edited) but it can be enabled
			 * by returning true on this filter.
			 *
			 * @var bool $overwrite
			 * @var int  $event_id
			 */
			if ( ! empty( $event['ID'] ) && 'retain' === $update_authority_setting ) {
				// Log this Event was Skipped
				$activity->add( 'event', 'skipped', $event['ID'] );
				continue;
			}

			if ( $show_map_setting ) {
				$event['EventShowMap'] = $show_map_setting || (bool) isset( $event['show_map'] );

				if ( $this->has_import_policy_for( $origin, 'show_map_link' ) ) {
					$event['EventShowMapLink'] = isset( $event['show_map_link'] ) ? (bool) $event['show_map_link'] : $show_map_setting;
				} else {
					$event['EventShowMapLink'] = $show_map_setting;
				}
			}

			unset( $event['show_map'], $event['show_map_link'] );

			if ( $should_import_settings && isset( $event['hide_from_listings'] ) ) {
				if ( $event['hide_from_listings'] == true ) {
					$event['EventHideFromUpcoming'] = 'yes';
				}
				unset( $event['hide_from_listings'] );
			}

			if ( $should_import_settings && isset( $event['sticky'] ) ) {
				if ( $event['sticky'] == true ) {
					$event['EventShowInCalendar'] = 'yes';
					$event['menu_order']          = - 1;
				}
				unset( $event['sticky'] );
			}

			if ( ! $should_import_settings ) {
				unset( $event['feature_event'] );
			}

			// set the parent
			if ( ! empty( $event['ID'] ) && ( $id = wp_get_post_parent_id( $event['ID'] ) ) ) {
				$event['post_parent'] = $id;
			} elseif ( ! empty( $event['parent_uid'] ) && ( $k = array_search( $event['parent_uid'], $possible_parents ) ) ) {
				$event['post_parent'] = $k;
			}

			// Do we have an existing venue for this event that we should preserve?
			// @todo review: should we care about the potential for multiple venue IDs?
			if (
				! empty( $event['ID'] )
				&& 'preserve_changes' === $update_authority_setting
				&& $existing_venue_id = tribe_get_venue_id( $event['ID'] )
			) {
				$event['EventVenueID'] = $existing_venue_id;
				unset( $event['Venue'] );
			}

			// if we should create a venue or use existing
			if ( ! empty( $event['Venue']['Venue'] ) ) {
				$event['Venue']['Venue'] = trim( $event['Venue']['Venue'] );

				if ( ! empty( $item->venue->global_id ) || in_array( $this->origin, array( 'ics', 'csv', 'gcal', 'ical' ) ) ) {
					// Pre-set for ICS based imports
					$venue = false;
					if ( ! empty( $item->venue->global_id ) ) {
						// Did we find a Post with a matching Global ID in History
						$venue = Tribe__Events__Aggregator__Event::get_post_by_meta( 'global_id_lineage', $item->venue->global_id );
					}

					// Save the Venue Data for Updating
					$venue_data = $event['Venue'];

					if ( isset( $item->venue->description ) ) {
						$venue_data['Description'] = $item->venue->description;
					}

					if ( isset( $item->venue->excerpt ) ) {
						$venue_data['Excerpt'] = $item->venue->excerpt;
					}

					if ( isset( $item->venue->image ) ) {
						$venue_data['FeaturedImage'] = $item->venue->image;
					}

					if ( $venue ) {
						$venue_id = $event['EventVenueID'] = $venue_data['ID'] = $venue->ID;
						$found_venues[ $venue->ID ] = $event['Venue']['Venue'];

						// Here we might need to update the Venue depending on the main GlobalID
						if ( 'retain' === $update_authority_setting ) {
							// When we get here we say that we skipped an Venue
							$activity->add( 'venue', 'skipped', $venue->ID );
						} else {
							if ( 'preserve_changes' === $update_authority_setting ) {
								$venue_data = Tribe__Events__Aggregator__Event::preserve_changed_fields( $venue_data );
							}

							// Update the Venue
							Tribe__Events__Venue::instance()->update( $venue->ID, $venue_data );

							// Tell that we updated the Venue to the activity tracker
							$activity->add( 'venue', 'updated', $venue->ID );
						}
					} else {
						/**
						 * Allows filtering the venue ID while searching for it.
						 *
						 * Use this filter to define custom ways to find a matching Venue provided the EA
						 * record information; returning a non `null` value here will short-circuit the
						 * check Event Aggregator would make.
						 *
						 * @since 4.6.15
						 *
						 * @param int|null $venue_id The matching venue ID if any
						 * @param array $venue The venue data from the record.
						 */
						$venue_id = apply_filters( 'tribe_aggregator_find_matching_venue', null, $event['Venue'] );

						if ( null === $venue_id ) {
							// we search the venues already found in this request for this venue title
							$venue_id = array_search( $event['Venue']['Venue'], $found_venues );
						}

						if ( ! $venue_id ) {
							$venue_unique_field = $this->get_unique_field( 'venue' );

							/**
							 * Whether Venues should be additionally searched by title when no match could be found
							 * using other methods.
							 *
							 * @since 4.6.5
							 *
							 * @param bool                                        $lookup_venues_by_title
							 * @param stdClass                                    $item    The event data that is being currently processed, it includes the Venue data
							 *                                                             if any.
							 * @param Tribe__Events__Aggregator__Record__Abstract $record  The current record that is processing events.
							 */
							$lookup_venues_by_title = apply_filters( 'tribe_aggregator_lookup_venues_by_title', true, $item, $this );

							if ( ! empty( $venue_unique_field ) ) {
								$target = $venue_unique_field['target'];
								$value  = $venue_data[ $target ];
								$venue  = Tribe__Events__Aggregator__Event::get_post_by_meta( "_Venue{$target}", $value );
							}

							if ( empty( $venue_unique_field ) || ( $lookup_venues_by_title && empty( $venue ) ) ) {
								$venue = get_page_by_title( $event['Venue']['Venue'], 'OBJECT', Tribe__Events__Venue::POSTTYPE );
							}

							if ( $venue ) {
								$venue_id = $venue->ID;
								$found_venues[ $venue_id ] = $event['Venue']['Venue'];
							}
						}

						// We didn't find any matching Venue for the provided one
						if ( ! $venue_id ) {
							$event['Venue']['ShowMap']     = $show_map_setting;
							$event['Venue']['ShowMapLink'] = $show_map_setting;
							$venue_id = $event['EventVenueID'] = Tribe__Events__Venue::instance()->create( $event['Venue'], $event['post_status'] );

							$found_venues[ $event['EventVenueID'] ] = $event['Venue']['Venue'];

							// Log this Venue was created
							$activity->add( 'venue', 'created', $event['EventVenueID'] );

							// Create the Venue Global ID
							if ( ! empty( $item->venue->global_id ) ) {
								update_post_meta( $event['EventVenueID'], Tribe__Events__Aggregator__Event::$global_id_key, $item->venue->global_id );
							}

							// Create the Venue Global ID History
							if ( ! empty( $item->venue->global_id_lineage ) ) {
								foreach ( $item->venue->global_id_lineage as $gid ) {
									add_post_meta( $event['EventVenueID'], Tribe__Events__Aggregator__Event::$global_id_lineage_key, $gid );
								}
							}
						} else {
							$event['EventVenueID'] = $venue_data['ID'] = $venue_id;

							// Here we might need to update the Venue depending we found something based on old code
							if ( 'retain' === $update_authority_setting ) {
								// When we get here we say that we skipped an Venue
								$activity->add( 'venue', 'skipped', $venue_id );
							} else {
								if ( 'preserve_changes' === $update_authority_setting ) {
									$venue_data = Tribe__Events__Aggregator__Event::preserve_changed_fields( $venue_data );
								}

								// Update the Venue
								Tribe__Events__Venue::instance()->update( $venue_id, $venue_data );

								// Tell that we updated the Venue to the activity tracker
								$activity->add( 'venue', 'updated', $venue_id );
							}
						}
					}
				}

				// Remove the Venue to avoid duplicates
				unset( $event['Venue'] );
			}

			// Do we have an existing organizer(s) for this event that we should preserve?
			if (
				! empty( $event['ID'] )
				&& 'preserve_changes' === $update_authority_setting
				&& $existing_organizer_ids = tribe_get_organizer_ids( $event['ID'] )
			) {
				$event['Organizer'] = $existing_organizer_ids;
				unset( $event['Organizer'] );
			}

			if ( ! empty( $event['Organizer'] ) ) {
				$event_organizers = array();

				// make sure organizers is an array
				if ( $item->organizer instanceof stdClass ) {
					$item->organizer    = array( $item->organizer );
				}

				foreach ( $event['Organizer'] as $key => $organizer_data ) {

					// if provided a valid Organizer ID right away use it
					if ( ! empty( $organizer_data['OrganizerID'] ) ) {
						if ( tribe_is_organizer( $organizer_data['OrganizerID'] ) ) {
							$event_organizers[] = (int) $organizer_data['OrganizerID'];
							continue;
						}
						unset( $organizer_data['OrganizerID'] );
					}

					// if we should create an organizer or use existing
					if ( ! empty( $organizer_data['Organizer'] ) ) {
						$organizer_data['Organizer'] = trim( $organizer_data['Organizer'] );

						if (
							! empty( $item->organizer[ $key ]->global_id )
							|| in_array( $this->origin, array( 'ics', 'ical', 'csv', 'gcal' ) )
						) {
							// Pre-set for ICS based imports
							$organizer = false;
							if ( ! empty( $item->organizer[ $key ]->global_id ) ) {
								// Did we find a Post with a matching Global ID in History
								$organizer = Tribe__Events__Aggregator__Event::get_post_by_meta(
									'global_id_lineage',
									$item->organizer[ $key ]->global_id
								);
							}

							if ( isset( $item->organizer[ $key ]->description ) ) {
								$organizer_data['Description'] = $item->organizer[ $key ]->description;
							}

							if ( isset( $item->organizer[ $key ]->excerpt ) ) {
								$organizer_data['Excerpt'] = $item->organizer[ $key ]->excerpt;
							}

							if ( $organizer ) {
								$organizer_id       = $organizer_data['ID'] = $organizer->ID;
								$event_organizers[] = $organizer_id;

								// If we have a Image Field for the Organizers from Service
								if ( ! empty( $item->organizer[ $key ]->image ) ) {
									$this->import_organizer_image( $organizer_id, $item->organizer[ $key ]->image, $activity );
								}

								$found_organizers[ $organizer->ID ] = $organizer_data['Organizer'];

								// Here we might need to update the Organizer depending we found something based on old code
								if ( 'retain' === $update_authority_setting ) {
									// When we get here we say that we skipped an Organizer
									$activity->add( 'organizer', 'skipped', $organizer->ID );
								} else {
									if ( 'preserve_changes' === $update_authority_setting ) {
										$organizer_data = Tribe__Events__Aggregator__Event::preserve_changed_fields( $organizer_data );
									}

									// Update the Organizer
									Tribe__Events__Organizer::instance()->update( $organizer->ID, $organizer_data );

									// Tell that we updated the Organizer to the activity tracker
									$activity->add( 'organizer', 'updated', $organizer->ID );
								}
							} else {
								/**
								 * Allows filtering the organizer ID while searching for it.
								 *
								 * Use this filter to define custom ways to find a matching Organizer provided the EA
								 * record information; returning a non `null` value here will short-circuit the
								 * check Event Aggregator would make.
								 *
								 * @since 4.6.15
								 *
								 * @param int|null $organizer_id The matching organizer ID if any
								 * @param array $organizer The venue data from the record.
								 */
								$organizer_id = apply_filters( 'tribe_aggregator_find_matching_organizer', null, $organizer_data['Organizer'] );

								if ( null === $organizer_id ) {
									// we search the organizers already found in this request for this organizer title
									$organizer_id = array_search( $organizer_data['Organizer'], $found_organizers );
								}

								if ( ! $organizer_id ) {
									$organizer_unique_field = $this->get_unique_field( 'organizer' );

									if ( ! empty( $organizer_unique_field ) ) {
										$target    = $organizer_unique_field['target'];
										$value     = $organizer_data[ $target ];
										$organizer = Tribe__Events__Aggregator__Event::get_post_by_meta( "_Organizer{$target}", $value );
									} else {
										$organizer = get_page_by_title( $organizer_data['Organizer'], 'OBJECT', Tribe__Events__Organizer::POSTTYPE );
									}
								}

								if ( ! $organizer_id ) {
									if ( $organizer ) {
										$organizer_id                      = $organizer->ID;
										$found_organizers[ $organizer_id ] = $organizer_data['Organizer'];
									}
								}

								// We didn't find any matching Organizer for the provided one
								if ( ! $organizer_id ) {
									$organizer_id = $event_organizers[] = Tribe__Events__Organizer::instance()->create( $organizer_data, $event['post_status'] );

									$found_organizers[ $organizer_id ] = $organizer_data['Organizer'];

									// Log this Organizer was created
									$activity->add( 'organizer', 'created', $organizer_id );

									// Create the Organizer Global ID
									if ( ! empty( $item->organizer[ $key ]->global_id ) ) {
										update_post_meta( $organizer_id, Tribe__Events__Aggregator__Event::$global_id_key,
											$item->organizer[ $key ]->global_id );
									}

									// Create the Organizer Global ID History
									if ( ! empty( $item->organizer[ $key ]->global_id_lineage ) ) {
										foreach ( $item->organizer[ $key ]->global_id_lineage as $gid ) {
											add_post_meta( $organizer_id, Tribe__Events__Aggregator__Event::$global_id_lineage_key,
												$gid );
										}
									}
								} else {
									$event_organizers[] = $organizer_data['ID'] = $organizer_id;

									// Here we might need to update the Organizer depending we found something based on old code
									if ( 'retain' === $update_authority_setting ) {
										// When we get here we say that we skipped an Organizer
										$activity->add( 'organizer', 'skipped', $organizer_id );

									} else {
										if ( 'preserve_changes' === $update_authority_setting ) {
											$organizer_data = Tribe__Events__Aggregator__Event::preserve_changed_fields( $organizer_data );
										}

										// Update the Organizer
										Tribe__Events__Organizer::instance()->update( $organizer_id, $organizer_data );

										// Tell that we updated the Organizer to the activity tracker
										$activity->add( 'organizer', 'updated', $organizer_id );
									}
								}
							}
						}
					}
				}

				// Update the organizer submission data
				$event['Organizer']['OrganizerID'] = $event_organizers;

				// Let's remove this Organizer from the Event information if we found it
				if ( isset( $key ) && is_numeric( $key ) ) {
					unset( $event['Organizer'][ $key ] );
				}
			}

			/**
			 * Filters the event data before any sort of saving of the event
			 *
			 * @param array $event Event data to save
			 * @param Tribe__Events__Aggregator__Record__Abstract Importer record
			 */
			$event = apply_filters( 'tribe_aggregator_before_save_event', $event, $this );

			if ( ! empty( $event['ID'] ) ) {
				if ( 'preserve_changes' === $update_authority_setting ) {
					$event = Tribe__Events__Aggregator__Event::preserve_changed_fields( $event );
				}

				add_filter( 'tribe_tracker_enabled', '__return_false' );

				/**
				 * Filters the event data before updating event
				 *
				 * @param array $event Event data to save
				 * @param Tribe__Events__Aggregator__Record__Abstract Importer record
				 */
				$event = apply_filters( 'tribe_aggregator_before_update_event', $event, $this );

				$event['ID'] = tribe_update_event( $event['ID'], $event );
				remove_filter( 'tribe_tracker_enabled', '__return_false' );

				// since the Event API only supports the _setting_ of these meta fields, we need to manually
				// delete them rather than relying on Tribe__Events__API::saveEventMeta()
				if ( isset( $event['EventShowMap'] ) && ! tribe_is_truthy( $event['EventShowMap'] ) ) {
					delete_post_meta( $event['ID'], '_EventShowMap' );
				}

				if ( isset( $event['EventShowMapLink'] ) && ! tribe_is_truthy( $event['EventShowMapLink'] ) ) {
					delete_post_meta( $event['ID'], '_EventShowMapLink' );
				}

				// Log that this event was updated
				$activity->add( 'event', 'updated', $event['ID'] );
			} else {
				if ( 'url' !== $this->origin && isset( $event[ $unique_field['target'] ] ) ) {
					if ( isset( $existing_ids[ $event[ $unique_field['target'] ] ] ) ) {
						// we should not be here; probably a concurrency issue
						continue;
					}
				}

				// during cron runs the user will be set to 0; we assign the event to the first user that can edit events
				if ( ! isset( $event['post_author'] ) ) {
					$event['post_author'] = $default_user_id;
				}

				/**
				 * Filters the event data before inserting event
				 *
				 * @param array $event Event data to save
				 * @param Tribe__Events__Aggregator__Record__Abstract $record Importer record
				 */
				$event = apply_filters( 'tribe_aggregator_before_insert_event', $event, $this );

				$event['ID'] = tribe_create_event( $event );

				// Log this event was created
				$activity->add( 'event', 'created', $event['ID'] );

				// Create the Event Global ID
				if ( ! empty( $item->global_id ) ) {
					update_post_meta( $event['ID'], Tribe__Events__Aggregator__Event::$global_id_key, $item->global_id );
				}

				// Create the Event Global ID History
				if ( ! empty( $item->global_id_lineage ) ) {
					foreach ( $item->global_id_lineage as $gid ) {
						add_post_meta( $event['ID'], Tribe__Events__Aggregator__Event::$global_id_lineage_key, $gid );
					}
				}
			}

			Tribe__Events__Aggregator__Records::instance()->add_record_to_event( $event['ID'], $this->id, $this->origin );

			// Add post parent possibility
			if ( empty( $event['parent_uid'] ) && ! empty( $unique_field ) && ! empty( $event[ $unique_field['target'] ] ) ) {
				$possible_parents[ $event['ID'] ] = $event[ $unique_field['target'] ];
			}

			// Save the unique field information
			if ( ! empty( $event[ $unique_field['target'] ] ) ) {
				update_post_meta( $event['ID'], "_{$unique_field['target']}", $event[ $unique_field['target'] ] );
			}

			// Save the meta data in case of updating to pro later on
			if ( ! empty( $event['EventRecurrenceRRULE'] ) ) {
				update_post_meta( $event['ID'], '_EventRecurrenceRRULE', $event['EventRecurrenceRRULE'] );
			}

			// Are there any existing event categories for this event?
			$terms = wp_get_object_terms( $event['ID'], Tribe__Events__Main::TAXONOMY );

			if ( is_wp_error( $terms ) ) {
				$terms = array();
			}

			// If so, should we preserve those categories?
			if ( ! empty( $terms ) && 'preserve_changes' === $update_authority_setting ) {
				$terms = wp_list_pluck( $terms, 'term_id' );
				unset( $event['categories'] );
			}

			if ( ! empty( $event['categories'] ) ) {
				foreach ( $event['categories'] as $cat ) {
					if ( ! $term = term_exists( $cat, Tribe__Events__Main::TAXONOMY ) ) {
						$term = wp_insert_term( $cat, Tribe__Events__Main::TAXONOMY );
						if ( ! is_wp_error( $term ) ) {
							$terms[] = (int) $term['term_id'];

							// Track that we created an event category
							$activity->add( 'cat', 'created', $term['term_id'] );
						}
					} else {
						$terms[] = (int) $term['term_id'];
					}
				}
			}

			$tags = array();
			if ( ! empty( $event['tags'] ) ) {
				foreach ( $event['tags'] as $tag_name ) {
					if ( ! $tag = term_exists( $tag_name, 'post_tag' ) ) {
						$tag = wp_insert_term( $tag_name, 'post_tag' );
						if ( ! is_wp_error( $tag ) ) {
							$tags[] = (int) $tag['term_id'];

							// Track that we created a post tag
							$activity->add( 'tag', 'created', $tag['term_id'] );
						}
					} else {
						$tags[] = (int) $tag['term_id'];
					}
				}
			}

			// if we are setting all events to a category specified in saved import
			if ( ! empty( $this->meta['category'] ) ) {
				$terms[] = (int) $this->meta['category'];
			}

			$normalized_categories = tribe_normalize_terms_list( $terms, Tribe__Events__Main::TAXONOMY );
			$normalized_tags = tribe_normalize_terms_list( $tags, 'post_tag' );
			wp_set_object_terms( $event['ID'], $normalized_categories, Tribe__Events__Main::TAXONOMY, false );
			wp_set_object_terms( $event['ID'], $normalized_tags, 'post_tag', false );

			// If we have a Image Field from Service
			if ( ! empty( $event['image'] ) ) {
				$this->import_event_image( $event, $activity );
			}

			// If we have a Image Field for the Venue from Service
			if ( ! empty( $item->venue->image ) && $venue_id ) {
				$this->import_venue_image( $venue_id, $item->venue->image, $activity );
			}

			// update the existing IDs in the context of this batch
			if ( $unique_field && isset( $event[ $unique_field['target'] ] ) ) {
				$existing_ids[ $event[ $unique_field['target'] ] ] = (object) array(
					'post_id'    => $event['ID'],
					'meta_value' => $event[ $unique_field['target'] ],
				);
			}

			/**
			 * Fires after a single event has been created/updated, and  with it its linked
			 * posts, with import data.
			 *
			 * @since 4.6.16
			 *
			 * @param  array $event   Which Event data was sent
			 * @param  array $item    Raw version of the data sent from EA
			 * @param  self  $record  The record we are dealing with
			 */
			do_action( 'tribe_aggregator_after_insert_post', $event, $item, $this );
		}

		remove_filter( 'tribe-post-origin', array( Tribe__Events__Aggregator__Records::instance(), 'filter_post_origin' ), 10 );

		/**
		 * Fires after events and linked posts have been inserted in the database.
		 *
		 * @since 4.5.13
		 *
		 * @param array                                       $items    An array of items to insert.
		 * @param array                                       $meta     The record meta information.
		 * @param Tribe__Events__Aggregator__Record__Activity $activity The record insertion activity report.
		 */
		do_action( 'tribe_aggregator_after_insert_posts', $items, $this->meta, $activity );

		/**
		 * Finally resume tracking changes when all events, and linked posts, have been updated/inserted.
		 */
		remove_filter( 'tribe_tracker_enabled', '__return_false' );

		$final_created_events = (int) $activity->count( Tribe__Events__Main::POSTTYPE );

		if ( $expected_created_events === $final_created_events ) {
			$activity->set_last_status( Tribe__Events__Aggregator__Record__Activity::STATUS_SUCCESS );
		} elseif ( $initial_created_events === $final_created_events ) {
			$activity->set_last_status( Tribe__Events__Aggregator__Record__Activity::STATUS_FAIL );
		} else {
			$activity->set_last_status( Tribe__Events__Aggregator__Record__Activity::STATUS_PARTIAL );
		}

		return $activity;
	}