web-dev-qa-db-ja.com

Wpdbを使用して別のデータベースに接続する

wpdbを他のデータベースに接続したいのですが。インスタンスを作成し、それにデータベース名/ユーザー名/パスワードを渡すにはどうすればよいですか?

ありがとう

80
Wadih M.

はい、可能です。

Wpdbオブジェクトは、あらゆるデータベースへのアクセスおよびあらゆるテーブルの照会に使用できます。 Wordpress関連である必要はまったくありません。これは非常に興味深いことです。

利点はget_resultsなどのようなすべてのwpdbクラスと関数を使うことができるということです。そうすればホイールを作り直す必要はありません。

方法は次のとおりです。

$mydb = new wpdb('username','password','database','localhost');
$rows = $mydb->get_results("select Name from my_table");
echo "<ul>";
foreach ($rows as $obj) :
   echo "<li>".$obj->Name."</li>";
endforeach;
echo "</ul>";
133
Wadih M.

WordPressでは2番目のデータベースへの接続は簡単です。WPDBクラスの新しいインスタンスを作成し、それを私たち全員が知っていて愛する標準の$ wpdbインスタンスを使用するのと同じ方法で使用するだけです。

2番目のデータベースがメインのWPと同じログイン情報を持っていると仮定すると、ログイン情報のハードコーディングを避けるためにwp-config.phpからの定義済み定数を使うことさえできます。

/**
 * Instantiate the wpdb class to connect to your second database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_Host);
/**
 * Use the new database object just like you would use $wpdb
 */
$results = $second_db->get_results($your_query);
29
jerclarke

誰もこれを言っていないので、私はもっと簡単な方法を追加したいと思いました。

あなたの追加データベースがあなたのワードプレスデータベースと同じユーザー/パスの詳細を持っている限り、あなたはこのようなテーブル名の前にデータベース名を使うことができます。

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
21
CommentLuv

私はまだコメントできませんが、Wadih M.の答え(これは素晴らしいです)を拡張したいと思いました。

WPのデータベースクラスは、Justin VincentのezSQLをカスタマイズしたものです。あなたがインターフェースが好きで、あなたがWordPressベースではないサイトをしたいと思うなら、あなたはそれをチェックアウトしたいかもしれません: http://justinvincent.com/ezsql

7
gabrielk

これらは機能しますが、get_post_customやwordpressクエリなどの「その他の」カスタム機能を使用することはできなくなります。簡単な解決策は

$wpdb->select('database_name');

これはデータベースをシステム全体で変更します(mysql select_db)。 database.tableメソッドは、単純なクエリを作成するだけの場合は機能しますが、他のWordpressブログにアクセスする場合はselectを使用できます。作業が終わったら元に戻す必要があるでしょう。そうしないとブログが奇妙なことをするかもしれません。

6
user4533

2つのブログを更新する必要がある親サイトから2番目のブログデータベースに接続するのに$wpdbを使用するのに苦労していました。 $wpdb->select($dbname, $dbh)を使って2番目のデータベースを選択しましたが、それでも最初のデータベースから結果が得られていました。

2番目のデータベースでWP関数を呼び出す前に、wp_cache_flush()を呼び出してWordPressキャッシュをクリアすることで問題を解決しました。

4
Matt