Closed6

アバウトなwp-cron.phpの処理の流れチェック。UserAgentを求めて。

cyocuncyocun

wp-cron.phpはbasic認証やその他でブロックされると実行されないのはご存知の通り

ちょっと必要に駆られてwp-cron.phpが実行されるまでの流れを追う必要があったのでメモがてら。
phpのプロではないのでメモ程度のないようだけど

予想としてはどこかでPOSTやGET、file_get_contentsとかでrequireとかincludeする以外の方法で呼ばれてるからだろなぁとは思う。

cyocuncyocun

とりあえず wp-cron.php で検索。

いくつかヒットするけど、

  • class-wp-site-health.php
  • siteguard-updates-notify.php
  • cron.php
    この3つ

ファイル名ですでになにやってるか大体わかる。すばらしい。最高。天才。

cyocuncyocun

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 ) でちぇっくされてる

cyocuncyocun

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;
	}

まぁもうそういうことだなって感じの。

cyocuncyocun

cron.php

一応これも。
_wp_cron() があるけどこれの呼び出しはwp_cron()からされてる。
wp_cron()自体はどこからだろ。ようわからん。

wp_cron()の中でwp_loadedのフックに _wp_cron() の実行を登録するぽい

つまりcronってそのタイミングで実行されてんのね。

んで_wp_cron() の中身はwordpressのcron処理そのものって感じ。

ここまでの上2つはチェック機構だけど、こいつが実態。実態?wp-cronが実態ではあるけど

最初にここから見始めたからんー。ってなってたけど、上2つを先に見てたらわかりやすかったな。

cronの中身が何しているかはここらへん見ればいいんだろうけど今回そこに興味はないのでスルー。

cyocuncyocun

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は偽造できるから当てにしちゃだめだけどね!

すごいざっくりだけど、スクラップだしいいっしょ。

このスクラップは2024/03/22にクローズされました