将Drupal永久链接“...node/xxxx”重新链接到WordPress永久链接(例如/dio/<帖子名称>)

时间:2021-09-03 作者:Kaspar Dornfeld

我有个大问题!我正在将基于drupal的在线数据库迁移到wordpress。在旧数据库中,每个对象(post)都有可下载的qr码。因为数据库用于科学目的,用户可以在自己的出版物中使用下载的二维码作为参考。由于该系统已经使用了五年,一些书籍已经使用这些二维码打印出来,在短码中嵌入了对象url。在wordpress版本上,它使用了drupalsite url/node/XXXX(其中XXXX是内容节点的编号)中的正常结构permalink结构是(并且应该是)例如:站点url/audio/postSo的名称https://soundandscience.de/node/1040 成为https://soundandscience.de/audio/lautarchiv-recording-la-566-1-siebs-theodor-a-laute/

因为我经常使用ACF,所以我所能做的是创建一个字段,用于存储旧帖子的节点号(在本例中为1040)

drupal和wordpress之间的转帖将手动处理(差生)。。。

但是,有没有一种方法可以将印刷书籍中的旧短代码重定向到新的正确帖子?

贝斯特马丁

2 个回复
SO网友:vlood

给你一个主意:

如果创建用于从Drupal导入内容的脚本,请使用节点ID作为新WP帖子的建议ID(Otto在这里解释了如何执行此操作:How can I assign post a specific ID on creation?), 这将导致在上的新站点中可以访问您的节点https://yoursite.com/?p=XXX 对于它们中的每一个,都将转换为新的URL结构。然后设置一个插件,如https://wordpress.org/plugins/redirection/ 对于/node/XXX要重定向到/的任何请求的regex重定向?p=XXX您将拥有所需的内容,而无需创建自定义字段。请注意,如果您的网站在迁移Drupal内容时没有其他帖子,这将起作用,因为ID只是作为建议添加的,如果它已经存在于wp\\U posts表中,则不会相同。

我敢肯定,通过编程方式迁移Drupal内容会更快,而不是让人们手动迁移,然后设置您所说的额外字段。

如果你坚持要手动传输你的内容,或者你不能接受我的第一个建议,那么你可以选择另一种方法——使用pre_handle_404template_redirect 过滤器允许您解析节点ID的请求,如果它与模式siteurl/node/XXX匹配,请使用所需的ACF值查找您的右贴子(WP_Query 使用meta_query 并重定向到您希望访问者最终访问的页面。

SO网友:Kaspar Dornfeld

所以我决定使用以下代码(完全了解,这是可以优化的)

首先,我得到了url,这将我带到404模板。我检查,如果它包含术语;节点“;,这表明,这是一个指向drupal版本条目的链接,然后我将其拆分,直到我得到“No No No modHFGen.dll;节点/quot;。然后,我创建一个新的查询,其中包含该过程的所有可能的post类型,检查是否有一个,其中存储在acf字段中的节点号匹配。最后,我获得找到的帖子的永久链接,然后通过javascript替换html文档。

<?php
/* 404 Template including redirect for old database entries
 */

get_header();

$re_link = $_SERVER[\'REQUEST_URI\'];

if (strpos($re_link, \'node\')) {
    $re_link_number = explode(\'/\', $re_link);
}

$p_type = array(\'objects\', \'texts\', \'video\', \'audio\', \'pictures\', \'instruments\', \'essays\', \'people\', \'locations\', \'sets\', \'collections\', \'companions\');

$args = array(
    \'post_type\' => $p_type,
    \'posts_per_page\' => 10000,
);

$all = new WP_Query($args);

while ($all->have_posts()) : $all->the_post();
    if ((get_field(\'node_number\') == $re_link_number[2]) && ($re_link_number[2] != \'\')) { ?>
        <script>window.location.replace("<?php echo get_permalink(); ?>");</script>
    <?php }
endwhile;

相关推荐

WP_safe_redirect not working

而不是Divi主题中的项目档案/project_category/[category name]/ 我想让他们去/portfolios/#[category name].我修改了以下代码this question 并将其添加到我的孩子主题中functions.php 文件function my_category_redirect() { if ( is_category( ) ) { $category = get_queried_object();