将url别名从drupal6迁移到drupal7作为迁移过程的一部分

时间:2011-09-20 07:27:26

标签: drupal migration

我使用迁移模块v2迁移了节点。目前我遇到的问题是,以前的网站使用了url别名,这些别名尚未迁移到drupal7,并且会从SEO角度影响网站排名。

有没有办法可以在运行迁移类时自行迁移路径别名?如果不是,最好的方法是什么?

4 个答案:

答案 0 :(得分:5)

您可以将旧版别名直接迁移到Drupal 7路径字段:

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

答案 1 :(得分:1)

这是一个非常精简的迁移类,其中包含一个简单的方法,可以将URL用于搭载。旨在与Migrate模块一起使用。

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);
  }
}

答案 2 :(得分:0)

正如我所看到的,url_alias表格全局相同,期望从src更改为sourcedstalias的字段名称}。所以我猜你可以轻松地将你的Drupal 6中的内容复制到你的Drupal 7中。

我从未尝试过,但理论上它应该有用。

答案 3 :(得分:0)

拥有相同网址别名的最佳方式(据我所知)是:

1>安装url_alias模块。

2 - ;使用类似于drupal6的模式配置节点。现在,这个步骤可能会给你带来麻烦,以防新的url-aliases附加了nids。(就像我的情况一样)。

作为一种解决方案,我们可以继续使用代码创建自定义令牌,其中可以根据易于获得的新目标ID从迁移地图表中获取源ID。

现在,我们可以继续批量生成url-aliases。

创建此类自定义令牌的示例如下:

/**
 * 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>

        }
      }
    }

在编写自定义代码时,您也需要遗留表。 Drupal 7支持多个数据库,因此只需在settings.php文件中配置旧表凭据。

从不同的表中获取数据时使用drupal_set_active。

感谢。