回到见解

在WordPress中使用导入/导出工具移动内容时如何保持两种自定义帖子类型之间的关系

3分钟阅读

回到见解

3分钟阅读

在WordPress中使用导入/导出工具移动内容时如何保持两种自定义帖子类型之间的关系

作者: 瑞安·科菲尔德(Ryan Corfield)
发表于 Web开发 于2019年3月27日12:00

的导入/导出工具 WordPress的 被广泛使用,因为我们经常需要将一些帖子从一个网站移到另一个网站。导入属于两种不同帖子类型且彼此有关系的帖子时,我们可能会遇到一些问题。

这些关系通常是由发布父项或元值定义的,它们引用了发布ID,因此,如果xml导出文件中的某些ID已被使用, WordPress的 将导入具有不同ID且仍未使用的帖子,因此关系将丢失。

假设我们已将属于两种自定义帖子类型的帖子导出到post_type_1.xml和post_type_2.xml文件中,我们需要确保这些文件中的每个ID均未使用。

首先,我们需要使用以下代码查找使用中的最高ID:

$post_id = $wpdb->get_results("SELECT MAX(ID) as max_id FROM $table_name")[0]->max_id;

现在我们知道,每个高于该值的ID都可用。

假设帖子类型2包含实际的关系值,我们需要遍历post_type_2.xml文件中的每个帖子,并用一些可用ID替换引用帖子类型1的帖子ID。

在这里,我们将xml导出文件作为字符串获取。

$post_type_1_str = file_get_contents('post_type_1.xml');
$post_type_2_str = file_get_contents('post_type_2.xml');

然后,我们为帖子类型2获得一个类SimpleXMLElement的对象。

$post_type_2_xml = simplexml_load_string($post_type_2_str);

现在,我们准备检查所有帖子。

foreach ($post_type_2_xml>channel->item as $item) {

  $wp = $item->children( 'wp', true );    

  ....

  $post_id++;

}

对于每个帖子,我们需要更新定义关系的值。如前所述,它们可以存储为后父项或元值。我们将讨论这两种情况。

上级家长:
我们只需使用新的ID更新帖子的父级。

$old_id = $wp->post_parent;
$wp->post_parent = $post_id;

元值:
我们通过元键找到了所需的元值,在示例中称为“ _relationship_key”,然后使用新的ID更新该值。请注意,元值在xml中显示为字符数据(CDATA),因此我们需要使用DOMElement对象API,这些API允许我们使用CDATA值进行操作。

foreach ( $wp->postmeta as $meta ) {

  if ((string) $meta->meta_key !== '_relationship_key') continue;                

  $old_id = (int) $meta->meta_value;                

  // Update CDATA
  $node = dom_import_simplexml($meta->meta_value); 
  $no   = $node->ownerDocument; 
  $node->nodeValue = '';
  $node->appendChild($no->createCDATASection($post_id)); 

  $wp->post_parent = $post_id;

}

如您所见,我们已经将引用帖子类型1的原始关系值存储在$ old_id变量中,因为我们仍然需要在post_type_1.xml导出文件中将这些值替换为新的ID。为此,我们在循环内添加以下代码:

$post_type_1_str = str_replace(''.$old_id.'', ''.$post_id.'', $post_type_1_str);

最后,在主循环之外,我们现在可以保存使用新ID更新的导出文件。

file_put_contents('post_type_1.xml', $post_type_1_str);
file_put_contents('post_type_2.xml', $post_type_2_xml->saveXML());

这种解决方法适合许多没有自己的导入/导出工具的插件。其中之一是 DW问题& Answer,这会构成一个完整的问题&应答系统类似于堆栈溢出。它依赖于两种具有关系的自定义帖子类型,用于存储问题和答案。因此,如果您使用此插件并且在导入方面遇到困难,那么现在您可以在此博客中实践这些信息。

如果你’重新寻找大型网络项目的专业网络开发机构, 联系RUN2 today.

您如何看待这篇文章?

爱它

有趣的

不适合我

做什么 [你] want to do next?

阅读更多博客。

看我们的工作。