批量还原Wordpress上所有帖子的修订版

时间:2018-06-21 02:39:00

标签: wordpress

是否有一个wordpress插件可以根据日期或位置一次恢复多个帖子的修订?

我有一个被黑的网站,每个帖子都在其中被更改。为了使所有内容整洁,我需要将所有帖子还原到5或6天前在线的任何修订版本。

谢谢!

1 个答案:

答案 0 :(得分:0)

老实说,对于一个遭到黑客入侵的网站,最好的选择是从“干净”的时间恢复数据库/ MySQL备份,或者只是手动还原它们。

也就是说,WordPress确实允许您使用wp_get_post_revisions()检索修订。

  

注意:这是复数函数,单数函数wp_get_post_revision()通过其ID进行修订。除非您知道所需的修订版ID是什么,否则您就不需要此函数。复数函数将获取帖子的所有修订版。

现在,在继续阅读之前-备份您的网站。

您备份了吗?

确保您有备份。

此外,请确保它可以正常工作。

现在,您已备份 ...

看看我想出的这个函数,它结合使用wp_get_post_revisions()wp_update_post()。同样,请确保在运行此功能之前先进行备份。它会弄乱帖子和帖子内容,如果停顿/死掉,可能会变得混乱。 使用后果自负

  • 首先,通过访问https://yoursite.com/?restore_revisions=so_50959583_restore_revisions确保您希望运行此功能。它需要该查询字符串才能运行。
  • 然后确保当前用户具有管理员级别特权。
  • 然后它会检查此函数是否已经运行过,因此不会每次都运行。
  • 现在,它运行标准的WP_Query来抓取所有posts。注意,我省略了其他帖子类型,可以根据需要添加这些帖子类型。
  • 在循环内部,它检查是否存在修订版本,如果存在,则使用wp_update_post将帖子更新为修订后的post_content
  • 如果它在此处失败,它将死于一条消息,以防止设置我们在一开始就检查过的标志。
  • 假设它运行平稳,它会设置so_50959583_restore_revisions_flag选项标志,因此它将不再运行。
  • 这时,您应该删除代码。
  • 注意,您可以删除选项标志,并将其设置为自定义插件,然后从register_activation_hook开始运行该功能。

因此,这是最好用于说明性目的的野兽,使用它的风险自负。

add_action( 'init', 'so_50959583_restore_revisions' );
function so_50959583_restore_revisions(){
    if( isset( $_GET['restore_revisions'] ) && $_GET['restore_revisions'] == 'so_50959583_restore_revisions' ){
        if( current_user_can( 'manage_options' ) ){
            if( !get_option( 'so_50959583_restore_revisions_flag' ) ){
                // This hasn't run before, run it now.
                $args = array(
                    'post_type' => 'post', // Limit to just posts
                    'posts_per_page' => -1
                );

                $revision_query = new WP_Query( $args );

                if( $revision_query->have_posts() ){
                    while( $revision_query->have_posts() ){
                        $revision_query->the_post();

                        if( $last_revision = array_shift( wp_get_post_revisions( $post->ID ) ) ){
                            // At least one revision existed.
                            $reverted_post = array(
                                'ID' => get_the_ID(), // Update current post in query
                                'post_content' => $last_revision->post_content // set content to previous content
                            );

                            // Update the existing post
                            if( !wp_update_post( $reverted_post ) ){
                                wp_die( 'Something went wrong' );
                            }
                        }
                    }

                    wp_reset_postdata();
                }

                // Whew, completed!
                update_option( 'so_50959583_restore_revisions_flag', true );
            }
        }
    }
}
  

我想再次强调一下,最好的选择是使用许多可用的插件(并且通常是免费的)来保留数据库的备份,以防止发生此类问题。

最后,如果您只有20到30个帖子,则应该手动完成。而且,如果您有10,000个帖子,则可能需要在“大块”中使用此代码,否则可能会超时。

祝你好运