Usando o wpdb para conectar-se a um banco de dados separado

86

Quero me conectar wpdba outro banco de dados. Como crio a instância e transmito o nome do banco de dados / nome de usuário / senha?

obrigado

Wadih M.
fonte
Outro banco de dados MySQL ou outro tipo de banco de dados? Você ainda deseja acessar o banco de dados normal do WordPress ou está movendo o site de um banco de dados para outro?
EAMann
11
Sim, outro banco de dados MySQL. É um banco de dados separado no mesmo servidor e não é um Wordpress. É um banco de dados personalizado, com informações que eu quero exibir dentro do wordpress.
Wadih M.
11
Se você fizesse isso com o objeto $ wpdb, se fosse possível, desconectaria o restante do WordPress do banco de dados existente. Então, não é recomendado. Outra opção é criar uma nova instância usando o EZSQL, que é usado pelo WordPress. Eu acho que o EZSQL é usado porque é uma camada que abstrai você de ter que usar php-pdo-mysql, php-mysql ou php-mysqli, sem saber qual pode ser instalado em um determinado servidor.
Volomike 10/09/10
3
Sim é possivel. O wpdb pode ser instanciado para acessar qualquer banco de dados e consultar qualquer tabela.
Wadih M.

Respostas:

139

Sim é possivel.

O objeto wpdb pode ser usado para acessar qualquer banco de dados e consultar qualquer tabela. Absolutamente não precisa estar relacionado ao Wordpress, o que é muito interessante.

O benefício é a capacidade de usar todas as classes e funções wpdb como get_resultsetc, para que não seja necessário reinventar a roda.

Aqui está como:

$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>";
Wadih M.
fonte
4
Booyah. Pena que todos esses comentários foram adicionados à própria pergunta para bloquear sua resposta precisa.
precisa saber é o seguinte
@ Jeremy Clarke: Eu concordo. Esperando que nossos colegas wordpressers tenham mais cuidado para não divulgar inocentemente a desinformação.
Wadih M.
11
você também pode economizar tempo usando global $wpdb. Mas antes de disparar $ wpdb-> método get_results, você deve incluir wp-load.php como: require_once('/your/wordpress/wp-load.php');
Junior M
Defina o prefixo WPDB para criar WP_Query e get_post para gerar a consulta sql correta, chamando$mydb->set_prefix('wp_');
MR
30

Conectar-se a um segundo banco de dados é fácil no WordPress, basta criar uma nova instância da classe WPDB e usá-la da mesma maneira que usaria a instância padrão $ wpdb que todos conhecemos e amamos.

Supondo que o segundo banco de dados tenha as mesmas informações de login do WP principal, você pode usar as constantes predefinidas do wp-config.php para evitar codificar as informações de login.

/**
 * 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);
jerclarke
fonte
Isso é um pouco redundante para a resposta de Wadih, mas acho que meu exemplo de código é um pouco mais claro e também é importante lembrar as constantes de login do db, pois elas são quase sempre as corretas para usar e, caso contrário, você corre o risco de problemas ao passar do dev-> stage- > ambientes ao vivo nos quais os detalhes de login podem mudar.
precisa saber é o seguinte
Defina o prefixo WPDB para criar WP_Query e get_post para gerar a consulta sql correta, chamando$second_db->set_prefix('wp_');
MR
21

ninguém disse isso, então pensei em adicionar uma maneira ainda mais fácil ..

contanto que seu banco de dados adicional tenha os mesmos detalhes de usuário / senha para acessá-lo como seu banco de dados wordpress, você poderá usar o nome do banco de dados antes do nome da tabela como este

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
CommentLuv
fonte
Da minha experiência, isso só funciona para obter dados, ou seja, usando SELECT. Você não pode inserir dados.
Protector one
não vai funcionar externamente,
Wasim A.
7

Embora funcionem, você perderá a capacidade de usar os "outros" recursos personalizados, como consultas get_post_custom e wordpress. A solução simples é

$wpdb->select('database_name');

que altera o banco de dados em todo o sistema (um mysql select_db). O método database.table funciona se você apenas deseja fazer uma consulta simples, mas se deseja acessar outro blog wordpress, pode usar select. Você só precisará alterá-lo quando terminar, ou seu blog poderá fazer coisas estranhas.

kaiser
fonte
Estou usando esta solução e ela funciona muito bem, exceto por uma coisa. Por algum motivo desconhecido wp_get_post_terms(), parece não usar o banco de dados recém-selecionado? Todas as outras funções que eu tentei (como get_post_meta(), get_posts()etc) parece funcionar muito bem, mas wp_get_post_terms()parece trabalhar para o DB_NAMEbanco de dados. Alguma ideia?
PowerBuoy
7

Ainda não posso comentar, mas queria expandir a resposta de Wadih M. (o que é ótimo).

A classe de banco de dados do WP é uma versão personalizada do ezSQL de Justin Vincent. Se você gosta da interface e deseja criar um site que não seja baseado no WordPress, confira: http://justinvincent.com/ezsql

gabrielk
fonte
O ezSQL foi realmente frustrante para mim, vindo do WPDB. Nenhuma instrução "preparar", nenhuma "inserção" ou "atualização" ... Eu gosto de usar toda a classe WPDB como ela existe, o que é possível incluindo alguns arquivos do BackPress em seu projeto.
goldenapples
@gabrielk O link está morto - novo é: [1] [1]: justinvincent.com/ezsql
Hexodus
4

Eu estava lutando com o uso $wpdbpara conectar-me a um segundo banco de dados de blog de um site pai que precisa atualizar dois blogs. Eu costumava $wpdb->select($dbname, $dbh)selecionar o segundo banco de dados, mas ainda estava obtendo resultados do primeiro banco de dados.

Resolvi o problema ligando wp_cache_flush()para limpar o cache do WordPress antes de chamar as funções WP no segundo banco de dados.

Matt
fonte