アバウトなwp-cron.phpの処理の流れチェック。UserAgentを求めて。
wp-cron.phpはbasic認証やその他でブロックされると実行されないのはご存知の通り
ちょっと必要に駆られてwp-cron.phpが実行されるまでの流れを追う必要があったのでメモがてら。
phpのプロではないのでメモ程度のないようだけど
予想としてはどこかでPOSTやGET、file_get_contentsとかでrequireとかincludeする以外の方法で呼ばれてるからだろなぁとは思う。
とりあえず wp-cron.php
で検索。
いくつかヒットするけど、
- class-wp-site-health.php
- siteguard-updates-notify.php
- cron.php
この3つ
ファイル名ですでになにやってるか大体わかる。すばらしい。最高。天才。
class-wp-site-health.php
ここにある can_perform_loopback
ループバックは、WordPressがWP_Cronを起動したり、スケジュール投稿をしたり、プラグインやテーマの編集がサイトの障害を引き起こさないようにしたりするために、自分自身と通信するために使用するものです。
ループバックって呼べば良いのね。
内容はそのまま、ループバックが必要なものに対してのヘルスチェック
んで $url = site_url( 'wp-cron.php' );
てのがあるけどこれはよく出てくる。
site_urlは単にURL組立してるだけ。
んでその後にある
$r = wp_remote_post( $url, compact( 'body', 'cookies', 'headers', 'timeout', 'sslverify' ) );
この wp_remote_post
が多分今回の求めてた関数だろう。
$r
に入ってきた返り値はこのあと is_wp_error( $r )
でちぇっくされてる
siteguard-updates-notify.php
一応こっちも。
あ、これよく見たらsiteguardって書いてあるしディレクトリがsiteguardのプラグインだった。
あんま
正直こっちのが簡潔でわかりやすい
static function check_wp_cron_access() {
$result = wp_remote_post( site_url( '/wp-cron.php' ) );
if ( ! is_wp_error( $result ) && 200 === $result['response']['code'] ) {
return true;
}
$message = esc_html__( 'Please solve the problem that can not be accessed wp-cron.php. Might be access control.', 'siteguard' );
$error = new WP_Error( 'siteguard_updates_notify', $message );
return $error;
}
まぁもうそういうことだなって感じの。
cron.php
一応これも。
_wp_cron()
があるけどこれの呼び出しはwp_cron()
からされてる。
wp_cron()
自体はどこからだろ。ようわからん。
wp_cron()
の中でwp_loadedのフックに _wp_cron()
の実行を登録するぽい
つまりcronってそのタイミングで実行されてんのね。
んで_wp_cron()
の中身はwordpressのcron処理そのものって感じ。
ここまでの上2つはチェック機構だけど、こいつが実態。実態?wp-cronが実態ではあるけど
最初にここから見始めたからんー。ってなってたけど、上2つを先に見てたらわかりやすかったな。
cronの中身が何しているかはここらへん見ればいいんだろうけど今回そこに興味はないのでスルー。
wp-cron.phpがループバックで呼ばれるのは wp_remote_post()
だね
そのまんまでpostしてるらしい。
中身はめっちゃシンプル。
function wp_remote_post( $url, $args = array() ) {
$http = _wp_http_get_object();
return $http->post( $url, $args );
}
てことは_wp_http_get_object()
をさがそう
function _wp_http_get_object() {
static $http = null;
if ( is_null( $http ) ) {
$http = new WP_Http();
}
return $http;
}
なるほど。WP_Httpクラス。 class-wp-http.php
こいつが今回探してたやつだ。
post()関数で実際にリクエストを実行している
request()` ここが実際headerの処理とかしてるぽい。
今回はUAが知りたかったんだけど、
'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $url ),
なるほどー!このUA見ればbasic認証下かいろんな制限下でもループバックだけ通すことできるね。
今回はそんな要件があったので調べてみた。
当然UAは偽造できるから当てにしちゃだめだけどね!
すごいざっくりだけど、スクラップだしいいっしょ。