RSS问题 - Drupal到WordPress迁移

时间:2012-08-15 20:55:29

标签: wordpress drupal rss

我正在使用this site中的脚本将Drupal数据库迁移到WordPress。它似乎工作正常,除了我尝试访问它时返回HTTP 304错误的RSS提要。

我认为问题出在以下几个方面:

TRUNCATE TABLE wordpress.wp_comments;
TRUNCATE TABLE wordpress.wp_links;
TRUNCATE TABLE wordpress.wp_postmeta;
TRUNCATE TABLE wordpress.wp_posts;
TRUNCATE TABLE wordpress.wp_term_relationships;
TRUNCATE TABLE wordpress.wp_term_taxonomy;
TRUNCATE TABLE wordpress.wp_terms;

当脚本清空WordPress数据库时,RSS源停止工作。但是,如果我在不清空上表的情况下执行了博客文章的导入,那么这些供稿似乎正常。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

在上面的一行中,我认为没有任何问题。所以你必须查看所有代码:

数据库转换表 Drupal 6.x表WordPress 2.9x等效 term_data,term_hierarchy wp_terms node,node_revisions`wp_posts term_node wp_term_relationships 评论wp_comments

截断WordPress表

首先,我需要删除当前在某些wordpress表中的所有数据,以便我可以使用新的平板。

注意:默认情况下,当您安装wordpress时,除非您将其更改为其他内容,否则所有表都以wp_为前缀。如果您使用除wp _。

以外的任何其他内容,则需要修改以下查询
TRUNCATE TABLE wp_comments;
TRUNCATE TABLE wp_postmeta;
TRUNCATE TABLE wp_posts;
TRUNCATE TABLE wp_term_relationships;
TRUNCATE TABLE wp_term_taxonomy;
TRUNCATE TABLE wp_terms;

导入分类条款

下一组查询会导入分类术语。

注意:表名用drupal预先填写。需要是drupal数据库的实际名称。您需要将此更改为您的drupal数据库命名的任何内容。

INSERT INTO wp_terms (term_id, name, slug, term_group)
  SELECT d.tid, d.name, REPLACE(LOWER(d.name), ' ', '-'), 0
  FROM drupal.term_data d
  INNER JOIN drupal.term_hierarchy h
  USING(tid);

默认情况下,WordPress有几种分类法可用; categories,post_tag和link_category。在我的Drupal实例中,我主要使用分类法作为标记,但您可能有不同的需求。您可能需要修改以下查询中的第3行,具体取决于您希望如何导入分类法:

 Categories: category
    Link Categories: link_category
    Post Tags: post_tag



 INSERT INTO wp_term_taxonomy (term_taxonomy_id, term_id, taxonomy, 
                              description, parent)
      SELECT d.tid, d.tid, 'post_tag', d.description, h.parent
      FROM drupal.term_data d
      INNER JOIN drupal.term_hierarchy h
      USING(tid);

导入帖子内容

Drupal允许自定义帖子类型,而从WordPress 2.9x开始,自定义帖子类型只能通过插件获得。您可以使用以下未经修改的查询,它会将所有故事转换为帖子,其他所有内容都会按原样转移。如果您需要转换其他帖子类型,可以添加其他案例陈述。

实施例: 当'预订'那么'发布'

我还调整了查询​​,以便根据我的GMT偏移-6:00(中部时间)正确填充'post_date_gmt'。如果您在不同的时区,则需要调整FROM_UNIXTIME(已创建+ 21600)以根据您的位置减去或正确添加。

INSERT INTO
wp_posts (id, post_date, post_date_gmt, post_content, post_title,
post_excerpt, post_name, post_type, post_modified)
SELECT DISTINCT
n.nid, FROM_UNIXTIME(created), 
FROM_UNIXTIME(created+21600), body, n.title, teaser, LOWER(n.title),
(CASE n.TYPE
  WHEN 'story' THEN 'post'
  ELSE n.TYPE
END) AS TYPE,
FROM_UNIXTIME(changed)
FROM drupal.node n, drupal.node_revisions r
WHERE n.vid = r.vid;

导入帖子和分类关系

   INSERT INTO wp_term_relationships (object_id, term_taxonomy_id)
    SELECT nid, tid FROM drupal.term_node;
Category Count Updating





 UPDATE wp_term_taxonomy tt
 SET COUNT = (
 SELECT COUNT(tr.object_id)
 FROM wp_term_relationships tr
 WHERE tr.term_taxonomy_id = tt.term_taxonomy_id
 );

导入评论

INSERT INTO wp_comments (comment_post_ID, comment_date, 
        comment_content, comment_parent, comment_author, 
        comment_author_email, comment_author_url, comment_approved)
 SELECT nid, FROM_UNIXTIME(TIMESTAMP), comment, thread, 
          name, mail, homepage, STATUS 
 FROM drupal.comments;

更新评论计数

   UPDATE wp_posts 
   SET comment_count = (SELECT COUNT(comment_post_id) 
  FROM wp_comments 
  WHERE wp_posts.id = wp_comments.comment_post_id);

更新帖子

Drupal的URL别名相当于WordPress的永久链接。 Drupal比WordPress具有更积极的标题卫生。我希望能够在迁移到WordPress时保持我的标题与SEO原因相同。

为了保留我的旧标题,我需要使用类似于Drupal的规则来加入WordPress的标题卫生。以下代码需要放在当前主题的functions.php文件中。

add_filter('sanitize_title', 'my_sanitize_title'); 
function my_sanitize_title($title) {
                                                                                                          $title                                                                                          =                                                                                                           preg_replace('/\b(a|an|as|at|before|but|by|for|from|is|in|into|like|of|off|on|onto|per|since|than|the|this|that|to|up|via|with)\b/i', '', $title);
   $title = preg_replace('/-+/', '-', $title);
   $title = trim($title, '-');
   return $title;
   }

您需要将以下代码保存到主WordPress目录中的文件,即“fix-slugs.php”,并通过浏览器运行。

< ?php

   require_once('wp-load.php');

     $posts = $wpdb->get_results(
 "SELECT ID, post_title, post_name FROM $wpdb->posts"
    );

    $count = 0;
   $ignored = 0;
  $errors = 0;
  foreach($posts as $post) {
  if(strcmp($slug = sanitize_title($post->post_title), $post->post_name) !== 0) {
  $wpdb->show_errors();
  if(($result = $wpdb->query("UPDATE $wpdb->posts SET post_name='$slug' WHERE ID=$post->ID")) === false) {
    $errors++;
  } elseif($result === 0) {
    $ignore++;
  } else {
    $count++;
  }
} else {
   $ignored++;
}
 }

echo "<strong>$count post slug(s) sanitized.</strong><br />";
echo "$ignored post(s) ignored.<br />";
 echo "$errors error(s).<br />";

如果您正在学习本教程,我在使用WordPress数据库描述作为参考时,根据我的Drupal设置进行了一些更改。如果您通过Drupal的界面上传图像,可能还需要完成一些额外的步骤,但上述查询能够成功地将我的数据从Drupal迁移到WordPress。

答案 1 :(得分:0)

使用HtmlAgilityPack for Visual Studio帮助快速构建导入器以浏览每个Drupal的帖子并使用XMLRPC将它们添加到Wordpress中。由于Drupal有两个单独的列用于帖子内容和后期预告片,因此将Drupal导入Wordpress会更好,这样您就可以动态添加<!--more-->标签。