【问题标题】:RSS Issue - Drupal to WordPress MigrationRSS 问题 - Drupal 到 WordPress 迁移
【发布时间】:2012-08-15 20:55:28
【问题描述】:

我正在使用来自 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 提要停止工作。但是,如果我在不清空上述表格的情况下导入博客文章,则这些提要似乎可以正常工作。

有什么想法吗?

【问题讨论】:

    标签: wordpress drupal rss


    【解决方案1】:

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

    数据库换算表 Drupal 6.x 表 WordPress 2.9x 等效 term_data,term_hierarchy wp_terms 节点,node_revisions`wp_posts term_node wp_term_relationships cmets wp_cmets

    截断 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 有几种可用的分类类型;类别、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 开始,自定义帖子类型只能通过插件获得。您可以使用未修改的以下查询,它将所有故事转换为帖子,其他所有内容都将按原样转移。如果需要转换额外的帖子类型,可以添加额外的case语句。

    示例: 何时“预订”然后“发布”

    我还调整了查询​​,以便根据我的 GMT 偏移量 -6:00(中部时间)正确填充“post_date_gmt”。如果您在不同的时区,则需要调整 FROM_UNIXTIME(created+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);
    

    更新 Post Slugs

    Drupal 的 URL 别名等同于 WordPress 的永久链接。与 WordPress 相比,Drupal 的标题卫生更激进。在迁移到 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。

    【讨论】:

      【解决方案2】:

      在 Visual Studio 中使用 HtmlAgilityPack 有助于快速构建导入器以浏览 Drupal 的每篇文章并使用 XMLRPC 将它们添加到 Wordpress。由于 Drupal 为帖子内容和帖子预告有两个单独的列,因此最好将 Drupal 导入 Wordpress,这样您就可以即时添加 &lt;!--more--&gt; 标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多