我们希望通过使用cookie为您提供最好的服务。如果对此感到满意,请继续浏览,或查找 如何管理您的Cookie.
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.
您如何看待这篇文章?
爱它
有趣的
不适合我