東日本橋の制作・開発会社 プレスマンのスタッフブログ

PRESSMAN*Tech

WordPress コーディング

Docker上のWordPressでwp-cronを使う

この記事は2年以上前ですので、内容が古い可能性があります

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はこちらから

この記事をシェアする:
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

私たちと一緒に働きませんか?

「Docker上のWordPressでwp-cronを使う」はいかがでしたか?
株式会社プレスマンでは、 WordPressが大好きな方、仕事を通してさらにスキルを磨きたい方を募集しています。 まずは募集職種をご覧の上、お気軽にお問い合わせください。 あなたとお会いできるのを楽しみにしています。

採用情報を見る

-WordPress, コーディング
-

Copyright© PRESSMAN*Tech , 2021 All Rights Reserved Powered by STINGER.