WordPressの投稿をLaravelで扱ってみます。
Corcel
GitHub - corcel/corcel: Use WordPress backend with Laravel or any PHP application
Use WordPress backend with Laravel or any PHP application - GitHub - corcel/corcel: Use WordPress backend with Laravel o...
CorcelはEloquent ORMを利用してWordPressのデータを操作するインタフェースを提供しています。WordPresのデータベースへは直接接続することになります。
これまで、静的化WordPressの文脈でwp-json(WP REST API)を利用したデータ操作は見たことがありましたが、Corcelであればwp-jsonの仕様を意識することなく利用することが可能なようです。
環境構築
LaravelとWordPressの環境をそれぞれ構築する必要があります。構築が楽なのでDockerを利用します。
Laravel
Laravelのプロジェクトを新規に作成します (割愛)。
composerでCorcelをinstallします。
$ composer require jgrossi/corcel
serveはsailで実施するとdocker-compose.ymlで必要なnetworksを定義してくれるので、それを使うのが良いかと思います。
$ ./vendor/bin/sail up -d
$ ./vendor/bin/sail artisan sail:publish
configは corcel.php
と database.php
を修正します。
'connection' => 'wordpress',
// 'connections' に以下を追加
'wordpress' => [
'driver' => 'mysql',
'host' => env('WP_DB_HOST', '127.0.0.1'),
'port' => env('WP_DB_PORT', '3306'),
'database' => env('WP_DB_DATABASE', 'wordpress'),
'username' => env('WP_DB_USERNAME', 'wordpress'),
'password' => env('WP_DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => 'wp_',
'strict' => false,
'engine' => null,
],
WP_DB_CONNECTION=mysql
WP_DB_HOST=db
WP_DB_PORT=3306
WP_DB_DATABASE=wordpress
WP_DB_USERNAME=wordpress
WP_DB_PASSWORD=wordpress
WordPress
公式にWordPressのクイックスタートがあるのでそれを利用します。
クィックスタート: Compose と WordPress — Docker-docs-ja 24.0 ドキュメント
networksは {Laravelのディレクトリ名}_sail
を指定します。
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- external
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
networks:
- external
networks:
external:
driver: bridge
name: {Laravelのディレクトリ名}_sail
volumes:
db_data:
実行
リクエストに対してWordPressの投稿を出力させてみます。コンテンツはWordPressの初期コンテンツを利用します。
Route::get('posts/{post_id}', function (int $postId) {
$post = Post::query()->find($postId);
return view('posts.show', compact('post'));
});
WordPressの投稿は post_content
にHTMLがそのまま入っているのでそのまま出力します。
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<title>{{ $post->post_title }}</title>
<body>
<div>
{!! $post->post_content !!}
</div>
</body>
</html>
ブラウザでアクセスすると、投稿を取得できていることが確認できます。
curlするとブロックエディタ用の <! -- wp:paragraph -->
も取得できていることがわかります。
$ curl http://localhost/posts/1
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello world!</title>
</head>
<body>
<div>
<!-- wp:paragraph -->
<p>WordPress へようこそ。こちらは最初の投稿です。編集または削除し、コンテンツ作成を始めてください。</p>
<!-- /wp:paragraph -->
</div>
</body>
</html>