CrowFlow

WordPress運用の自動化/効率化メディア

大量処理でサーバーを悲鳴させないために——WordPress 7.1の新フック「wp_pre_execute_ability」で作る負荷遮断の仕組み

WordPressサイトの運用を自動化しようとするとき、多くの人が一度は経験する「落とし穴」があります。スクリプトや外部APIを使い、意気揚々と一括更新を実行した瞬間にサーバーが極端に重くなり、一般ユーザーのページ閲覧にまで影響を出してしまうトラブルです。

私自身、過去にカテゴリー設定の自動化スクリプトを作成し、約900件の処理をWeb経由で一気に流し込んだ際、サーバー環境の負荷が跳ね上がって冷や汗をかいた経験があります。「今思えば、WebリクエストではなくWP-CLIで分割実行すべきだった」と反省しましたが、自動化処理とサーバーリソースの付き合い方は常に現場の大きな課題です。

さらに昨今では、n8nやMakeなどのiPaaS、さらにはAIエージェントが自律的にWordPressのAPIや機能を呼び出す機会が増えています。外部からの呼び出しが増えるこれからの時代、サーバーが高負荷になった際に「処理を即座に安全に返却する(サーキットブレーカー)」仕組みの重要性が増しています。

本記事では、WordPress 7.1で追加されたフィルターフック wp_pre_execute_ability の概要と、それを使ってサーバーダウンを防ぐ具体的なガードレールの実装例について解説します。

900件のカテゴリー一括処理でサーバーが沈黙しかけた話

Webリクエスト経由の一括処理が重くなる理由

なぜ、Web(HTTP / REST API / Ajax)経由での大量一括処理はこれほどまでにサーバーを圧迫するのでしょうか。

WordPressの通常のWebリクエストでは、1回の実行ごとに以下の処理が動きます。

  • WordPressコアや全有効化プラグインのブートストラップ(初期化ロード)
  • ユーザー権限やノンス(Nonce)の厳密なチェック
  • タクソノミーのカウント再計算やキャッシュの破棄・再生成
  • save_post や created_term などに紐づく各種アクションフックの連鎖

これをブラウザや外部スクリプトから数十〜数百回連続で叩くと、Webサーバー(Apache/Nginx)の裏で動くPHP-FPMのワーカープロセスがすべて長時間拘束されます。その結果、サイトを訪れた一般読者のリクエストを処理するワーカーが枯渇し、サイト全体が「504 Gateway Timeout」や著しい表示遅延に陥るわけです。

大量データ処理の基本原則:WP-CLIへの切り分け

この経験から得た大前提の教訓は、「100件を超えるような重いデータ処理は、WebリクエストではなくWP-CLI(またはバックグラウンドジョブ)で実行する」という原則です。

WP-CLIであれば、Webサーバーの接続プロセスを一切消費せず、CLIプロセス単体でメモリ管理やガベージコレクション(wp_cache_flush() 等)を制御しながら安全に完結できます。

しかし、外部サービス連携やAIエージェントによる自動化など、「どうしてもWeb/API経由でリアルタイムにWordPressの機能を叩かざるを得ない」場面も確実に増えています。

WordPress 7.1で登場した「wp_pre_execute_ability」フック

WordPress 7.1では、内部機能や能力をカプセル化して実行する「Abilities API」の拡張として、新しく wp_pre_execute_ability フィルターが追加されました。

フックの役割と仕組み

このフィルターは、何らかのAbility(機能)が実行される直前に割り込み、本来の処理(権限チェックや内部ロジック)を完全にショートサーキット(早期リターン)させることができます。

apply_filters( 'wp_pre_execute_ability', mixed $preempt, string $ability_name, array $args, array $context );
  • $preempt の初期値は null です。
  • フィルター内で null 以外の値(結果配列や WP_Error など)を返すと、本来のAbility実行ロジックは一切実行されず、その返り値が呼び出し元に即座に返却されます。

参考:

実践:サーバー負荷に応じたサーキットブレーカーの実装

この wp_pre_execute_ability を活用すると、「サーバーが高負荷状態にあるときは、重いAbilityを実行せずに即座にエラー・待機レスポンスを返してPHPプロセスを解放する」というサーキットブレーカー(安全装置)が作れます。

実装コード例(ロードアベレージ連動型)

以下は、Linux環境のロードアベレージ(CPU負荷)を監視し、サーバーが逼迫している場合に自動化タスクの実行を一時中断させる実装例です。

