Skip to:
Content

bbPress.org

Ticket #1523: import_proto.2.diff

File import_proto.2.diff, 33.9 KB (added by GautamGupta, 13 years ago)

Please take a look at @todos

  • bbp-admin.php

     
    9393                // Add the settings
    9494                add_action( 'admin_init',    array( $this, 'register_admin_settings' ) );
    9595
     96                // Add the importers
     97                add_action( 'admin_init',    array( $this, 'register_importers'      ) );
     98
    9699                // Forums 'Right now' Dashboard widget
    97100                add_action( 'wp_dashboard_setup', array( $this, 'dashboard_widget_right_now' ) );
    98101
     
    246249        }
    247250
    248251        /**
     252         * Register the importers
     253         *
     254         * @todo Make this better
     255         *
     256         * @since bbPress (r2737)
     257         *
     258         * @uses do_action() Calls 'bbp_register_importers'
     259         */
     260        function register_importers() {
     261
     262                // Leave if we're not in the import section
     263                if ( !defined( 'WP_LOAD_IMPORTERS' ) )
     264                        return;
     265
     266                global $bbp;
     267
     268                // Load Importer API
     269                require_once( ABSPATH . 'wp-admin/includes/import.php' );
     270
     271                // Load our importers
     272                // The logic here needs to be improved upon
     273                $importers = apply_filters( 'bbp_importers', array( 'bbpress' ) );
     274
     275                foreach ( $importers as $importer ) {
     276                        $import_file = $bbp->plugin_dir . 'bbp-admin/importers/' . $importer . '.php';
     277                        if ( file_exists( $import_file ) )
     278                                require_once( $import_file );
     279                }
     280
     281                do_action( 'bbp_register_importers' );
     282        }
     283
     284        /**
    249285         * Admin area activation notice
    250286         *
    251287         * Shows a nag message in admin area about the theme not supporting bbPress
  • importers/bbpress.php

     
     1<?php
     2
     3/**
     4 * bbPress Standalone Importer
     5 *
     6 * Helps in converting your bbPress Standalone into the new bbPress Plugin
     7 *
     8 * @package bbPress
     9 * @subpackage Importer
     10 *
     11 * @todo Docs
     12 * @todo User Mapping (ref. MT Importer)
     13*/
     14class bbPress_Importer {
     15
     16        /**
     17         * @var string Path to bbPress standalone
     18         */
     19        var $bb_path = '';
     20
     21        /**
     22         * @var bool Are we debugging?
     23         */
     24        var $debug = true;
     25
     26        /**
     27         * Returns the tag name from tag object
     28         *
     29         * @param object $tag Tag Object
     30         * @return string Tag name
     31         */
     32        function get_tag_name( $tag ) {
     33                return $tag->name;
     34        }
     35
     36        /**
     37         * Simple check to check if the WP and bb user tables are integrated or not
     38         *
     39         * @return bool True if integrated, false if not
     40         */
     41        function is_integrated() {
     42                global $bbdb, $wpdb;
     43
     44                return ( $wpdb->users == $bbdb->users && $wpdb->usermeta == $bbdb->usermeta );
     45        }
     46
     47        /**
     48         * Tries to automatically locate the bbPress standalone install path
     49         *
     50         * @return string Path, if found
     51         */
     52        function autolocate_bb_path() {
     53
     54                $path      = '';
     55                $dirs      = array( 'forum', 'forums', 'board', 'discussion', 'bb', 'bbpress' );
     56                $base      = trailingslashit( ABSPATH );
     57                $base_dirs = array( $base, dirname( $base ) );
     58
     59                foreach ( $dirs as $dir ) {
     60
     61                        foreach ( $base_dirs as $base_dir ) {
     62                                $test_path = $base_dir . $dir . '/bb-load.php';
     63
     64                                if ( file_exists( $test_path ) ) {
     65                                        $path = $test_path;
     66                                        break;
     67                                }
     68                        }
     69
     70                }
     71
     72                return $path;
     73        }
     74
     75        /**
     76         * Get the bbPress standalone topic favoriters from topic id
     77         *
     78         * @param int $topic_id Topic id
     79         * @return array Topic Favoriters' IDs
     80         */
     81        function bb_get_topic_favoriters( $topic_id = 0 ) {
     82                if ( empty( $topic_id ) )
     83                        return array();
     84
     85                global $bbdb;
     86
     87                return (array) $bbdb->get_col( $bbdb->prepare( "SELECT user_id
     88                                FROM $bbdb->usermeta
     89                                WHERE meta_key = '{$bbdb->prefix}favorites'
     90                                AND FIND_IN_SET( %d, meta_value ) > 0",
     91                                $topic_id ) );
     92        }
     93
     94        /**
     95         * Get the bbPress standalone topic subscribers from topic id
     96         *
     97         * If the Subscribe to Topic bbPress plugin is active, then subscription
     98         * info is taken from that. Otherwise, if the the user is using
     99         * bbPress >= 1.1 alpha, then get the info from there.
     100         *
     101         * @param int $topic_id Topic id
     102         * @return array Topic Subscribers' IDs
     103         */
     104        function bb_get_topic_subscribers( $topic_id = 0 ) {
     105                if ( empty( $topic_id ) )
     106                        return array();
     107
     108                global $bbdb, $subscribe_to_topic;
     109
     110                $users = array();
     111
     112                // The user is using Subscribe to Topic plugin by _ck_, get the subscribers from there
     113                if ( !empty( $subscribe_to_topic ) && !empty( $subscribe_to_topic['db'] ) ) {
     114                        $users = $bbdb->get_col( $bbdb->prepare( "SELECT user
     115                                FROM {$subscribe_to_topic['db']}
     116                                WHERE topic = %d
     117                                AND type = 2", $topic_id ) );
     118
     119                // The user is using alpha, get the subscribers from built-in functionality
     120                } elseif ( function_exists( 'bb_notify_subscribers' ) ) {
     121                        $users = $bbdb->get_col( $bbdb->prepare( "SELECT `$bbdb->term_relationships`.`object_id`
     122                                FROM $bbdb->term_relationships, $bbdb->term_taxonomy, $bbdb->terms
     123                                WHERE `$bbdb->term_relationships`.`term_taxonomy_id` = `$bbdb->term_taxonomy`.`term_taxonomy_id`
     124                                AND `$bbdb->term_taxonomy`.`term_id` = `$bbdb->terms`.`term_id`
     125                                AND `$bbdb->term_taxonomy`.`taxonomy` = 'bb_subscribe'
     126                                AND `$bbdb->terms`.`slug` = 'topic-%d'",
     127                                $topic_id ) );
     128                }
     129
     130                return (array) $users;
     131        }
     132
     133        function header() { ?>
     134
     135                <div class="wrap">
     136
     137                        <?php screen_icon(); ?>
     138
     139                        <h2><?php _e( 'bbPress Standalone Importer', 'bbpress' ); ?></h2>
     140
     141                        <?php
     142        }
     143
     144        /**
     145         * Output an error message with a button to try again.
     146         *
     147         * @param type $error
     148         * @param type $step
     149         */
     150        function throw_error( $error, $step ) {
     151                echo '<p><strong>' . $error->get_error_message() . '</strong></p>';
     152                echo $this->next_step( $step, __( 'Try Again', 'bbpress' ) );
     153        }
     154
     155        /**
     156         * Returns the HTML for a link to the next page
     157         *
     158         * @param type $next_step
     159         * @param type $label
     160         * @param type $id
     161         * @return string
     162         */
     163        function next_step( $next_step, $label, $id = 'bbpress-import-next-form' ) {
     164                $str  = '<form action="admin.php?import=bbpress" method="post" id="' . $id . '">';
     165                $str .= wp_nonce_field( 'bbpress-import', '_wpnonce', true, false );
     166                $str .= wp_referer_field( false );
     167                $str .= '<input type="hidden" name="step" id="step" value="' . esc_attr( $next_step ) . '" />';
     168                $str .= '<p><input type="submit" class="button" value="' . esc_attr( $label ) . '" /> <span id="auto-message"></span></p>';
     169                $str .= '</form>';
     170
     171                return $str;
     172        }
     173
     174        /**
     175         * Automatically submit the specified form after $seconds
     176         * Include a friendly countdown in the element with id=$msg
     177         * @param type $id
     178         * @param type $msg
     179         * @param type $seconds
     180         */
     181        function auto_submit( $id = 'bbpress-import-next-form', $msg = 'auto-message', $seconds = 10 ) {
     182                ?><script type="text/javascript">
     183                        next_counter = <?php echo $seconds ?>;
     184                        jQuery(document).ready(function(){
     185                                bbp_bbpress_msg();
     186                        });
     187
     188                        function bbp_bbpress_msg() {
     189                                str = '<?php echo esc_js( _e( "Continuing in %d&#8230;" , 'bbpress' ) ); ?>';
     190                                jQuery( '#<?php echo $msg ?>' ).html( str.replace( /%d/, next_counter ) );
     191                                if ( next_counter <= 0 ) {
     192                                        if ( jQuery( '#<?php echo $id ?>' ).length ) {
     193                                                jQuery( "#<?php echo $id ?> input[type='submit']" ).hide();
     194                                                str = '<?php echo esc_js( __( "Continuing&#8230;" , 'bbpress' ) ); ?> <img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" alt="" id="processing" align="top" />';
     195                                                jQuery( '#<?php echo $msg ?>' ).html( str );
     196                                                jQuery( '#<?php echo $id ?>' ).submit();
     197                                                return;
     198                                        }
     199                                }
     200                                next_counter = next_counter - 1;
     201                                setTimeout('bbp_bbpress_msg()', 1000);
     202                        }
     203                </script><?php
     204        }
     205
     206        /**
     207         * Footer
     208         */
     209        function footer() { ?>
     210
     211                </div>
     212
     213                <?php
     214        }
     215
     216        /**
     217         * Dispatch
     218         */
     219        function dispatch() {
     220                if ( empty( $_REQUEST['step'] ) )
     221                        $step = 0;
     222                else
     223                        $step = (int) $_REQUEST['step'];
     224
     225                $this->header();
     226
     227                switch ( $step ) {
     228                        case -1 :
     229                                $this->cleanup();
     230                                // Intentional no break
     231
     232                        case 0 :
     233                                $this->greet();
     234                                break;
     235
     236                        case 1 :
     237                        case 2 :
     238
     239                                check_admin_referer( 'bbp-bbpress-import' );
     240                                $result = $this->{ 'step' . $step }();
     241
     242                                break;
     243                }
     244
     245                $this->footer();
     246        }
     247
     248        /**
     249         * Greet message
     250         */
     251        function greet() {
     252                global $wpdb, $bbdb;
     253
     254                $autolocate = $this->autolocate_bb_path();
     255                $radio      = 'user';
     256
     257                ?>
     258
     259                <div class="narrow">
     260
     261                        <form action="admin.php?import=bbpress" method="post">
     262
     263                                <?php wp_nonce_field( 'bbp-bbpress-import' ); ?>
     264
     265                                <?php if ( get_option( 'bbp_bbpress_path' ) ) : ?>
     266
     267                                        <input type="hidden" name="step" value="<?php echo esc_attr( get_option( 'bbp_bbpress_step' ) ); ?>" />
     268
     269                                        <p><?php _e( 'It looks like you attempted to convert your bbPress standalone previously and got interrupted.', 'bbpress' ); ?></p>
     270
     271                                        <p class="submit">
     272                                                <input type="submit" class="button" value="<?php esc_attr_e( 'Continue previous import', 'bbpress' ); ?>" />
     273                                        </p>
     274
     275                                        <p class="submitbox"><a href="<?php echo esc_url( add_query_arg( array( 'import' => 'bbpress', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-bbpress-import' ), '_wp_http_referer' => esc_attr( $_SERVER['REQUEST_URI'] ) ) ) ); ?>" class="deletion submitdelete"><?php _e( 'Cancel &amp; start a new import', 'bbpress' ); ?></a></p>
     276
     277                                <?php else : ?>
     278
     279                                        <input type="hidden" name="bbp_bbpress_path" value="true" />
     280
     281                                        <p><?php _e( 'Howdy! This importer allows you to convert your bbPress Standalone into the bbPress Plugin.', 'bbpress' ); ?></p>
     282                                        <p><?php _e( 'Please enter the path to your bbPress standalone install, where you\'d find your <code>bb-load.php</code>:', 'bbpress' ); ?></p>
     283
     284                                        <table class="form-table">
     285
     286                                                <tr>
     287                                                        <th scope="row"><label for="bbp_bbpress_path"><?php _e( 'bbPress Standalone Path', 'bbpress' ); ?></label></th>
     288                                                        <td><input type="text" name="bbp_bbpress_path" id="bbp_bbpress_path" class="regular-text" value="<?php echo $autolocate; ?>" /></td>
     289                                                </tr>
     290
     291                                        </table>
     292
     293                                        <?php if ( !empty( $autolocate ) ) : ?>
     294                                                <p><?php _e( 'We tried to autolocate the path to your bbPress install and were successful. Yes, we\'re smart. ;)', 'bbpress' ); ?></p>
     295                                        <?php endif; ?>
     296
     297                                        <ol>
     298
     299                                                <li><?php printf( __( 'Make sure that you\'ve created a <a href="%s">backup</a> of your database and files just in case something goes wrong. If the import process is interrupted for any reason, please restore your backup and re-run the import.', 'bbpress' ), 'http://codex.wordpress.org/WordPress_Backups' ); ?></li>
     300                                                <li><?php _e( 'This converter is heavy and consumes too much CPU, so it is suggested that you do the process on your local machine. '); ?></li>
     301                                                <li><?php _e( 'Notes on compatibility:', 'bbpress' ); ?>
     302                                                        <ul>
     303                                                                <li>
     304                                                                        <?php printf( __( 'If you have the <a href="%s">Subscribe to Topic</a> plugin active, then the script would migrate the user subscriptions from that plugin. If you\'re using the alpha version of bbPress 1.1 (or later), then subscriptions would be fetched from the built-in functionality, but please disable Subscribe to Topic plugin (if you have that activated) for this to happen.', 'bbpress' ), 'http://bbpress.org/plugins/topic/subscribe-to-topic/' ); ?>
     305                                                                </li>
     306                                                        </ul>
     307                                                </li>
     308                                                <li>
     309                                                        <?php _e( 'Disable each and every other plugin, on WordPress and bbPress standalone both. Also, please switch to the default themes to avoid conflicts. You must let the bbPress plugin on WordPress remain active.', 'bbpress' ); ?>
     310                                                </li>
     311
     312                                                <li><strong><?php _e( 'Proceed', 'bbpress' ); ?></strong>:
     313
     314                                                        <ul>
     315
     316                                                                <?php if ( $this->is_integrated() ) : $radio = 'board'; ?>
     317
     318                                                                        <li><?php _e( 'It looks like your WordPress and bbPress user tables are integrated, therefore you can directly proceed to <label for="step_board">importing forums, topics and posts section</label> and don\'t need to go through the process of migrating your users. If you feel that you have a bit different setup, then you can choose that option below.', 'bbpress' ); ?></li>
     319
     320                                                                <?php endif; ?>
     321
     322                                                                <li>
     323                                                                        <?php _e( 'Your WordPress blog is <strong>new</strong> and you don\'t have the fear of losing WordPress users:', 'bbpress' ); ?>
     324                                                                        <label for="step_user"><?php _e( 'Go to migrating users section.', 'bbpress' ); ?></label>
     325                                                                        <?php printf( __( '<strong>Note</strong>: The WordPress %1$s and %2$s tables would be renamed, but not deleted so that you could restore them if something goes wrong.', 'bbpress' ), $wpdb->users, $wpdb->usermeta ); ?>
     326                                                                        <?php printf( __( 'Please ensure there are no tables with names %1$s and %2$s so that there is no problem in renaming.', 'bbpress' ), $bbdb->prefix . $wpdb->users . '_tmp', $bbdb->prefix . $wpdb->usermeta . '_tmp' ); ?>
     327                                                                        <?php _e( 'Also, your WordPress and bbPress installs must be in the same database.', 'bbpress' ); ?>
     328                                                                </li>
     329
     330                                                                <li>
     331                                                                        <?php _e( 'You\'re done with user migration or have the user tables <strong>integrated</strong>:', 'bbpress' ); ?>
     332                                                                        <label for="step_board"><?php _e( 'Proceed to importing forums, topics and posts section.', 'bbpress' ); ?></label>
     333                                                                </li>
     334
     335                                                                <li>
     336                                                                        <?php _e( 'You have a well <strong>established</strong> WordPress user base, the user tables are not integrated and you can\'t lose your users:', 'bbpress' ); ?>
     337                                                                        <?php _e( 'This is currently not yet supported, and will likely not be in the future also as it is highly complex to merge two user sets (which might even conflict).', 'bbpress' ); ?>
     338                                                                        <?php printf( __( 'But, patches are always <a href="%s" title="The last revision containing the custom user migration code">welcome</a>. :)', 'bbpress' ), 'http://code.google.com/p/bbpress-standalone-to-plugin/source/browse/trunk/bbs2p.php?spec=svn13&r=13' ); ?>
     339                                                                </li>
     340
     341                                                        </ul>
     342
     343                                                </li>
     344
     345                                        </ol>
     346
     347                                        <input type="radio" name="step" value="1"<?php checked( $radio, 'user'  ); ?> id="step_user" />
     348                                        <label for="step_user"><?php _e( 'Migrate Users', 'bbpress' ); ?></label>
     349
     350                                        <input type="radio" name="step" value="2"<?php checked( $radio, 'board' ); ?> id="step_board" />
     351                                        <label for="step_board"><?php _e( 'Import Forums, Topics & Posts', 'bbpress' ); ?></label>
     352
     353                                        <p class="submit">
     354                                                <input type="submit" class="button" value="<?php esc_attr_e( 'Convert!', 'bbpress' ); ?>" />
     355                                        </p>
     356
     357                                <?php endif; ?>
     358
     359                        </form>
     360
     361                </div>
     362                <?php
     363        }
     364
     365        /**
     366         * Cleanups all the options used by the importer
     367         */
     368        function cleanup() {
     369                delete_option( 'bbp_bbpress_path' );
     370                delete_option( 'bbp_bbpress_step' );
     371
     372                do_action( 'import_end' );
     373        }
     374
     375        //
     376        /**
     377         * Technically the first half of step 1, this is separated to allow for AJAX
     378         * calls. Sets up some variables and options and confirms authentication.
     379         *
     380         * @return type
     381         */
     382        function setup() {
     383                // Get details from form or from DB
     384                if ( !empty( $_POST['bbp_bbpress_path'] ) ) {
     385                        // Store details for later
     386                        $this->bb_path = $_POST['bbp_bbpress_path'];
     387
     388                        update_option( 'bbp_bbpress_path', $this->bb_path );
     389                } else {
     390                        $this->bb_path = get_option( 'bbp_bbpress_path' );
     391                }
     392
     393                remove_filter( 'pre_post_status', 'bb_bozo_pre_post_status', 5, 3 );
     394
     395                if ( empty( $this->bb_path ) ) { ?>
     396
     397                        <p><?php _e( 'Please enter the path to your bbPress loader file (<code>bb-load.php</code>).', 'bbpress' ); ?></p>
     398                        <p><a href="<?php echo esc_url( add_query_arg( array( 'import' => 'bbpress', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-bbpress-import' ), '_wp_http_referer' => esc_attr( remove_query_arg( 'step', $_SERVER['REQUEST_URI'] ) ) ) ) ); ?>"><?php _e( 'Start again', 'bbpress' ); ?></a></p>
     399
     400                        <?php
     401
     402                        return false;
     403                }
     404
     405                // Check if the file exists
     406                if ( !file_exists( $this->bb_path ) ) {
     407
     408                        delete_option( 'bbp_bbpress_path' ); ?>
     409
     410                                <p><?php _e( 'bbPress loader file (<code>bb-load.php</code>) doesn\'t exist in the path specified! Please check the path and try again.', 'bbpress' ); ?></p>
     411                                <p><a href="<?php echo esc_url( add_query_arg( array( 'import' => 'bbpress', 'step' => '-1', '_wpnonce' => wp_create_nonce( 'bbp-bbpress-import' ), '_wp_http_referer' => esc_attr( remove_query_arg( 'step', $_SERVER['REQUEST_URI'] ) ) ) ) ); ?>"><?php _e( 'Start again', 'bbpress' ); ?></a></p>
     412                                <?php
     413                                return false;
     414                } else {
     415                        require_once( $this->bb_path );
     416                }
     417
     418                return true;
     419        }
     420
     421        /**
     422         * Check form inputs and start importing users
     423         *
     424         * @return type
     425         */
     426        function step1() {
     427                do_action( 'import_start' );
     428
     429                // Set time limit to 0 to avoid time out errors
     430                set_time_limit( 0 );
     431
     432                if ( is_callable( 'ob_implicit_flush' ) )
     433                        ob_implicit_flush( true );
     434
     435                update_option( 'bbp_bbpress_step', 1 );
     436
     437                $setup = $this->setup();
     438                if ( empty( $setup ) ) {
     439                        return false;
     440                } elseif ( is_wp_error( $setup ) ) {
     441                        $this->throw_error( $setup, 1 );
     442                        return false;
     443                }
     444
     445                global $wpdb, $bbdb;
     446
     447                ?>
     448
     449                <div id="bbpress-import-status">
     450
     451                        <h3><?php _e( 'Importing Users', 'bbpress' ); ?></h3>
     452                        <p><?php _e( 'We&#8217;re in the process of migrating your users...', 'bbpress' ); ?></p>
     453
     454                        <ol>
     455
     456                                <?php
     457
     458                                // Drop the old temp tables while debugging
     459                                if ( $this->debug == true )
     460                                        $wpdb->query( "DROP TABLE IF EXISTS {$bbdb->prefix}{$wpdb->users}_tmp, {$bbdb->prefix}{$wpdb->usermeta}_tmp" );
     461
     462                                // Rename the WordPress users and usermeta table
     463
     464                                ?>
     465
     466                                <li>
     467                                        <?php
     468                                        if ( $wpdb->query( "RENAME TABLE $wpdb->users TO {$bbdb->prefix}{$wpdb->users}_tmp, $wpdb->usermeta TO {$bbdb->prefix}{$wpdb->usermeta}_tmp" ) !== false ) : ?>
     469                                                <?php printf( __( 'Renamed the <code>%1$s</code> and <code>%2$s</code> tables to <code>%3$s</code> and <code>%4$s</code> respectively.', 'bbpress' ), $wpdb->users, $wpdb->usermeta, $bbdb->prefix . $wpdb->users . '_tmp', $bbdb->prefix . $wpdb->usermeta . '_tmp' ); ?>
     470                                        <?php else : ?>
     471                                                <?php printf( __( 'There was a problem dropping the <code>%1$s</code> and <code>%2$s</code> tables. Please check and re-run the script or rename or drop the tables yourself.', 'bbpress' ), $wpdb->users, $wpdb->usermeta ); ?></li></ol>
     472                                        <?php break; endif; ?>
     473                                </li>
     474
     475                                <?php /* Duplicate the WordPress users and usermeta table */ ?>
     476
     477                                <li>
     478                                        <?php if ( $wpdb->query( "CREATE TABLE $wpdb->users    ( `ID` BIGINT( 20 )       UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `user_activation_key` VARCHAR( 60 ) NOT NULL DEFAULT '', KEY ( `user_login` ), KEY( `user_nicename` ) ) SELECT * FROM $bbdb->users    ORDER BY `ID`"       ) !== false ) : ?>
     479                                                <?php printf( __( 'Created the <code>%s</code> table and copied the users from bbPress.', 'bbpress' ), $wpdb->users ); ?>
     480                                        <?php else : ?>
     481                                                <?php printf( __( 'There was a problem duplicating the table <code>%1$s</code> to <code>%2$s</code>. Please check and re-run the script or duplicate the table yourself.', 'bbpress' ), $bbdb->users, $wpdb->users ); ?></li></ol>
     482                                        <?php break; endif; ?>
     483                                </li>
     484
     485                                <li>
     486                                        <?php if ( $wpdb->query( "CREATE TABLE $wpdb->usermeta ( `umeta_id` BIGINT( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,                                                          KEY ( `user_id` ),    KEY( `meta_key` )      ) SELECT * FROM $bbdb->usermeta ORDER BY `umeta_id`" ) !== false ) : ?>
     487                                                <?php printf( __( 'Created the <code>%s</code> table and copied the user information from bbPress.', 'bbpress' ), $wpdb->usermeta ); ?>
     488                                        <?php else : ?>
     489                                                <?php printf( __( 'There was a problem duplicating the table <code>%1$s</code> to <code>%2$s</code>. Please check and re-run the script or duplicate the table yourself.', 'bbpress' ), $bbdb->usermeta, $wpdb->usermeta ); ?></li></ol>
     490                                        <?php break; endif; ?>
     491                                </li>
     492
     493                                <?php
     494
     495                                // Map the user roles by our wish
     496                                $roles_map = array(
     497                                        'keymaster'     => 'administrator',
     498                                        'administrator' => 'bbp_moderator',
     499                                        'moderator'     => 'bbp_moderator',
     500                                        'member'        => get_option( 'default_role' ),
     501                                        'inactive'      => get_option( 'default_role' ),
     502                                        'blocked'       => get_option( 'default_role' ),
     503                                        'throttle'      => 'throttle'
     504                                );
     505
     506                                $wp_user_level_map = array(
     507                                        'administrator' => 10,
     508                                        'editor'        => 7,
     509                                        'author'        => 2,
     510                                        'contributor'   => 1,
     511                                        'subscriber'    => 0,
     512                                        'throttle'      => 0
     513                                );
     514
     515                                // Apply the WordPress roles to the new users based on their bbPress roles
     516                                wp_cache_flush();
     517                                $users = get_users( array( 'fields' => 'all_with_meta', 'orderby' => 'ID' ) );
     518
     519                                foreach ( $users as $user ) {
     520
     521                                        // Get the bbPress roles
     522                                        $bb_roles =& $user->{ $bbdb->prefix . 'capabilities' };
     523                                        $converted_roles = $converted_level = array();
     524
     525                                        // Loop through each role the user has
     526                                        foreach ( $bb_roles as $bb_role => $bb_role_value ) {
     527
     528                                                // If we have one of those in our roles map, add the WP counterpart in the new roles array
     529                                                if ( $roles_map[strtolower( $bb_role )] && !empty( $bb_role_value ) ) {
     530                                                        $converted_roles[$roles_map[strtolower( $bb_role )]] = true;
     531
     532                                                        // Have support for deprecated levels too
     533                                                        $converted_level[] = $wp_user_level_map[$roles_map[strtolower( $bb_role )]];
     534
     535                                                        // We need an admin for future use
     536                                                        if ( empty( $admin_user ) && 'administrator' == $roles_map[strtolower( $bb_role )] )
     537                                                                $admin_user = $user;
     538                                                }
     539
     540                                        }
     541
     542                                        // If we have new roles, then update the user meta
     543                                        if ( count( $converted_roles ) ) {
     544                                                update_user_meta( $user->ID, $wpdb->prefix . 'capabilities', $converted_roles        );
     545                                                update_user_meta( $user->ID, $wpdb->prefix . 'user_level',   max( $converted_level ) );
     546                                        }
     547
     548                                }
     549
     550                                if ( empty( $admin_user ) || is_wp_error( $admin_user ) ) : /* I ask why */ ?>
     551
     552                                        <li>
     553                                                <?php _e( 'There was a problem in getting an administrator of the blog. Now, please go to your blog, set a user as administrator, login as that user and directly go to importing forums, topics and replies section. Note that old logins won\'t work, you would have to edit your database (you can still try logging in as the bbPress keymaster).', 'bbpress' ); ?>
     554                                        </li>
     555
     556                                </ol>
     557
     558                                <?php
     559
     560                                break;
     561
     562                                endif;
     563
     564                                // Logout the user as it won't have any good privileges for us to do the work
     565                                wp_clear_auth_cookie();
     566
     567                                // Login the admin so that we have permissions for conversion etc
     568                                wp_set_auth_cookie( $admin_user->ID );
     569
     570                                // Set the current user
     571                                wp_set_current_user( $admin_user->ID, $admin_user->user_login );
     572
     573                                ?>
     574
     575                                <li>
     576                                        <?php printf( __( 'User roles have been successfully mapped based. The bbPress keymaster is WordPress administrator, bbPress administrator and moderators are moderators and rest all WordPress roles are %1$s. Now, you can only login into your WordPress blog by the bbPress credentials. For the time being, you have been logged in as the first available administrator (Username: %2$s, User ID: %3$s).', 'bbpress' ), get_option( 'default_role' ), $admin_user->user_login, $admin_user->ID ); ?>
     577                                </li>
     578
     579                        </ol>
     580
     581                        <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>
     582                        <?php
     583
     584                        echo $this->next_step( 2, __( 'Import by forums, topics and posts &raquo;', 'bbpress' ) );
     585                        $this->auto_submit(); ?>
     586
     587                </div>
     588
     589                <?php
     590        }
     591
     592        /**
     593         * Import forums, topics and posts
     594         */
     595        function step2() {
     596                do_action( 'import_start' );
     597
     598                set_time_limit( 0 );
     599                update_option( 'bbp_bbpress_step', 2 );
     600                $this->bb_path = get_option( 'bbp_bbpress_path' ); ?>
     601
     602                        <div id="bbpress-import-status">
     603
     604                        <h3><?php _e( 'Importing Forums, Topics And Posts', 'bbpress' ); ?></h3>';
     605                        <p><?php  _e( 'We&#8217;re importing your bbPress standalone forums, topics and replies...', 'bbpress' ); ?></p>
     606
     607                        <ol>
     608
     609                                <?php
     610
     611                                if ( !$forums = bb_get_forums() ) {
     612                                        echo "<li><strong>" . __( 'No forums were found!', 'bbpress' ) . "</strong></li></ol>\n";
     613                                        break;
     614                                }
     615
     616                                if ( $this->debug == true )
     617                                        echo "<li>" . sprintf( __( 'Total number of forums: %s', 'bbpress' ), count( $forums ) ) . "</li>\n";
     618
     619                                $forum_map     = array();
     620                                $post_statuses = array( 'publish', $bbp->trash_status_id, $bbp->spam_status_id );
     621
     622                                foreach ( (array) $forums as $forum ) {
     623                                        echo "<li>" . sprintf( __( 'Processing forum #%1$s (<a href="%2$s">%3$s</a>)', 'bbpress' ), $forum->forum_id, get_forum_link( $forum->forum_id ), esc_html( $forum->forum_name ) ) . "\n<ul>\n";
     624
     625                                        // Insert the forum and add it to the map.
     626                                        $inserted_forum      =  wp_insert_post( array(
     627                                                'post_author'    => get_current_user_id(),
     628                                                'post_content'   => $forum->forum_desc,
     629                                                'post_title'     => $forum->forum_name,
     630                                                'post_excerpt'   => '',
     631                                                'post_status'    => 'publish',
     632                                                'comment_status' => 'closed',
     633                                                'ping_status'    => 'closed',
     634                                                'post_name'      => $forum->forum_slug,
     635                                                'post_parent'    => !empty( $forum->forum_parent ) ? $forum_map[$forum->forum_parent] : 0,
     636                                                'post_type'      => bbp_get_forum_post_type(),
     637                                                'menu_order'     => $forum->forum_order
     638                                        ) );
     639
     640                                        $forum_map[$forum->forum_id] = $inserted_forum;
     641
     642                                        if ( !empty( $inserted_forum ) && !is_wp_error( $inserted_forum ) ) {
     643                                                echo "<li>" . sprintf( __( 'Added the forum as forum #<a href="%1$s">%3$s</a>', 'bbpress' ), get_permalink( $inserted_forum ), $inserted_forum ) . "</li>\n";
     644                                        } else {
     645                                                echo "<li><em>" . __( 'There was a problem in adding the forum.', 'bbpress' ) . "</em></li></ul></li>\n";
     646                                                continue;
     647                                        }
     648
     649                                        $topics_query = new BB_Query( 'topic', array(
     650                                                'forum_id'     => $forum->forum_id,
     651                                                'per_page'     => -1,
     652                                                'topic_status' => 'all'
     653                                        ) );
     654
     655                                        $topics = $topics_query->results;
     656
     657                                        // In standalone, categories can have topics, but this is not the case in plugin
     658                                        // So make the forum category if it doesn't have topics
     659                                        // Else close it if it's a category and has topics
     660                                        if ( bb_get_forum_is_category( $forum->forum_id ) ) {
     661
     662                                                if ( count( $topics ) == 0 ) {
     663                                                        bbp_categorize_forum( $inserted_forum );
     664                                                        echo "<li>" . __( 'The forum is a category and has no topics.', 'bbpress' ) . "</li>\n</ul>\n</li>";
     665
     666                                                        continue;
     667                                                } else {
     668                                                        bbp_close_forum( $inserted_forum );
     669                                                        echo "<li>" . __( 'The forum is a category but has topics, so it has been set as closed on the new board.', 'bbpress' ) . "</li>\n";
     670                                                }
     671
     672                                        }
     673
     674                                        bb_cache_first_posts( $topics );
     675
     676                                        if ( $this->debug == true )
     677                                                echo "<li>" . sprintf( __( 'Total number of topics in the forum: %s', 'bbpress' ), count( $topics ) ) . "</li>\n";
     678
     679                                        foreach ( (array) $topics as $topic ) {
     680                                                $first_post         =  bb_get_first_post( $topic->topic_id );
     681
     682                                                // If the topic is public, check if it's open and set the status accordingly
     683                                                $topic_status       =  $topic->topic_status == 0 ? ( $topic->topic_open == 0 ? $bbp->closed_status_id : $post_statuses[$topic->topic_status] ) : $post_statuses[$topic->topic_status];
     684
     685                                                $inserted_topic     =  wp_insert_post( array(
     686                                                        'post_parent'   => $inserted_forum,
     687                                                        'post_author'   => $topic->topic_poster,
     688                                                        'post_content'  => $first_post->post_text,
     689                                                        'post_title'    => $topic->topic_title,
     690                                                        'post_name'     => $topic->topic_slug,
     691                                                        'post_status'   => $topic_status,
     692                                                        'post_date_gmt' => $topic->topic_start_time,
     693                                                        'post_date'     => get_date_from_gmt( $topic->topic_start_time ),
     694                                                        'post_type'     => bbp_get_topic_post_type(),
     695                                                        'tax_input'     => array( 'topic-tag' => array_map( 'bbs2p_get_tag_name', bb_get_public_tags( $topic->topic_id ) ) )
     696                                                ) );
     697
     698                                                if ( !empty( $inserted_topic ) && !is_wp_error( $inserted_topic ) ) {
     699
     700                                                        // Loginless Posting
     701                                                        if ( $topic->topic_poster == 0 ) {
     702                                                                update_post_meta( $inserted_topic, '_bbp_anonymous_name',    bb_get_post_meta( 'post_author', $first_post->post_id ) );
     703                                                                update_post_meta( $inserted_topic, '_bbp_anonymous_email',   bb_get_post_meta( 'post_email',  $first_post->post_id ) );
     704                                                                update_post_meta( $inserted_topic, '_bbp_anonymous_website', bb_get_post_meta( 'post_url',    $first_post->post_id ) );
     705                                                        }
     706
     707                                                        // Author IP
     708                                                        update_post_meta( $inserted_topic, '_bbp_author_ip', $first_post->poster_ip );
     709
     710                                                        // Forum topic meta
     711                                                        update_post_meta( $inserted_topic, '_bbp_forum_id', $inserted_forum );
     712                                                        update_post_meta( $inserted_topic, '_bbp_topic_id', $inserted_topic );
     713
     714                                                        $posts = bb_cache_posts( $bbdb->prepare( 'SELECT * FROM ' . $bbdb->posts . ' WHERE topic_id = %d AND post_id != %d ORDER BY post_time', $topic->topic_id, $first_post->post_id ) );
     715
     716                                                        $replies        = 0;
     717                                                        $hidden_replies = 0;
     718                                                        $last_reply     = 0;
     719                                                        $post           = null;
     720
     721                                                        foreach ( (array) $posts as $post ) {
     722
     723                                                                // Pingback
     724                                                                if ( $post->poster_id == 0 && $pingback_uri = bb_get_post_meta( 'pingback_uri', $post_id ) ) {
     725                                                                        $pingback = wp_insert_comment( wp_filter_comment( array(
     726                                                                                'comment_post_ID'    => $inserted_topic,
     727                                                                                'comment_author'     => bb_get_post_meta( 'pingback_title', $post->post_id ),
     728                                                                                'comment_author_url' => $pingback_uri,
     729                                                                                'comment_author_IP'  => $post->poster_ip,
     730                                                                                'comment_date_gmt'   => $post->post_time,
     731                                                                                'comment_date'       => get_date_from_gmt( $post->post_time ),
     732                                                                                'comment_content'    => $post->post_text,
     733                                                                                'comment_approved'   => $post->post_status == 0 ? 1 : ( $post->post_status == 2 ? 'spam' : 0 ),
     734                                                                                'comment_type'       => 'pingback'
     735                                                                        ) ) );
     736
     737                                                                // Normal post
     738                                                                } else {
     739                                                                        $reply_title        =  sprintf( __( 'Reply To: %s', 'bbpress' ), $topic->topic_title );
     740
     741                                                                        $last_reply         =  wp_insert_post( array(
     742                                                                                'post_parent'   => $inserted_topic,
     743                                                                                'post_author'   => $post->poster_id,
     744                                                                                'post_date_gmt' => $post->post_time,
     745                                                                                'post_date'     => get_date_from_gmt( $post->post_time ),
     746                                                                                'post_title'    => $reply_title,
     747                                                                                'post_name'     => sanitize_title_with_dashes( $reply_text ),
     748                                                                                'post_status'   => $post_statuses[$post->post_status],
     749                                                                                'post_type'     => bbp_get_reply_post_type(),
     750                                                                                'post_content'  => $post->post_text
     751                                                                        ) );
     752
     753                                                                        // Loginless
     754                                                                        if ( $post->poster_id == 0 ) {
     755                                                                                update_post_meta( $last_reply, '_bbp_anonymous_name',    bb_get_post_meta( 'post_author', $post->post_id ) );
     756                                                                                update_post_meta( $last_reply, '_bbp_anonymous_email',   bb_get_post_meta( 'post_email',  $post->post_id ) );
     757                                                                                update_post_meta( $last_reply, '_bbp_anonymous_website', bb_get_post_meta( 'post_url',    $post->post_id ) );
     758                                                                        }
     759
     760                                                                        // Author IP
     761                                                                        update_post_meta( $last_reply, '_bbp_author_ip', $post->poster_ip );
     762
     763                                                                        // Reply Parents
     764                                                                        update_post_meta( $last_reply, '_bbp_forum_id', $inserted_forum );
     765                                                                        update_post_meta( $last_reply, '_bbp_topic_id', $inserted_topic );
     766
     767                                                                        bbp_update_reply_walker( $last_reply );
     768                                                                }
     769
     770                                                                $replies++;
     771
     772                                                                if ( $post->post_status != 0 )
     773                                                                        $hidden_replies++;
     774                                                        }
     775
     776                                                        // Only add favorites and subscriptions if the topic is public
     777                                                        if ( in_array( $topic_status, array( 'publish', $bbp->closed_status_id ) ) ) {
     778
     779                                                                // Favorites
     780                                                                foreach ( (array) bbs2p_bb_get_topic_favoriters( $topic->topic_id )  as $favoriter  )
     781                                                                        bbp_add_user_favorite    ( $favoriter,  $inserted_topic );
     782
     783                                                                // Subscriptions
     784                                                                foreach ( (array) bbs2p_bb_get_topic_subscribers( $topic->topic_id ) as $subscriber )
     785                                                                        bbp_add_user_subscription( $subscriber, $inserted_topic );
     786                                                        }
     787
     788                                                        // Topic stickiness
     789                                                        switch ( $topic->topic_sticky ) {
     790
     791                                                                // Forum
     792                                                                case 1 :
     793                                                                        bbp_stick_topic( $inserted_topic );
     794                                                                        break;
     795
     796                                                                // Front
     797                                                                case 2 :
     798                                                                        bbp_stick_topic( $inserted_topic, true );
     799                                                                        break;
     800                                                        }
     801
     802                                                        // Last active time
     803                                                        $last_active = $post ? $post->post_time : $first_post->post_time;
     804
     805                                                        // Reply topic meta
     806                                                        update_post_meta( $inserted_topic, '_bbp_last_reply_id',      $last_reply                                 );
     807                                                        update_post_meta( $inserted_topic, '_bbp_last_active_id',     $last_reply ? $last_reply : $inserted_topic );
     808                                                        update_post_meta( $inserted_topic, '_bbp_last_active_time',   $topic->topic_time                          );
     809                                                        update_post_meta( $inserted_topic, '_bbp_reply_count',        $replies - $hidden_replies                  );
     810                                                        update_post_meta( $inserted_topic, '_bbp_hidden_reply_count', $hidden_replies                             );
     811                                                        // Voices will be done by recount
     812
     813                                                        bbp_update_topic_walker( $inserted_topic );
     814
     815                                                        echo "<li>" . sprintf( __( 'Added topic #%1$s (<a href="%2$s">%3$s</a>) as topic #<a href="%4$s">%5$s</a> with %6$s replies.', 'bbpress' ), $topic->topic_id, get_topic_link( $topic->topic_id ), esc_html( $topic->topic_title ), get_permalink( $inserted_topic ), $inserted_topic, $replies ) . "</li>\n";
     816                                                } else {
     817                                                        echo "<li><em>" . sprintf( __( 'There was a problem in adding topic #1$s (<a href="%2$s">%3$s</a>).', 'bbpress' ), $topic->topic_id, get_topic_link( $topic->topic_id ), esc_html( $topic->topic_title ) ) . "</em></li></ul></li>\n";
     818                                                        continue;
     819                                                }
     820                                        }
     821
     822                                        echo "</ul>\n</li>\n";
     823
     824                                } ?>
     825
     826                        </ol>
     827
     828                        <?php
     829
     830                        // Clean up database and we're out
     831                        $this->cleanup();
     832                        do_action( 'import_done', 'bbpress' );
     833
     834                        ?>
     835
     836                        <p><?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' ) ) ); ?></p>
     837
     838                        <h3><?php printf( __( 'After that it\'s all done. <a href="%s">Have fun!</a> :)', 'bbpress' ), home_url() ); ?></h3>
     839
     840                </div>
     841
     842                <?php
     843        }
     844
     845} // class bbPress_Importer
     846
     847$bbpress_import = new bbPress_Importer();
     848
     849register_importer( 'bbpress', __( 'bbPress Standalone', 'bbpress' ), __( 'Import your bbPress standalone board.', 'bbpress' ), array( $bbpress_import, 'dispatch' ) );
     850
     851?>