diff --git a/redirect.module b/redirect.module index b5748d1..edc3edb 100644 --- a/redirect.module +++ b/redirect.module @@ -394,6 +394,8 @@ function redirect_path_update(array $path) { } if (!empty($path['original']['pid']) && $path['original']['pid'] == $path['pid'] && $path['original']['alias'] != $path['alias']) { + // Delete all redirects that would redirect the alias. + redirect_delete_by_path($path['alias'], $path['language'], FALSE); $redirect = new stdClass(); redirect_object_prepare($redirect); $redirect->source = $path['original']['alias']; @@ -408,6 +410,16 @@ function redirect_path_update(array $path) { } /** + * Implements hook_path_insert(). + */ +function redirect_path_insert(array $path) { + if (!empty($path['alias'])) { + // Delete all redirects having the same source as this alias. + redirect_delete_by_path($path['alias'], $path['language'], FALSE); + } +} + +/** * Implements hook_path_delete(). */ function redirect_path_delete($path) { @@ -849,15 +861,20 @@ function redirect_delete($rid) { * * @ingroup redirect_api */ -function redirect_delete_by_path($path) { +function redirect_delete_by_path($path, $language = FALSE, $match_subpaths_and_redirect = TRUE) { $query = db_select('redirect'); $query->addField('redirect', 'rid'); $query_or = db_or(); $query_or->condition('source', db_like($path), 'LIKE'); - $query_or->condition('source', db_like($path . '/') . '%', 'LIKE'); - $query_or->condition('redirect', db_like($path), 'LIKE'); - $query_or->condition('redirect', db_like($path . '/') . '%', 'LIKE'); + if ($match_subpaths_and_redirect) { + $query_or->condition('source', db_like($path . '/') . '%', 'LIKE'); + $query_or->condition('redirect', db_like($path), 'LIKE'); + $query_or->condition('redirect', db_like($path . '/') . '%', 'LIKE'); + } $query->condition($query_or); + if ($language) { + $query->condition('language', $language); + } $rids = $query->execute()->fetchCol(); if ($rids) {