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


86

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

ありがとう


別のMySQLデータベース、または別のデータベースタイプ?それでも通常のWordPressデータベースにアクセスしたいのですか、それとも、あるDBから別のDBにサイトを移動していますか
EAMann

1
はい、別のMySQLデータベース。同じサーバー上の別個のDBであり、Wordpressのデータベースではありません。これはカスタムデータベースであり、wordpress内に表示したい情報があります。
ワディM.

1
$ wpdbオブジェクトを使用してこれを実行した場合、可能であれば、WordPressの残りの部分を既存のデータベースから切断します。したがって、推奨されません。別のオプションは、WordPressで使用されるEZSQLを使用して新しいインスタンスを作成することです。EZSQLは、php-pdo-mysql、php-mysql、またはphp-mysqliを使用する必要がなく、特定のサーバーにインストールされているかもしれないことを抽象化する層だからだと思います。
Volomike

3
はい、可能です。wpdbをインスタンス化して、任意のデータベースにアクセスし、任意のテーブルを照会できます。
ワディM.

回答:


139

はい、可能です。

wpdbオブジェクトを使用して、任意のデータベースにアクセスし、任意のテーブルを照会できます。Wordpressに関連する必要はまったくありません。これは非常に興味深いことです。

利点は、wpdbクラスやなどのすべての関数を使用できるためget_results、ホイールを再発明する必要がないことです。

方法は次のとおりです。

$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>";

4
ブーヤ。質問自体に追加されたこれらのコメントがすべて残念で、正確な回答をブロックできません。
-jerclarke

@ジェレミー・クラーク:同意します。仲間のワードプレスが、無邪気に偽情報を広めないようにもっと注意することを願っています。
ワディM.

1
を使用して時間を節約することもできますglobal $wpdb。:しかし、$ wpdb-> get_results方法を発射する前に、あなたはとしてWP-load.phpを含まなければならない require_once('/your/wordpress/wp-load.php');
ジュニアM

WPDBプレフィックスを設定してWP_Queryおよびget_postを作成し、次の呼び出しにより正しいSQLクエリを生成します$mydb->set_prefix('wp_');
MR

30

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);

これはWadihの答えに多少冗長ですが、私のコード例は少し明確であり、dbログイン定数を覚えておくことも重要だと思います。 >ログインの詳細が変更される可能性があるライブ環境。
jerclarke

WPDBプレフィックスを設定してWP_Queryおよびget_postを作成し、次の呼び出しにより正しいSQLクエリを生成します$second_db->set_prefix('wp_');
MR

21

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

追加のデータベースにアクセスするユーザー/パスの詳細がワードプレスデータベースと同じである限り、このようなテーブル名の前にデータベース名を使用できます

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

私の経験から、これはデータを取得する、つまりを使用する場合にのみ機能しますSELECT。データを挿入できません。
プロテクター1

それは、外部から動作しません
Wasim A.

7

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

$wpdb->select('database_name');

データベース全体をシステム全体で変更します(mysql select_db)。database.tableメソッドは、単純なクエリを作成する場合にのみ機能しますが、別のワードプレスブログにアクセスする場合はselectを使用できます。完了したら元に戻す必要があります。そうしないと、ブログが奇妙なことをする可能性があります。


私はこのソリューションを使用していますが、1つの点を除いて、うまく機能します。何らかの未知の理由でwp_get_post_terms()、新しく選択されたDBを使用していないようです?? 私が試した他のすべての機能(のようなget_post_meta()get_posts()など)がうまく動作するようですが、wp_get_post_terms()に向けて努力するようですDB_NAMEデータベース。何か案は?
パワーブイ

7

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

WPのデータベースクラスは、Justin VincentのezSQLのカスタマイズバージョンです。インターフェイスが気に入っていて、WordPressベースではないサイトをやりたい場合は、http//justinvincent.com/ezsqlをご覧ください。


WPSQLから来たezSQLは本当にイライラしていました。「準備」文も「挿入」も「更新」もありません... WPDBクラス全体をそのまま使用したいのですが、これはBackPressからいくつかのファイルをプロジェクトに含めることで可能です。
goldenapples

@gabrielkリンクは死んでいます-新しいリンクは次のとおりです:[1] [1]:justinvincent.com/ezsql
Hexodus

4

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.