WordPress的大多数CMS迁移/数据导入工具都依赖于对原始数据类型的某种程度的访问和存储,例如与帖子、作者和评论相关的离散数据,然后这些数据可以相当直接地翻译成WordPress的对应数据。由于在每篇文章的post_content
.
由于这是一种不寻常的情况,因此我不熟悉任何预打包的解决方案,这些解决方案将在很大程度上促进这一功能。要将数据移动到WordPress中,每个人都会发布HTMLpost_content
必须解析以提取相关数据,以便将其插入WordPress。
有许多不同的方法可以实现实际的迁移逻辑。利用类似WP-CLI的功能,甚至只是利用您站点的REST API, 你可以用任何你觉得合适的语言来写逻辑。但我假设您打算编写一个迁移脚本,该脚本将在您的WordPress环境中执行。
update_post_meta( $post->ID, \'wpse392841_import_complete`, true );
元价值还将使您能够利用
WP_Query
\'s meta query args 为了检索尚未处理的帖子选择:
$import_query = new WP_Query(
[
\'post_type\' => \'post\',
\'posts_per_page\' => 30,
\'meta_key\' => \'wpse392841_import_complete\',
\'meta_compare\' => \'NOT_EXISTS\'
]
);
foreach( $import_query->posts as $post ) {
// TODO: parse data out of comments, insert as WordPress comments, update post
// with comments removed from `post_content`.
}
批处理
如果您有大量内容,您可能希望通过查询和循环更少的每个脚本执行来将更新分为更小的批-这将有助于减少您超出脚本执行时间限制的可能性,这可能会导致;“腐败”;如果执行在不合适的时间终止,则导入的一部分。
有多种方法可以在Web服务器/PHP的约束下执行这种批处理逻辑。一种流行的选择是让服务器端代码使用参数向自己的服务器发出异步HTTP请求,这些参数将再次执行相同的逻辑。因此,您可以将脚本设置为继续调用自身,直到没有其他帖子需要处理为止。WordPress\'s HTTP API 可用于此目的。
解析标记
要解析迁移循环中的实际标记,虽然您可以使用正则表达式,但考虑到要提取的内容量,我可能会使用真正的HTML解析器—可能
PHP\'s DOM/DOMDocument. (如果由于某种原因,最终在Node.js程序中执行迁移,
cheerio 是一个很棒的HTML解析包。它的速度不是很快,但很容易使用,并允许您使用jQuery约定与虚拟DOM交互)。
通过检查其中一条博客评论的标记,我们可以看到您必须处理的数据类型,以形成评论:
<div id="comment-header">
<div id="c2244642925767684880" class="comment-author">
<div id="comment-profile-image">
<div class="avatar-image-container avatar-stock">
<span dir="ltr">
<a id="av-1-08118927101030203407" class="avatar-hovercard" href="http://www.blogger.com/profile/08118927101030203407" rel="nofollow">
<img title="Joe Shmoe" alt="" width="16" height="16" nitro-lazy-src="https://cdn-daadn.nitrocdn.com/BKAyEzJMnNySFeYkTTGiHLTpuWRtPoXh/assets/static/optimized/img/c2dc8e1cb1b6f022685269de299214d3.b16-rounded.gif" class=" ls-is-cached lazyloaded" nitro-lazy-empty="" id="NDcxOjMyNw==-1" src="https://cdn-daadn.nitrocdn.com/BKAyEzJMnNySFeYkTTGiHLTpuWRtPoXh/assets/static/optimized/img/c2dc8e1cb1b6f022685269de299214d3.b16-rounded.gif">
</a>
</span>
</div>
</div>
<div id="comment-name-url">
<a class="comments-autor-name">Joe Shmoe</a> <a class="says">says:</a>
</div>
<div id="comment-date">
<span class="comment-timestamp">
<a class="comment-permalink">November 4, 2009 at 4:15 PM</a>
</span>
</div>
<div id="comment-body">
<div style="clear:both;"> </div>
<p class="comment-body" style="padding-right:10px;">Lorem ipsum dolor sit amet</p>
</div>
</div>
</div>
在这里,我们可以看到有一个作者姓名,可能是一个作者URL和头像URL,如果作者有一个Blogger配置文件、时间戳和帖子正文。所有这些数据都很容易;“可寻址”;由于每个数据段使用相应的HTML类,因此使用HTML解析器。
不幸的是,从整体上看注释的标记部分,每个注释都是彼此的兄弟,并且没有详细说明任何子/父关系。您将无法基于单独可用的标记重建注释线程。
执行一次性逻辑最后,关于实际写入和执行这种;“一次性”;代码,我不知道有什么强大的约定。我唯一需要考虑的是不要将其附加到钩子或其他可能执行每页加载的方式,或者在任何时候,除非您显式触发它。过去我用过一个习惯admin_post_{custom action name}
为了达到这个目的,我没有必要对我的方法进行标准化,可能还有更好的地方。