This question can be found all around the web.
The problem position is that you need to retrieve data from a third-party Database or a third-party WordPress System.
Most people use in this case a new instance of the wpdb class. This gives you the possibility to run general queries and all possibilities of the wpdb class.
/** * Switch to third-party database by using the WordPress wpdb class */ $my_wpdb = new wpdb('username', 'password', 'database', 'host');
In most scenarios this way is sufficient, even if we have an other instance in our runtime.
But if you are connected to a third-party WordPress System, wouldn’t it be nice to use also the whole functionality auf the WordPress core system?
This can be made easy by using just a simple function, that forces your whole WordPress System to run with the third-party Database. Then you are still be able to use all WP functions like get_post, etc. to retrieve data from the third-party system.
First you should define the third-party database connection data as Constants in your wp-config file. You can also just replace the constants with the values directly in the function.
/** The name of the third-party database */ define('THIRD_PARTY_DB_NAME', ''); /** MySQL third-party database username */ define('THIRD_PARTY_DB_USER', ''); /** MySQL third-party database password */ define('THIRD_PARTY_DB_PASSWORD', ''); /** MySQL third-party hostname */ define('THIRD_PARTY_DB_HOST', ''); /** Set WP-DB Prefix of the third-party WordPress System */ define('THIRD_PARTY_DB_PREFIX', '');
Now we build up the function to switch to the third-party database and back (use your favorite prefix):
/** * prefix_switch_wpdb * * Switch to third-party Database * Detect active Database Connection if not given * Override global wpdb to work with all WordPress Functions on third-party databas * Flush WordPress Cache to ReInit Database Connection * * @param string $direction *optional vars 'wp' => home system, 'third_party' => third-party system * @return void */ function prefix_switch_wpdb($direction = '') { global $wpdb, $table_prefix; if(empty($direction)) $direction = $table_prefix == $wpdb->prefix && DB_NAME == $wpdb->dbname ? 'third_party' : 'wp'; switch($direction) { case 'wp': $wpdb = new \wpdb( DB_USER, DB_PASSWORD, DB_NAME, DB_HOST ); $wpdb->set_prefix( $table_prefix ); break; case 'third_party': $wpdb = new \wpdb( THIRD_PARTY_DB_USER, THIRD_PARTY_DB_PASSWORD, THIRD_PARTY_DB_NAME, THIRD_PARTY_DB_HOST ); $wpdb->set_prefix( THIRD_PARTY_DB_PREFIX ); break; } wp_cache_flush(); }
With calling the function prefix_switch_wpdb() you are connected to another database and use the global $wpdb object to make general queries.
To return to the Host WordPress System just call prefix_switch_wpdb() again.
If the optional $direction value is not set, the function detects wether you are connected to a third-party system or not. If connected to another database, you return automaticly to your home system by calling the function.
Two easy examples how to use:
/** * Switch to third-party database and just use $wpdb object */ // First Query $siteurl = $wpdb->get_row("SELECT option_value FROM " . $wpdb->prefix . "options WHERE option_name = 'siteurl'"); echo siteurl->option_value; // will deliver your current siteurl. // switch database and run the query again prefix_switch_wpdb(); $siteurl = $wpdb->get_row("SELECT option_value FROM " . $wpdb->prefix . "options WHERE option_name = 'siteurl'"); echo siteurl->option_value; // the result is the siteurl from the third-party database // switch database and run the query again prefix_switch_wpdb(); $siteurl = $wpdb->get_row("SELECT option_value FROM " . $wpdb->prefix . "options WHERE option_name = 'siteurl'"); echo siteurl->option_value; // the result delivers as used your current siteurl. /** * Switch to third-party database and just Use WordPress functionality * If you are connected to another WordPress system, you can youse all WordPress functions */ // First function call echo get_option('siteurl'); // will deliver your current siteurl. // switch database and call get_option('siteurl') again prefix_switch_wpdb(); echo get_option('siteurl'); // the result is the siteurl from the third-party WordPress System // switch database ahain and call get_option('siteurl') prefix_switch_wpdb(); echo get_option('siteurl'); // the result delivers as used your current siteurl.