开发者

migrating url alias from drupal6 to drupal7 as a part of migration process

开发者 https://www.devze.com 2023-04-05 21:01 出处:网络
I have migrated nodes using migrate module v2. Currently i am running into a problem that the previous site used url aliases,which have not been migrated into drupal7 and will affec开发者_C百科t the s

I have migrated nodes using migrate module v2. Currently i am running into a problem that the previous site used url aliases,which have not been migrated into drupal7 and will affec开发者_C百科t the site rank from SEO perspective.

Is there a way i can migrate the path aliases while running the migration classes itself?If not what would be the best way to do so?


You can migrate your legacy aliases directly into the Drupal 7 path field:

$this->addFieldMapping('path', 'my_legacy_alias_field');


Here is a very stripped down migration class that includes an easy method for bringing URLs along for the ride. Intended for use with the Migrate module.

class MyNodeMigration extends Migration {
  public function __construct(array $arguments) {
    $this->arguments = $arguments;
    parent::__construct();
    $source_fields = array('nid' => t('The node ID of the page'));

    $query = Database::getConnection('default', 'legacy')
      ->select('node', 'n')
      ->fields('n');
    $query->join('url_alias', 'a', "a.src = CONCAT('node/', n.nid)");
    $query->addField('a', 'dst');
    $this->source = new MigrateSourceSQL($query, $source_fields);
    $this->destination = new MigrateDestinationNode('my_node_type');
    $this->map = new MigrateSQLMap($this->machineName,
      array('nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'description' => 'D6 Unique Node ID',
        'alias' => 'n',
      )),
      MigrateDestinationNode::getKeySchema()
    );

    $this->addSimpleMappings(array('title', 'created', 'changed', 'status'));
    $this->addUnmigratedDestinations(array('sticky', 'log', 'nid'));
    $this->addFieldMapping('path', 'dst');
    $this->addFieldMapping('is_new')->defaultValue(TRUE);
  }
}


As I can see, the url_aliastable is globally the same, expect the name of fields whom changed from srcto sourceand dst to alias. So I guess you can easily copy the content from your Drupal 6 to your Drupal 7.

I never tried, but in theory it should work.


The best way (according to me) to have the same url aliases is :

1> install url_alias module.

2> configure the nodes with patterns similar to drupal6. Now, this step may trouble you, in case the new url-aliases have nids attached to them.(as in my case).

As a solution we can go ahead and create custom tokens using code where the source id can be fetched from the migrate map tables based on the new destination ids which are easily available.

Now, we can go ahead and bulk generate url-aliases.

An example for creating such custom token would be:

/**
 * Implements hook_token_info().
 */
function custom_configuration_token_info() {  
  $type = array(
    'node' => array (
      'name' => t('Nodes'), 
      'description' => t('Tokens related to individual nodes.'), 
      'needs-data' => 'node',
     ),

         'term' => array(
           'name' => t('Taxonomy Terms'),
           'description' => t('Tokens related to taxonomy terms.'),
           'needs-data' => 'term',
         )
      );

      // tokens for node legacy nid.
      $tokens['node']['mapid'] = array(
        'name' => t("mapid"), 
        'description' => t("The nid of the node prior to migration."),
      );

      $tokens['term']['mapid'] = array(
        'name' => t('mapid'),
        'description' => t('The tid of taxonomy terms prior to migration.'),
      );

      return array(
        'types' => $type, 
        'tokens' => $tokens,
      );
    }


    now,

    function custom_configuration_tokens($type, $tokens, array $data = array(), array $options = array()) {
      $url_options = array('absolute' => TRUE);
      if (isset($options['language'])) {
        $url_options['language'] = $options['language'];
        $language_code = $options['language']->language;
      }
      else {
        $language_code = NULL;
      }
      $sanitize = !empty($options['sanitize']);

      $replacements = array();

      if ($type == 'node' && !empty($data['node'])) {
        $node = $data['node'];

        foreach ($tokens as $name => $original) {
              switch ($name) {

    <write your custom code for the token conditioned by the name attribute in info function>

        }
      }
    }

While writing your custom code, you mite also be needing the legacy table. Drupal 7 supports multiple databases, so just configure the legacy table credentials in settings.php file.

Use drupal_set_active while fetching data from the different tables.

Thanks.

0

精彩评论

暂无评论...
验证码 换一张
取 消