WordPress Version: 6.1
/**
* Checks for changed slugs for published post objects and save the old slug.
*
* The function is used when a post object of any type is updated,
* by comparing the current and previous post objects.
*
* If the slug was changed and not already part of the old slugs then it will be
* added to the post meta field ('_wp_old_slug') for storing old slugs for that
* post.
*
* The most logically usage of this function is redirecting changed post objects, so
* that those that linked to an changed post will be redirected to the new post.
*
* @since 2.1.0
*
* @param int $post_id Post ID.
* @param WP_Post $post The post object.
* @param WP_Post $post_before The previous post object.
*/
function wp_check_for_changed_slugs($post_id, $post, $post_before)
{
// Don't bother if it hasn't changed.
if ($post->post_name == $post_before->post_name) {
return;
}
// We're only concerned with published, non-hierarchical objects.
if (!('publish' === $post->post_status || 'attachment' === get_post_type($post) && 'inherit' === $post->post_status) || is_post_type_hierarchical($post->post_type)) {
return;
}
$old_slugs = (array) get_post_meta($post_id, '_wp_old_slug');
// If we haven't added this old slug before, add it now.
if (!empty($post_before->post_name) && !in_array($post_before->post_name, $old_slugs, true)) {
add_post_meta($post_id, '_wp_old_slug', $post_before->post_name);
}
// If the new slug was used previously, delete it from the list.
if (in_array($post->post_name, $old_slugs, true)) {
delete_post_meta($post_id, '_wp_old_slug', $post->post_name);
}
}