<?php
/**
* Plugin Name: CrowFlow Ability Circuit Breaker
* Description: サーバー高負荷時にAbilities APIの実行を早期遮断するサーキットブレーカー
* Version: 1.0.0
* Author: CrowFlow
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_filter( 'wp_pre_execute_ability', 'crowflow_ability_circuit_breaker', 10, 4 );
/**
* サーバー負荷を検知してAbility実行をショートサーキットする
*
* @param mixed $preempt ショートサーキット用の返り値(デフォルト: null)
* @param string $ability_name 実行対象のAbility名
* @param array $args 渡された引数
* @param array $context 実行コンテキスト
* @return mixed WP_Errorまたはnull
*/
function crowflow_ability_circuit_breaker( $preempt, $ability_name, $args, $context ) {
// すでに他のフックで値が返されている場合はそのまま渡す
if ( null !== $preempt ) {
return $preempt;
}
// CLI環境からの実行は対象外(CLIはサーバーリソースを個別に管理できるため)
if ( defined( 'WP_CLI' ) && WP_CLI ) {
return $preempt;
}
// 1. サーバーのロードアベレージを取得(Linux環境)
if ( function_exists( 'sys_getloadavg' ) ) {
$load = sys_getloadavg();
// 例: サーバーが2コアの場合、1分間のロードアベレージが 3.0 を超えたら過負荷とみなす
$cpu_cores = 2; // 環境に合わせて設定
$threshold = $cpu_cores * 1.5;
if ( isset( $load[0] ) && $load[0] > $threshold ) {
// エラーログに記録
error_log( sprintf(
'[CrowFlow Safety] High load detected (%.2f). Blocked ability: %s',
$load[0],
$ability_name
) );
// 503 Service Unavailable 相当のWP_Errorを即座に返却
return new WP_Error(
'crowflow_server_overloaded',
__( 'サーバーが高負荷状態のため、処理の実行を一時中断しました。しばらく待ってから再試行してください。', 'crowflow' ),
[
'status' => 503,
'retry_after' => 60, // 呼び出し元(エージェント側)に60秒のリトライ待機を指示
]
);
}
}
return $preempt;
}

コードの解説とポイント

  1. WP-CLIの除外: 管理者がメンテナンス等で意図して流しているCLIコマンドまで巻き込んで止めてしまわないよう、defined('WP_CLI') で除外しています。
  2. 早期リターンによるプロセス解放: 重いデータベースクエリや外部通信、複雑な権限検証に入る前の段階で抜けるため、PHP実行時間が最小限(数ミリ秒)で済み、Webワーカーを即座に解放できます。
  3. エージェントへの再試行ヒント: レスポンスデータに retry_after: 60 を含めることで、n8nやAIエージェント側が「サーバーが落ちた」と誤認して即座に再リクエストを連打するのを防ぎ、クールダウン期間を設けることができます。

運用設計:自動化を安全に回すための「3つの境界線」

自動化を導入する際は、仕組みを作る技術だけでなく、「どこで処理を走らせるか」の運用設計が不可欠です。

処理の性質・規模推奨される実行環境理由・運用の落とし所
大量データ処理(900件のカテゴリー設定、全記事メタ更新など)WP-CLI / 夜間cronWebサーバーのワーカーを消費せず、メモリやキャッシュを都度フラッシュしながら安全に実行可能。
非同期イベント処理(SNS自動投稿、画像最適化など)Action Scheduler / バックグラウンドキューユーザーの閲覧・投稿保存をブロックせず、バックグラウンドで1件ずつ安全に消化。
外部連携・エージェントからの即時API呼び出しREST API + wp_pre_execute_ability(サーキットブレーカー)外部からの予期せぬリクエスト集中やサーバー過負荷時でも、サイト全体を巻き込まず即座に受け流す。

まとめ:自律化を進めるなら「止める仕組み」もセットで用意する

WordPress運用における自動化は、日々のルーティン作業を劇的に減らし、運営者が本来注力すべきコンテンツ制作やビジネスの判断に集中するための強力な武器です。

しかし、「自動で動かす仕組み」だけを作って「異常時に止める仕組み」を考慮していないと、過去の私のように900件の一括処理でサイト全体を道連れにしてしまうリスクがあります。

WordPress 7.1の wp_pre_execute_ability は、そうした「自動化の暴走やサーバー過負荷からサイトを守るためのセーフティネット」としても非常に有用です。

全自動化に突き進むのではなく、「安全に受け流す仕組み(半自動化)」を1枚挟むこと。これが、長く安定したWordPress運用を続けるための現実的な落とし所と言えます。

書いた人

+ カテゴリー:

コメントを残す