CorcelでWordPressの投稿をLaravelで使う

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.phpdatabase.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>
タイトルとURLをコピーしました