Recuperando Usuários do WordPress usando Laravel

Preparando o ambiente

Vamos criar um novo projeto Laravel com o comando laravel new wp-users-laravel1. Selecione “None” quando perguntado sobre o starter kit a ser usado e SQLite para o banco de dados. No momento que estou escrevendo esse artigo, a versão do Laravel utilizada é a 12. Acesse a pasta do projeto criado e certifique-se de rodar o comando npm install.

Nesse ponto, ao rodar o comando composer run dev, você deve ser capaz de acessar http://localhost:8000/ e ver a página padrão do Laravel.

Para finalizar, vamos criar a rota /wp-users onde será exibido o resultado da nossa consulta. Para isso, edite o arquivo routes/web.php e adicione:

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});
// New route
Route::get('/wp-users', function () {
    return 'Hello, wp-users';
});

Acessando http://localhost:8000/wp-users, deve ser exibido o texto “Hello, wp-users”.

Configurando a conexão com o banco de dados

O banco de dados da aplicação utiliza o SQLite (definido no momento que criamos o projeto), mas como vamos acessar o banco de dados de uma outra aplicação é preciso configurar essa conexão.

No Laravel 12, as configurações de banco de dados ficam no arquivo de configuração config/database.php2. Nesse arquivo de configuração já existe uma configuração criada para bancos MariaDB e será utilizada como referência para criar uma nova configuração responsável por se conectar com o banco do WordPress.

Então, no arquivo config/database.php será inserido o item wpdb. Atualize os valores de host, post, database, username e password com os dados da base de dados que você deseja conectar. No exemplo abaixo, o banco do WordPress está rodando localmente.

	'connections' => [
	
	  [...]
	   
  	'wpdb' => [
    	'driver' => 'mariadb',
			'url' => env('DB_URL'),
			'host' => env('DB_HOST', '127.0.0.1'),
			'port' => env('DB_PORT', '3306'),
			'database' => env('DB_DATABASE', 'wp-test'),
			'username' => env('DB_USERNAME', 'root'),
			'password' => env('DB_PASSWORD', 'password'),
			'unix_socket' => env('DB_SOCKET', ''),
			'charset' => env('DB_CHARSET', 'utf8mb4'),
			'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
			'prefix' => '',
			'prefix_indexes' => true,
			'strict' => true,
			'engine' => null,
			'options' => extension_loaded('pdo_mysql') ? array_filter([
				PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
			]) : [],
		],
 ]

Nesse ponto, você deve ser capaz de conectar com o banco do WordPress. Apenas para testar, vamos atualizar a rota /wp-users para exibir o nome da base de dados:

Route::get('/wp-users', function () {
    $connection = DB::connection('wpdb');
    $connection->getPdo();

    return 'Hello, wp-users in ' . $connection->getDatabaseName();
});

Ao acessar a rota /wp-users, você deve obter como resultado Hello, wp-users in wp-test.

Outra forma de testar a conexão com o banco de dados é executando o comando db:table no terminal:

php artisan db:table --database wpdb wp_users

Esse comando deve exibir as informações sobre a tabela wp_users.

Interagindo com a tabela wp_users

No Laravel, para interagir com uma tabela da base dados é preciso criar um Model (modelo da arquitetura MVC – Model View Controller). O comando abaixo cria um model com o nome WpUser no diretório app/Models:

php artisan make:model WpUser

O Laravel usa algumas convenções ao trabalhar com models3. Por exemplo, se o nome do model é WpUser, o Laravel entende que o nome da tabela é wp_users. No WordPress o prefixo da tabela (wp_) pode mudar e não seguir a convenção definida pelo Laravel. Dessa forma, o model WpUser será atualizado para informar ao Laravel a tabela, a chave primária e a conexão a ser usada.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class WpUser extends Model
{
    protected $table = 'wp_users';
    protected $primaryKey = 'ID';
    public $timestamps = false;
    protected $connection = 'wpdb';
}

Para testar, vamos atualizar a rota /wp-users para recuperar e exibir os usuários que estão no banco:

use App\Models\WpUser; // import the model

Route::get('/wp-users', function () {
    return WpUser::all();
});

Ao acessar a rota /wp-users, você deve obter como resultado um JSON com todos os usuários da tabela wp_users:

Note que o model retorna todos as colunas da tabela wp_users. No entanto, podemos omitir algumas colunas como user_pass e user_activation_key. Para isso, precisamos informar ao Laravel que essas colunas devem ser omitidas adicionando a propriedade $hidden 4ao modelo WpUser:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class WpUser extends Model
{
    protected $table = 'wp_users';
    protected $primaryKey = 'ID';
    public $timestamps = false;
    protected $connection = 'wpdb';
    
    protected $hidden = ['user_pass', 'user_activation_key'];
}

Resultado:

Melhorando a lista de usuários

A rota /wp-users está retornando um JSON. Vamos atualizá-la para retornar uma lista com o nome (user_nicename) e o e-mail (user_email) dos usuários:

use App\Models\WpUser; // import the model

Route::get('/wp-users', function () {
    echo '<ul>';
    foreach(WpUser::all() as $wpUser) {
        echo '<li>' . $wpUser->user_nicename . ' - ' . $wpUser->user_email . '</li>';
    }
    echo '</ul>';
});

O ideal é criar um Controller e uma View separada para apresentar a lista de usuários, mas para um teste rápido, vamos manter tudo no arquivo routes/web.php.

Resultado:

Notas de rodapé

  1. https://laravel.com/docs/12.x/installation#creating-a-laravel-project ↩︎
  2. https://laravel.com/docs/12.x/database#configuration ↩︎
  3. https://laravel.com/docs/12.x/eloquent#eloquent-model-conventions ↩︎
  4. https://laravel.com/docs/12.x/eloquent-serialization#hiding-attributes-from-json ↩︎