我使用迁移模块v2迁移了节点。目前我遇到的问题是,以前的网站使用了url别名,这些别名尚未迁移到drupal7,并且会从SEO角度影响网站排名。
有没有办法可以在运行迁移类时自行迁移路径别名?如果不是,最好的方法是什么?
答案 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
更改为source
和dst
到alias
的字段名称}。所以我猜你可以轻松地将你的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。
感谢。