过滤/删除所有帖子和页面上的HTML元素

时间:2013-02-20 作者:Derek

我正在进行从Drupal到WP的迁移。数据库转换和导入进行得很顺利,但每个帖子内容中都有很多“垃圾”,比如带有内联样式的div。基本上,在每个帖子(超过800篇)中,我需要对它们进行排序,删除所有div标签,但保留div标签之间的实际内容。

例如,一篇包含以下内容的帖子:

<div class="contentHeader" style="clear: both; min-height: 40px; margin: 12px 0px 9px 9px; color: #f16000; font-family: Arial; font-size: 16px; font-weight: bold; text-align: left;">
<div class="title entry-title" style="font-family: Arial; font-size: 24px; line-height: 22px; color: #f16000;"><span style="font-size: 13px; color: #333333; font-family: \'Trebuchet MS\', Arial, Helvetica, sans-serif;">Dear Neil: I am 55, and find myself single all over again. Trying to find a relationship is radically different than it was when I was in my 20s. I want to remarry, but it\'s harder to date at this age, and it is very difficult to evaluate whether someone would be compatible with me. I know I\'m not as “hot” as I used to be, and the people I\'m meeting aren\'t likely to win “sexiest man alive” contests anytime soon as well. Is there anything that could help me evaluate whether someone is a good potential intimate partner for me? There are millions of us in the second half of our lives trying to find each other. Can you help?</span>
<div class="articlemain" style="min-height: 1365px; color: #333333; font-family: \'Trebuchet MS\', Arial, Helvetica, sans-serif; text-align: left;">
<div class="hnews hentry item">
<div class="content" style="font-size: 13px; padding: 17px 0px 17px 9px;">
<div class="entry-content">
<div class="articleparagraph">More content.....
</div>
</div>
</div>
</div>
</div>
</div>
</div>
我需要运行某种脚本(使用regex?)这将删除“垃圾”,但将文本保留在div和span标记之间:

Dear Neil: I am 55, and find myself single all over again. Trying to find a relationship     is radically different than it was when I was in my 20s. I want to remarry, but it\'s harder to date at this age, and it is very difficult to evaluate whether someone would be compatible with me. I know I\'m not as “hot” as I used to be, and the people I\'m meeting aren\'t likely to win “sexiest man alive” contests anytime soon as well. Is there anything that could help me evaluate whether someone is a good potential intimate partner for me? There are millions of us in the second half of our lives trying to find each other. Can you help?

More content.....
关于实现这一目标的最佳方法有什么想法吗?非常感谢您的帮助。

1 个回复
SO网友:Simon

下面是一个示例函数,可以帮助您完成类似的操作。基本上,它所做的就是获取几个帖子,循环浏览它们,修改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筛选器来处理。

结束

相关推荐

将WordPress附件导入wp-Content/Uploads/中的自定义目录

我希望有人能阐明我试图解决的这个问题,即使只是简单地改变我的思维过程,告诉我如何解决这个问题。我正在将一个基于CakePHP的定制CMS web应用程序导入WordPress,方法是遍历数据库,进行大量SQL查询,构建数组,最后输出必要的XML文件,以便使用WordPress导入工具导入。目前我已经很好地导入了类别、标签和帖子/页面,没有问题,但问题似乎出在图像上。基于CakePHP的CMS中当前的图像格式是images/year/month/day/post_id/image_name.ext据我所知,