Web制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

Docker上のWordPressでwp-cronを使う

Docker上のWordPressでwp-cronを動かしたい人向けです。(かなりニッチな内容です。。)

動作確認

WP CrontrolのCron Event画面で見てみます。(使ったymlはここ)

そのまま動かそうとすると、curlで失敗しています。
localhost:3001にリクエスト送ってるけど拒否されているとのこと。

原因

ホストとコンテナで異なるポート番号をマッピングしていたからのようです。

ports: 
  - "3001:80" ## ここが原因っぽい

コンテナ内でcurlを叩いてみます。

curl -I localhost:3001
curl: (7) Failed to connect to localhost port 3001: Connection refused

ゲストの3001を見に行っているので繋がりませんね。
これを80に変えてあげれば大丈夫なはず。

curl -I localhost:80
HTTP/1.1 301 Moved Permanently

または、dockerからhost.docker.internalでホスト側に繋いでもOKです。

curl -I host.docker.internal:3001
HTTP/1.1 200 OK

解決方法

リクエストURLからポートの部分を変更してあげることにしました。
wp-cronのリクエストURLを生成している場所に’cron_request’というhookがあるので、そこを使います。

function change_cron_port( $cron_request ) {
    $port = parse_url( $cron_request['url'], PHP_URL_PORT );
    $cron_request['url'] = str_replace( $port, '80', $cron_request['url'] );
    return $cron_request;
}
add_filter( 'cron_request', 'change_cron_port', 9999 );

これでエラーメッセージが消え、wp-cronが実行されます。

Change WP Cron Request URL

というわけでプラグイン化しました。
ポート番号だけではなく、プロトコルとドメインも変更できる仕様になっています。

ダウンロードはこちらから

https://wordpress.org/plugins/change-wp-cron-request-url/

githubはこちらから