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.
Contents
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()
Return
(bool)
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;
}
Changelog
| Version | Description |
|---|---|
| 6.2.0 | Introduced. |