Skip to:
Content

bbPress.org

Ticket #1548: bbp-vanilla-importer.diff

File bbp-vanilla-importer.diff, 20.3 KB (added by Nightgunner5, 11 years ago)
  • bbp-admin/bbp-admin.php

     
    306306
    307307                        // Load our importers
    308308                        // The logic here needs to be improved upon
    309                         $importers = apply_filters( 'bbp_importers', array( 'bbpress' ) );
     309                        $importers = apply_filters( 'bbp_importers', array( 'bbpress', 'phpbb', 'vanilla' ) );
    310310
    311311                        // Loop through included importers
    312312                        foreach ( $importers as $importer ) {
  • bbp-admin/importers/vanilla.php

     
     1<?php
     2
     3/**
     4 * Vanilla 2 Importer
     5 *
     6 * Helps in converting your Vanilla installation into bbPress
     7 *
     8 * @package bbPress
     9 * @subpackage Importer
     10 *
     11 * @todo Docs
     12 * @todo Role Mapping Options
     13*/
     14class Vanilla_Importer {
     15
     16        /**
     17         * @var string Path to Vanilla 2 configuration file (config.php)
     18         */
     19        var $config = '';
     20
     21        var $db = null;
     22
     23        function init_db() {
     24                @define( 'APPLICATION', 'bbPress' );
     25                @define( 'DS', '/' );
     26                @define( 'PATH_CACHE', dirname( dirname( $this->config ) ) . DS . 'cache' );
     27                require_once dirname( $this->config ) . '/config-defaults.php';
     28                require_once $this->config;
     29
     30                $this->db = new wpdb( $Configuration['Database']['User'], $Configuration['Database']['Password'],
     31                                $Configuration['Database']['Name'], $Configuration['Database']['Host'] );
     32                $this->db->tables = array( 'activity', 'activitytype', 'analyticslocal', 'category',
     33                                'comment', 'conversation', 'conversationmessage', 'discussion', 'draft',
     34                                'invitation', 'message', 'permission', 'photo', 'role', 'tag', 'tagdiscussion',
     35                                'user', 'userauthentication', 'userauthenticationnonce',
     36                                'userauthenticationprovider', 'userauthenticationtoken', 'usercomment',
     37                                'userconversation', 'userdiscussion', 'usermeta', 'userrole', 'zcategory',
     38                                'zcomment', 'zconversation', 'zconversationmessage', 'zdiscussion', 'zrole',
     39                                'zuser', 'zuserconversation', 'zuserrole' );
     40                $this->db->set_prefix( $Configuration['Database']['DatabasePrefix'] );
     41        }
     42
     43        function header() { ?>
     44
     45                <div class="wrap">
     46
     47                        <?php screen_icon(); ?>
     48
     49                        <h2><?php _e( 'Vanilla 2 Importer', 'bbpress' ); ?></h2>
     50
     51                        <?php
     52        }
     53
     54        /**
     55         * Output an error message with a button to try again.
     56         *
     57         * @param type $error
     58         * @param type $step
     59         */
     60        function throw_error( $error, $step ) {
     61                echo '<p><strong>' . $error->get_error_message() . '</strong></p>';
     62                echo $this->next_step( $step, __( 'Try Again', 'bbpress' ) );
     63        }
     64
     65        /**
     66         * Returns the HTML for a link to the next page
     67         *
     68         * @param type $next_step
     69         * @param type $label
     70         * @param type $id
     71         * @return string
     72         */
     73        function next_step( $next_step, $label, $id = 'vanilla-import-next-form' ) {
     74                $str  = '<form action="admin.php?import=vanilla" method="post" id="' . $id . '">';
     75                $str .= wp_nonce_field( 'bbp-vanilla-import', '_wpnonce', true, false );
     76                $str .= wp_referer_field( false );
     77                $str .= '<input type="hidden" name="step" id="step" value="' . esc_attr( $next_step ) . '" />';
     78                $str .= '<p><input type="submit" class="button" value="' . esc_attr( $label ) . '" /> <span id="auto-message"></span></p>';
     79                $str .= '</form>';
     80
     81                return $str;
     82        }
     83
     84        /**
     85         * Footer
     86         */
     87        function footer() { ?>
     88
     89                </div>
     90
     91                <?php
     92        }
     93
     94        /**
     95         * Dispatch
     96         */
     97        function dispatch() {
     98                if ( empty( $_REQUEST['step'] ) )
     99                        $step = 0;
     100                else
     101                        $step = (int) $_REQUEST['step'];
     102
     103                $this->header();
     104
     105                switch ( $step ) {
     106                        case -1 :
     107                                $this->cleanup();
     108                                // Intentional no break
     109
     110                        case 0 :
     111                                $this->greet();
     112                                break;
     113
     114                        case 1 :
     115                        case 2 :
     116                        case 3 :
     117
     118                                check_admin_referer( 'bbp-vanilla-import' );
     119                                $result = $this->{ 'step' . $step }();
     120
     121                                break;
     122                }
     123
     124                $this->footer();
     125        }
     126
     127        /**
     128         * Greet message
     129         */
     130        function greet() {
     131                global $wpdb, $bbdb; ?>
     132
     133                <div class="narrow">
     134
     135                        <form action="admin.php?import=vanilla" method="post">
     136
     137                                <?php wp_nonce_field( 'bbp-vanilla-import' ); ?>
     138
     139                                <?php if ( get_option( '_bbp_import_vanilla_path' ) ) : ?>
     140
     141                                        <input type="hidden" name="step" value="<?php echo esc_attr( get_option( '_bbp_import_vanilla_step' ) ); ?>" />
     142
     143                                        <p><?php _e( 'It looks like you attempted to convert your Vanilla installation previously and got interrupted.', 'bbpress' ); ?></p>
     144
     145                                        <p class="submit">
     146                                                <a href="<?php echo esc_url( add_query_arg( array( 'import' => 'vanilla', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-vanilla-import' ), '_wp_http_referer' => esc_attr( $_SERVER['REQUEST_URI'] ) ) ) ); ?>" class="button"><?php _e( 'Cancel &amp; start a new import', 'bbpress' ); ?></a>
     147                                                <input type="submit" class="button-primary" value="<?php esc_attr_e( 'Continue previous import', 'bbpress' ); ?>" />
     148                                        </p>
     149
     150                                <?php else : ?>
     151
     152                                        <input type="hidden" name="_bbp_import_vanilla_path" value="true" />
     153
     154                                        <p><?php _e( 'This importer allows you to convert your Vanilla 2 installation into bbPress.', 'bbpress' ); ?></p>
     155
     156                                        <h3><?php _e( 'Instructions', 'bbpress' ); ?></h3>
     157                                        <ol>
     158                                                <li><?php printf( __( 'Create a <a href="%s">backup</a> of your database and files. If the import process is interrupted for any reason, restore from that backup and re-run the import.', 'bbpress' ), 'http://codex.wordpress.org/WordPress_Backups' ); ?></li>
     159                                                <li><?php _e( 'Seriously... Go back everything up, and don\'t come back until that\'s done. If things go awry, it\'s possible this importer will not be able to complete and your forums will be lost in limbo forever. This is serious business. No, we\'re not kidding.', 'bbpress' ); ?></li>
     160                                                <li><?php _e( 'To reduce memory overhead and avoid possible conflicts please:', 'bbpress' ); ?>
     161                                                        <ol>
     162                                                                <li>
     163                                                                        <?php _e( 'Disable all plugins (except bbPress) on both your WordPress and Vanilla 2 installations.', 'bbpress' ); ?>
     164                                                                </li>
     165                                                                <li>
     166                                                                        <?php _e( 'Switch to a default WordPress theme.', 'bbpress' ); ?>
     167                                                                </li>
     168                                                        </ol>
     169                                                </li>
     170                                                <li><?php _e( 'Notes on compatibility:', 'bbpress' ); ?>
     171                                                        <ol>
     172                                                                <li>
     173                                                                        <?php _e( 'No plugins can currently be converted.', 'bbpress' ); ?>
     174                                                                </li>
     175                                                                <li>
     176                                                                        <?php _e( 'User roles are not currently converted.', 'bbpress' ); ?>
     177                                                                </li>
     178                                                        </ol>
     179                                                </li>
     180                                                <li><?php _e( 'This converter can be a drag on large forums with lots of existing topics and replies. If possible, do this import in a safe place (like a local installation.)', 'bbpress' ); ?></li>
     181                                        </ol>
     182
     183                                        <h3><?php _e( 'Configuration', 'bbpress' ); ?></h3>
     184                                        <p><?php _e( 'Enter the full path to your Vanilla configuration file i.e. <code>conf/config.php</code>:', 'bbpress' ); ?></p>
     185
     186                                        <table class="form-table">
     187                                                <tr>
     188                                                        <th scope="row"><label for="_bbp_import_vanilla_path"><?php _e( 'Vanilla Path:', 'bbpress' ); ?></label></th>
     189                                                        <td><input type="text" name="_bbp_import_vanilla_path" id="_bbp_import_vanilla_path" class="regular-text" value="<?php echo untrailingslashit( ABSPATH ) . DIRECTORY_SEPARATOR . 'forums' . DIRECTORY_SEPARATOR . 'conf' . DIRECTORY_SEPARATOR . 'config.php'; ?>" /></td>
     190                                                </tr>
     191                                        </table>
     192
     193                                        <p class="submit">
     194                                                <input type="hidden" name="step" value="1" />
     195                                                <input type="submit" class="button" value="<?php esc_attr_e( 'Proceed', 'bbpress' ); ?>" />
     196                                        </p>
     197
     198                                <?php endif; ?>
     199
     200                        </form>
     201
     202                </div>
     203                <?php
     204        }
     205
     206        /**
     207         * Cleanups all the options used by the importer
     208         */
     209        function cleanup() {
     210                global $wpdb;
     211
     212                delete_option( '_bbp_import_vanilla_path' );
     213                delete_option( '_bbp_import_vanilla_step' );
     214
     215                $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key = '_bbp_vanilla_user'" );
     216
     217                do_action( 'import_end' );
     218        }
     219
     220        /**
     221         * Technically the first half of step 1, this is separated to allow for AJAX
     222         * calls. Sets up some variables and options and confirms authentication.
     223         *
     224         * @return type
     225         */
     226        function setup() {
     227
     228                // Get details from _POST
     229                if ( !empty( $_POST['_bbp_import_vanilla_path'] ) ) {
     230
     231                        // Store details for later
     232                        $this->config = realpath( $_POST['_bbp_import_vanilla_path'] );
     233
     234                        // Update path
     235                        update_option( '_bbp_import_vanilla_path', $this->config );
     236
     237                // Get details from DB
     238                } else {
     239                        $this->config = get_option( '_bbp_import_vanilla_path' );
     240                }
     241
     242                // No config file found
     243                if ( empty( $this->config ) ) { ?>
     244
     245                        <p><?php _e( 'Please enter the path to your Vanilla configuration file - <code>config.php</code>.', 'bbpress' ); ?></p>
     246                        <p><a href="<?php echo esc_url( add_query_arg( array( 'import' => 'vanilla', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-vanilla-import' ), '_wp_http_referer' => esc_attr( remove_query_arg( 'step', $_SERVER['REQUEST_URI'] ) ) ) ) ); ?>" class="button"><?php _e( 'Go Back', 'bbpress' ); ?></a></p>
     247
     248                        <?php
     249
     250                        return false;
     251                }
     252
     253                // Check if the user submitted a directory as the path by mistake
     254                if ( is_dir( $this->config ) && file_exists( trailingslashit( $this->config ) . 'config.php' ) ) {
     255                        $this->config = trailingslashit( $this->config ) . 'config.php';
     256                }
     257
     258                // Check if the file exists
     259                if ( !file_exists( $this->config ) || is_dir( $this->config ) ) {
     260
     261                        delete_option( '_bbp_import_vanilla_path' ); ?>
     262
     263                        <p><?php _e( 'Vanilla configuration file <code>config.php</code> doesn\'t exist in the path specified! Please check the path and try again.', 'bbpress' ); ?></p>
     264                        <p><a href="<?php echo esc_url( add_query_arg( array( 'import' => 'vanilla', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-vanilla-import' ), '_wp_http_referer' => esc_attr( remove_query_arg( 'step', $_SERVER['REQUEST_URI'] ) ) ) ) ); ?>" class="button"><?php _e( 'Go Back', 'bbpress' ); ?></a></p>
     265
     266                        <?php
     267
     268                        return false;
     269                }
     270
     271                $this->init_db();
     272
     273                return true;
     274        }
     275
     276        /**
     277         * Convert users
     278         */
     279        function step1() {
     280
     281                update_option( '_bbp_import_vanilla_step', 1 );
     282
     283                // Set time limit to 0 to avoid time out errors
     284                set_time_limit( 0 );
     285
     286                if ( is_callable( 'ob_implicit_flush' ) )
     287                        ob_implicit_flush( true );
     288
     289                $setup = $this->setup();
     290                if ( empty( $setup ) ) {
     291                        return false;
     292                } elseif ( is_wp_error( $setup ) ) {
     293                        $this->throw_error( $setup, 1 );
     294                        return false;
     295                }
     296
     297                global $wpdb; ?>
     298
     299                <div id="bbpress-import-status">
     300
     301                        <h3><?php _e( 'Importing Users', 'bbpress' ); ?></h3>
     302                        <p><?php _e( 'We&#8217;re in the process of migrating your users...', 'bbpress' ); ?></p>
     303
     304                        <ol>
     305
     306                                <?php
     307                        $have_more = true;
     308                        $page = 0;
     309                        while ( $have_more ) {
     310                                $users = $this->db->get_results( $this->db->prepare(
     311                                        "SELECT UserID, Name, Password, Email, DateInserted FROM {$this->db->user}
     312                                        ORDER BY UserID ASC LIMIT %d, 200", $page * 200 ) );
     313
     314                                echo '<li>';
     315                                printf( __( 'Importing users #%1$d to #%2$d...', 'bbpress' ), $page * 200 + 1, $page * 200 + count( $users ) );
     316
     317                                foreach ( $users as $user ) {
     318                                        if ( !$id = email_exists( $user->Email ) )
     319                                                $id = wp_insert_user( array(
     320                                                        'user_login'      => $user->Name,
     321                                                        'user_pass'       => $user->Password,
     322                                                        'user_registered' => $user->DateInserted,
     323                                                        'user_email'      => $user->Email
     324                                                ) );
     325
     326                                        add_user_meta( $id, '_bbp_vanilla_user', $user->UserID, true );
     327                                }
     328
     329                                _e( '... Done!', 'bbpress' );
     330                                echo '</li>';
     331
     332                                if ( count( $users ) < 200 )
     333                                        $have_more = false;
     334                                $page++;
     335                        }
     336                                ?>
     337
     338                        </ol>
     339
     340                        <p><?php _e( 'Your users have all been imported, but wait &#8211; there&#8217;s more! Now we need to import your forums, topics and posts!', 'bbpress' ); ?></p>
     341                        <?php
     342
     343                        echo $this->next_step( 2, __( 'Import forums, topics and posts &raquo;', 'bbpress' ) ); ?>
     344
     345                </div>
     346
     347                <?php
     348        }
     349
     350        /**
     351         * Import forums, topics and posts
     352         */
     353        function step2() {
     354                do_action( 'import_start' );
     355
     356                set_time_limit( 0 );
     357                update_option( '_bbp_import_vanilla_step', 2 );
     358
     359                $setup = $this->setup();
     360                if ( empty( $setup ) ) {
     361                        return false;
     362                } elseif ( is_wp_error( $setup ) ) {
     363                        $this->throw_error( $setup, 3 );
     364                        return false;
     365                }
     366
     367                global $wpdb, $bbp; ?>
     368
     369                        <div id="bbpress-import-status">
     370
     371                        <h3><?php _e( 'Importing Forums, Topics And Posts', 'bbpress' ); ?></h3>
     372                        <p><?php  _e( 'We&#8217;re importing your Vanilla forums, topics and replies...', 'bbpress' ); ?></p>
     373
     374                        <ol>
     375
     376                                <?php
     377
     378                                if ( !$forums = $this->db->get_results( "SELECT CategoryID, ParentCategoryID, Sort, AllowDiscussions,
     379                                                        Name, UrlCode, Description FROM {$this->db->category} WHERE CategoryID != -1 ORDER BY TreeLeft ASC" ) ) {
     380                                        echo "<li><strong>" . __( 'No forums were found!', 'bbpress' ) . "</strong></li></ol>\n";
     381                                        return;
     382                                }
     383
     384                                echo "<li>" . sprintf( __( 'Total number of forums: %s', 'bbpress' ), count( $forums ) ) . "</li>\n";
     385
     386                                $forum_map     = array();
     387                                $user_map      = array();
     388
     389                                $users = $wpdb->get_results( "SELECT user_id, meta_value FROM {$wpdb->usermeta} WHERE meta_key = '_bbp_vanilla_user'" );
     390                                foreach ( $users as $user ) {
     391                                        $user_map[$user->meta_value] = $user->user_id;
     392                                }
     393                                unset( $users ); // Allow PHP to free up some memory
     394
     395                                foreach ( (array) $forums as $forum ) {
     396                                        echo "<li>" . sprintf( __( 'Processing forum #%1$s (%2$s)', 'bbpress' ), $forum->CategoryID, esc_html( $forum->Name ) ) . "\n<ul>\n";
     397
     398                                        // Insert the forum and add it to the map.
     399                                        $inserted_forum      =  wp_insert_post( array(
     400                                                'post_author'    => get_current_user_id(),
     401                                                'post_content'   => $forum->Description,
     402                                                'post_title'     => $forum->Name,
     403                                                'post_name'      => $forum->UrlCode,
     404                                                'post_excerpt'   => '',
     405                                                'post_status'    => 'publish',
     406                                                'comment_status' => 'closed',
     407                                                'ping_status'    => 'closed',
     408                                                'post_parent'    => $forum->ParentCategoryID != -1 ? $forum_map[$forum->ParentCategoryID] : 0,
     409                                                'post_type'      => bbp_get_forum_post_type(),
     410                                                'menu_order'     => $forum->Sort
     411                                        ) );
     412
     413                                        $forum_map[$forum->CategoryID] = $inserted_forum;
     414
     415                                        if ( !empty( $inserted_forum ) && !is_wp_error( $inserted_forum ) ) {
     416                                                echo "<li>" . sprintf( __( 'Added the forum as forum #<a href="%1$s">%2$s</a>', 'bbpress' ), get_permalink( $inserted_forum ), $inserted_forum ) . "</li>\n";
     417                                        } else {
     418                                                echo "<li><em>" . __( 'There was a problem in adding the forum.', 'bbpress' ) . "</em></li></ul></li>\n";
     419                                                continue;
     420                                        }
     421
     422                                        $topics = $this->db->get_results( $this->db->prepare(
     423                                                "SELECT DiscussionID, InsertUserID, Name, Body, Closed, Announce, DateInserted
     424                                                FROM {$this->db->discussion} WHERE CategoryID = %d", $forum->CategoryID ) );
     425
     426                                        // In standalone, categories can have topics, but this is not the case in plugin
     427                                        // So make the forum category if it doesn't have topics
     428                                        // Else close it if it's a category and has topics
     429                                        if ( $forum->AllowDiscussions == 0 ) {
     430
     431                                                if ( count( $topics ) == 0 ) {
     432                                                        bbp_categorize_forum( $inserted_forum );
     433                                                        echo "<li>" . __( 'The forum is a category and has no topics.', 'bbpress' ) . "</li>\n</ul>\n</li>";
     434
     435                                                        continue;
     436                                                } else {
     437                                                        bbp_close_forum( $inserted_forum );
     438                                                        echo "<li>" . __( 'The forum is a category but has topics, so it has been set as closed on the new board.', 'bbpress' ) . "</li>\n";
     439                                                }
     440
     441                                        }
     442
     443                                        echo "<li>" . sprintf( __( 'Total number of topics in the forum: %s', 'bbpress' ), count( $topics ) ) . "</li>\n";
     444
     445                                        foreach ( (array) $topics as $topic ) {
     446                                                // If the topic is public, check if it's open and set the status accordingly
     447                                                $topic_status       =  $topic->Closed == 0 ? 'publish' : $bbp->closed_status_id;
     448
     449                                                $inserted_topic     =  wp_insert_post( array(
     450                                                        'post_parent'   => $inserted_forum,
     451                                                        'post_author'   => $user_map[$topic->InsertUserID],
     452                                                        'post_content'  => $topic->Body,
     453                                                        'post_title'    => $topic->Name,
     454                                                        'post_name'     => sanitize_title_with_dashes( $topic->Name ),
     455                                                        'post_status'   => $topic_status,
     456                                                        'post_date_gmt' => $topic->DateInserted,
     457                                                        'post_date'     => get_date_from_gmt( $topic->DateInserted ),
     458                                                        'post_type'     => bbp_get_topic_post_type()
     459                                                ) );
     460
     461                                                if ( !empty( $inserted_topic ) && !is_wp_error( $inserted_topic ) ) {
     462
     463                                                        // Forum topic meta
     464                                                        update_post_meta( $inserted_topic, '_bbp_forum_id', $inserted_forum );
     465                                                        update_post_meta( $inserted_topic, '_bbp_topic_id', $inserted_topic );
     466
     467                                                        $replies        = 0;
     468                                                        $last_reply     = 0;
     469                                                        $post           = null;
     470
     471                                                        $posts = $this->db->get_results( $this->db->prepare(
     472                                                                "SELECT CommentID, InsertUserID, Body, DateInserted FROM {$this->db->comment}
     473                                                                WHERE DiscussionID = %d ORDER BY DateInserted ASC", $topic->DiscussionID ) );
     474
     475                                                        $reply_title =  sprintf( __( 'Reply To: %s', 'bbpress' ), $topic->Name );
     476
     477                                                        foreach ( (array) $posts as $post ) {
     478
     479                                                                $last_reply         =  wp_insert_post( array(
     480                                                                        'post_parent'   => $inserted_topic,
     481                                                                        'post_author'   => $user_map[$post->InsertUserID],
     482                                                                        'post_date_gmt' => $post->DateInserted,
     483                                                                        'post_date'     => get_date_from_gmt( $post->DateInserted ),
     484                                                                        'post_title'    => $reply_title,
     485                                                                        'post_name'     => sanitize_title_with_dashes( $reply_title ),
     486                                                                        'post_status'   => 0,
     487                                                                        'post_type'     => bbp_get_reply_post_type(),
     488                                                                        'post_content'  => $post->Body
     489                                                                ) );
     490
     491                                                                // Reply Parents
     492                                                                update_post_meta( $last_reply, '_bbp_forum_id', $inserted_forum );
     493                                                                update_post_meta( $last_reply, '_bbp_topic_id', $inserted_topic );
     494
     495                                                                bbp_update_reply_walker( $last_reply );
     496
     497                                                                $replies++;
     498                                                        }
     499
     500                                                        // Topic stickiness
     501                                                        switch ( $topic->Announce ) {
     502
     503                                                                // Sticky
     504                                                                case 1 :
     505                                                                        bbp_stick_topic( $inserted_topic );
     506                                                                        break;
     507
     508                                                                // Announce
     509                                                                case 2 :
     510                                                                        bbp_stick_topic( $inserted_topic, true );
     511                                                                        break;
     512                                                        }
     513
     514                                                        // Last active
     515                                                        $last_active_id   = !empty( $last_reply ) ? $last_reply         : $inserted_topic;
     516                                                        $last_active_time = !empty( $post       ) ? $post->DateInserted : $topic->DateInserted;
     517
     518                                                        // Reply topic meta
     519                                                        update_post_meta( $inserted_topic, '_bbp_last_reply_id',      $last_reply       );
     520                                                        update_post_meta( $inserted_topic, '_bbp_last_active_id',     $last_active_id   );
     521                                                        update_post_meta( $inserted_topic, '_bbp_last_active_time',   $last_active_time );
     522                                                        update_post_meta( $inserted_topic, '_bbp_reply_count',        $replies          );
     523                                                        update_post_meta( $inserted_topic, '_bbp_hidden_reply_count', 0                 );
     524
     525                                                        // Voices will be done by recount
     526
     527                                                        bbp_update_topic_walker( $inserted_topic );
     528
     529                                                        echo "<li>"     . sprintf( __( 'Added topic #%1$s (%2$s) as topic #<a href="%3$s">%4$s</a> with %5$s replies.', 'bbpress' ), $topic->DiscussionID, esc_html( $topic->Name ), get_permalink( $inserted_topic ), $inserted_topic, $replies ) . "</li>\n";
     530                                                } else {
     531                                                        echo "<li><em>" . sprintf( __( 'There was a problem in adding topic #1$s (%2$s).', 'bbpress' ), $topic->DiscussionID, esc_html( $topic->Name ) ) . "</em></li></ul></li>\n";
     532                                                        continue;
     533                                                }
     534                                        }
     535
     536                                        echo "</ul>\n</li>\n";
     537
     538                                } ?>
     539
     540                        </ol>
     541
     542                        <?php
     543
     544                        // Clean up database and we're out
     545                        $this->cleanup();
     546                        do_action( 'import_done', 'vanilla' );
     547
     548                        ?>
     549
     550                        <p><strong><?php printf( __( 'Your forums, topics and posts have all been imported, but wait &#8211; there&#8217;s more! Now we need to do a <a href="%s">recount</a> to get the counts in sync! Yes, we&#8217;re bad at Math.', 'bbpress' ), add_query_arg( array( 'page' => 'bbp-recount' ), get_admin_url( 0, 'tools.php' ) ) ); ?></strong></p>
     551
     552                        <h4><?php printf( __( 'After that it\'s all done. <a href="%s">Have fun!</a> :)', 'bbpress' ), home_url() ); ?></h4>
     553
     554                </div>
     555
     556                <?php
     557        }
     558
     559} // class Vanilla_Importer
     560
     561$vanilla_import = new Vanilla_Importer();
     562
     563register_importer( 'vanilla', __( 'Vanilla 2', 'bbpress' ), __( 'Import your Vanilla 2 board.', 'bbpress' ), array( $vanilla_import, 'dispatch' ) );