You are here

uri_map_redirect.php in Migrate 6.2

Same filename and directory in other branches
  1. 7.2 uri_map_redirect.php

Sample file for handling redirection from old to new URIs. Use an Apache rewrite rule (or equivalent) to map legacy requests to this file. To use, copy or symlink this file to the root of your drupal site. Customize this file to your needs.

CREATE TABLE `migrate_source_uri_map` ( `source_uri` varchar(255) NOT NULL DEFAULT '', `migration_name` varchar(255) NOT NULL, `source_id` int(11) NOT NULL, -- can be varchar for some migrations PRIMARY KEY (`source_uri`) )

File

uri_map_redirect.php
View source
<?php

/**
 * @file
 * Sample file for handling redirection from old to new URIs. Use an Apache
 * rewrite rule (or equivalent) to map legacy requests to this file. To use, copy
 * or symlink this file to the root of your drupal site. Customize
 * this file to your needs.
 *
 * CREATE TABLE `migrate_source_uri_map` (
 * `source_uri` varchar(255) NOT NULL DEFAULT '',
 * `migration_name` varchar(255) NOT NULL,
 *  `source_id` int(11) NOT NULL, -- can be varchar for some migrations
 * PRIMARY KEY (`source_uri`)
 * )
 *
 */

// For security, this script is disabled by default.
die('Comment out this line when you are ready to use this script');

// Based on custom patterns, build the destination_uri for given source_uri
function migrate_build_url($destid1, $migration_name) {
  global $base_url;

  // TODO: Add an entry for each migration that we need to redirect.
  $patterns = variable_get('migrate_patterns', array(
    'BeerTerm' => 'taxonomy/term/:source_id',
    'BlogEntries' => 'node/:source_id',
    'Slideshows' => 'node/:source_id',
    'TagTerm' => 'taxonomy/term/:source_id',
  ));
  $pattern = $patterns[$migration_name];

  // Swap in the destination ID.
  $destination_uri = str_replace(':source_id', $destid1, $pattern);

  // For speed, we go right to aliases table rather than more bootstrapping.
  if ($uri_clean = db_query("SELECT alias FROM {url_alias} WHERE source = :destination_uri", array(
    ':destination_uri' => $destination_uri,
  ))
    ->fetchField()) {
    $destination_uri = $uri_clean;
  }

  // Build absolute url for 301 redirect.
  return $base_url . '/' . $destination_uri;
}
define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

// Only bootstrap to DB so we are as fast as possible. Much of the Drupal API
// is not available to us.
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);

// You must populate this querystring param from a rewrite rule or $_SERVER
// On Apache, we could likely use _SERVER['REDIRECT_URL']. nginx?
if (!($source_uri = $_GET['migrate_source_uri'])) {
  print '$_GET[migrate_source_uri] was not found on the request.';
  exit;
}

// This is a tall table mapping legacy URLs to source_id and migration_name.
// If you can already know the migration name and source_id based on the URI,
// then the first lookup is not needed.
$uri_table = variable_get('migrate_source_uri_table', 'migrate_source_uri_map');
if ($uri_map = db_query("SELECT migration_name, source_id FROM {$uri_table} WHERE source_uri = :source_uri", array(
  ':source_uri' => $source_uri,
))
  ->fetchObject()) {

  // Hurray, we do recognize this URI.
  // Consult migrate_map_x table to determine corresponding Drupal nid/tid/cid/etc.
  $map_table = 'migrate_map_' . strtolower($uri_map->migration_name);
  $sql = "SELECT destid1 FROM {$map_table} WHERE sourceid1 = :source_id";
  if ($destid1 = $migrate_map = db_query($sql, array(
    ':source_id' => $uri_map->source_id,
  ))
    ->fetchField()) {

    // Hurray. We already migrated this content. Go there.
    header('Location: ' . migrate_build_url($destid1, $uri_map->migration_name), TRUE, 301);
  }
  else {

    // We recognize URI but don't have the content in Drupal. Very unlikely.
  }
}
else {

  // Can't find the source URI. TODO: Make nice 404 page.
  header('Status=Not Found', TRUE, 404);
  print 'Sorry folks. Park is closed.';
}

Functions

Namesort descending Description
migrate_build_url

Constants

Namesort descending Description
DRUPAL_ROOT