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
というわけでプラグイン化しました。
ポート番号だけではなく、プロトコルとドメインも変更できる仕様になっています。
ダウンロードはこちらから
githubはこちらから