下面是一个示例函数,可以帮助您完成类似的操作。基本上,它所做的就是获取几个帖子,循环浏览它们,修改post_content
字段并存储更改。
function wpse_87695_clean_post_content() {
$posts = get_posts(array(
\'post_type\' => array(\'post\', \'page\'),
\'post_status\' => \'publish\',
/*
\'meta_query\' => array(
array(
\'key\' => \'_wpse_87695_processed\',
\'value\' => true,
\'compare\' => \'!=\'
)
),
*/
));
foreach ($posts as $p) {
$p->post_content = wpse_87695_filter_content($p->post_content);
wp_update_post($p);
// update_post_meta($p->ID, \'_wpse_87695_processed\', true);
}
die();
}
add_action(\'wp\', \'wpse_87695_clean_post_content\');
function wpse_87695_filter_content($content) {
return strip_tags($content); // wp_filter_nohtml_kses might be a more WordPress-friendly way to do this
}
首先,您不想优化
get_posts
参数,使其仅返回需要清理的帖子。您可能还想限制帖子的数量,因为您可能无法同时处理800篇帖子
set_time_limit
可以帮助增加一次可以处理的帖子数量,具体取决于您的配置。
理想情况下,您还希望以某种方式标记已处理的帖子,例如使用update_post_meta
, 因为这将允许您使用meta_query
参数数组中的关键字。这样,您可以一次处理50篇帖子,重新加载页面,直到所有帖子都处理完毕。我在我的示例代码中对其进行了注释,因为我认为它需要更多的工作。
由于内存消耗和执行时间的限制,在共享托管环境中执行这项工作可能会非常慢,而且很可能在某个时候(由于人为错误),您会损坏数据并不得不重新开始,您会在备份数据库上运行,最好是在本地计算机上运行。
另一种方法是设置一个小javascript,从管理员的某个地方加载某个URL,而不是一次运行上述一篇文章,直到所有文章都被处理完毕,这样就不必成批运行转换。
此外,我提供的过滤器功能(wpse_87695_filter_content
), 正如你所看到的,是非常初级的。它所做的就是运行strip_html()
在post\\u内容中删除其中的所有HTML。根据您的具体需要,您可能必须使用正则表达式或HTML解析器。例如,您可能需要删除多余的换行符,并确保段落仅由两个换行符连接。
另一种解决方案是在WordPress输出数据时执行过滤。当你打电话的时候the_content
WordPress将在您的模板中获取$post->post_content
并使用apply_filters(\'the_content\', \'$post->post_content\')
. 这允许您通过调用add_filter(\'the_content\', \'wpse_87695_filter_content\');
.
虽然这种方法可以避免迭代所有帖子和手动更新数据库的麻烦,但在编写一个好的过滤函数时,也需要同样的努力。此外,它将在每次显示帖子时运行,并且对于与当前导入完全无关的帖子运行,除非您定义了某种形式的异常。因此,根据数据的性质,它可以被视为更快速的修复方法。也许您可以将最重要的筛选存储在数据库中,并保留其中一些,如果这在某种程度上对您有帮助的话,可以使用WordPress筛选器来处理。