Tribe__Events__Linked_Posts::maybe_reorder_linked_posts_ids( int $event_id, string $linked_post_type, array $new_order = array(), array $old_order = array() )

Re-orders linked posts if the order has changed.


Parameters

$event_id

(int) (Required) Event ID.

$linked_post_type

(string) (Required) The post type of the linked post.

$new_order

(array) (Optional) The new order of the linked posts.

Default value: array()

$old_order

(array) (Optional) The old order of the linked posts.

Default value: array()


Top ↑

Return

(bool)


Top ↑

Source

File: src/Tribe/Linked_Posts.php

	public function maybe_reorder_linked_posts_ids( int $event_id, string $linked_post_type, array $new_order = [], array $old_order = [] ): bool {
		// If the array values match both type and value and ordering, no need to touch postmeta.
		if ( $old_order === $new_order ) {
			return false;
		}

		$linked_post_type_meta_key = $this->get_meta_key( $linked_post_type );
		$temp_old_order            = $old_order;

		// Re-save postmeta if not matching all these conditions.
		$sorted_old = $old_order;
		sort( $sorted_old, SORT_NUMERIC );

		$sorted_new = $new_order;
		sort( $sorted_new, SORT_NUMERIC );

		if ( $sorted_old === $sorted_new ) {
			// If the post IDs are the same (none new nor removed) but not in the same order.

			// We do not run our own unlink/link methods because we are not doing that, just re-ordering via `meta_id` by removing all and re-adding in the desired order.
			delete_post_meta( $event_id, $linked_post_type_meta_key );

			foreach ( $new_order as $linked_post_id ) {
				add_post_meta( $event_id, $linked_post_type_meta_key, $linked_post_id );
			}
		} else {
			// We have different Linked Post IDs (adding and/or removing one or more) so possibly need to run through our own methods to trigger those hooks.
			$posts_to_remove = array_diff( $old_order, $new_order );

			foreach ( $posts_to_remove as $key => $unlinked_post_id ) {
				$this->unlink_post( $event_id, $unlinked_post_id );
				unset( $temp_old_order[ $key ] );
			}

			// Remove all pre-existing (and non-removed) linked posts to start fresh by re-adding below (for `meta_id` ordering purposes)
			if ( ! empty( $temp_old_order ) ) {
				delete_post_meta( $event_id, $linked_post_type_meta_key );
			}

			foreach ( $new_order as $linked_post_id ) {
				if ( in_array( $linked_post_id, $old_order ) ) {
					// Re-add pre-existing ones without our own method because we do not want to trigger those hooks.
					add_post_meta( $event_id, $linked_post_type_meta_key, $linked_post_id );
				} else {
					// Add newly-linked ones via our own method in order to trigger such hooks.
					$this->link_post( $event_id, $linked_post_id );
				}
			}
		}

		return true;
	}

Top ↑

Changelog

Changelog
Version Description
6.2.0 Introduced.