2026年10月5日
2026年10月5日
WordPressのXML-RPCエラーを解決する方法
はじめに
WordPressのモバイルアプリや外部ツールから投稿しようとすると「XML-RPC is disabled」エラーが表示される・Jetpackプラグインを接続しようとすると「XML-RPC経由でWordPress.comに接続できません」エラーが出る・セキュリティのためにXML-RPCを無効化したらJetpackが動かなくなった・xmlrpc.phpへのブルートフォース攻撃でサーバー負荷が急増しているといった問題は、.htaccessやxmlrpc_enabledフィルターによる無効化設定と、正当な利用(Jetpack・モバイルアプリ)との競合が原因です。
症状・原因
add_filter('xmlrpc_enabled', '__return_false')でXML-RPCを完全に無効化している.htaccessでxmlrpc.phpへのアクセスを全てブロックしている- サーバーのWAF(Web Application Firewall)がXML-RPCをブロックしている
- Jetpackが
xmlrpc.php経由でWordPress.comと通信できない
解決手順
ステップ1:XML-RPCの状態を診断する
# XML-RPCが有効か確認
wp eval "
echo 'xmlrpc_enabled filter: ' . PHP_EOL;
global \$wp_filter;
if (isset(\$wp_filter['xmlrpc_enabled'])) {
foreach (\$wp_filter['xmlrpc_enabled']->callbacks as \$pri => \$cbs) {
foreach (\$cbs as \$cb) {
\$f = \$cb['function'];
echo 'Priority ' . \$pri . ': ' . (is_string(\$f) ? \$f : 'closure') . PHP_EOL;
}
}
} else {
echo 'No callbacks (XML-RPC enabled by default)' . PHP_EOL;
}
"
# xmlrpc.phpへのHTTPアクセスをテスト
wp eval "
\$response = wp_remote_post(site_url('/xmlrpc.php'), [
'body' => '<?xml version=\"1.0\"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>',
'headers' => ['Content-Type' => 'text/xml'],
]);
echo 'Status: ' . wp_remote_retrieve_response_code(\$response) . PHP_EOL;
echo 'Response length: ' . strlen(wp_remote_retrieve_body(\$response)) . PHP_EOL;
"
# .htaccessでのXML-RPCブロックを確認
wp eval "
\$htaccess = file_get_contents(ABSPATH . '.htaccess');
echo 'xmlrpc blocked in .htaccess: ' . (str_contains(\$htaccess, 'xmlrpc') ? 'YES' : 'no') . PHP_EOL;
"
ステップ2:XML-RPCを安全に有効化する
// functions.php: XML-RPCを有効化(無効化フィルターを削除)
// ① 完全無効化していた場合は削除
// remove_filter('xmlrpc_enabled', '__return_false'); // この行を削除
// ② JetpackのIPのみXML-RPCを許可する(セキュリティ強化)
add_filter('xmlrpc_enabled', function(bool $enabled): bool {
// Jetpack サーバーのIPレンジ(WordPress.com)
$jetpack_ips = ['192.0.64.0/18', '198.181.116.0/22'];
$remote_ip = $_SERVER['REMOTE_ADDR'] ?? '';
// Jetpack経由のアクセスは許可
foreach ($jetpack_ips as $cidr) {
[$subnet, $bits] = explode('/', $cidr);
$ip_long = ip2long($remote_ip);
$subnet_long = ip2long($subnet);
$mask = -1 << (32 - (int)$bits);
if (($ip_long & $mask) === ($subnet_long & $mask)) {
return true;
}
}
// それ以外のXML-RPCアクセスは拒否
return false;
});
// functions.php: XML-RPCメソッドを選択的に制限
add_filter('xmlrpc_methods', function(array $methods): array {
// 危険なメソッドを無効化
unset($methods['system.multicall']); // ブルートフォース攻撃に使われる
unset($methods['wp.getUsersBlogs']); // ユーザー名列挙に使われる
// 必要なメソッドのみ許可する場合
// $allowed = ['wp.newPost', 'wp.editPost', 'wp.getPost', 'wp.uploadFile'];
// return array_intersect_key($methods, array_flip($allowed));
return $methods;
});
ステップ3:.htaccessでXML-RPCを保護する
# .htaccess: XML-RPCへのアクセスを制限(特定IPのみ許可)
<Files xmlrpc.php>
# ブルートフォース対策:Jetpackと自分のIPのみ許可
Require ip 192.0.64.0/18
Require ip 198.181.116.0/22
Require ip YOUR.OWN.IP.ADDRESS
</Files>
# XML-RPCを完全ブロックする場合(Jetpack不使用時)
# <Files xmlrpc.php>
# Require all denied
# </Files>
# .htaccess: system.multicall を使ったブルートフォース攻撃をブロック
<IfModule mod_rewrite.c>
RewriteEngine On
# multicallを含むXML-RPCリクエストをブロック
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} /xmlrpc\.php$
RewriteCond %{THE_REQUEST} system\.multicall [NC]
RewriteRule ^ - [F,L]
</IfModule>
ステップ4:Jetpack接続のXML-RPCエラーを修正する
# Jetpackの接続状態を確認
wp jetpack status
# Jetpackを切断して再接続
wp jetpack disconnect
wp jetpack connect --user=admin
# Jetpack用のXML-RPCテスト
wp eval "
\$response = wp_remote_post(site_url('/xmlrpc.php'), [
'body' => '<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<methodCall>
<methodName>jetpack.verifyRegistration</methodName>
<params><param><value><string>test</string></value></param></params>
</methodCall>',
'headers' => ['Content-Type' => 'text/xml'],
'timeout' => 30,
]);
echo 'Jetpack XML-RPC status: ' . wp_remote_retrieve_response_code(\$response) . PHP_EOL;
"
# XML-RPC経由でのJetpack通信に必要な設定を確認
wp eval "
echo 'Jetpack active: ' . (is_plugin_active('jetpack/jetpack.php') ? 'yes' : 'no') . PHP_EOL;
echo 'Blog token: ' . (Jetpack_Options::get_option('blog_token') ? 'set' : 'not set') . PHP_EOL;
"
ステップ5:XML-RPCへの攻撃を監視・ブロックする
// functions.php: XML-RPCへの過剰なリクエストを監視
add_action('xmlrpc_call', function(string $method): void {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$cache_key = 'xmlrpc_count_' . md5($ip);
$count = (int) get_transient($cache_key);
if ($count > 10) {
// 1分間に10回以上のリクエストをブロック
status_header(429);
die('Too Many Requests');
}
set_transient($cache_key, $count + 1, MINUTE_IN_SECONDS);
// ログに記録
if (WP_DEBUG_LOG) {
error_log("[XML-RPC] Method: {$method} | IP: {$ip} | Count: " . ($count + 1));
}
});
// XML-RPC認証失敗を監視
add_action('xmlrpc_login_error', function(IXR_Error $error, WP_User|false $user): void {
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
error_log("[XML-RPC Auth Failed] IP: {$ip} | Error: {$error->message}");
// 5回失敗したらIPをトランジェントでブロック
$block_key = 'xmlrpc_block_' . md5($ip);
$fails = (int) get_transient($block_key);
set_transient($block_key, $fails + 1, HOUR_IN_SECONDS);
if ($fails >= 4) {
status_header(403);
die('Forbidden');
}
}, 10, 2);
注意事項
- XML-RPCを完全に無効化するとJetpack・WordPressモバイルアプリ・一部のSEOプラグインが機能しなくなります。完全無効化の前に使用しているプラグインへの影響を確認してください
system.multicallメソッドはブルートフォース攻撃に悪用されやすいため、Jetpackを使用しない場合はこのメソッドだけを無効化することでセキュリティを向上させながらXML-RPCの他の機能を維持できます- Fail2banなどのサーバーレベルのブルートフォース対策ツールと組み合わせると、
xmlrpc.phpへの攻撃をより効果的にブロックできます
まとめ
WordPress XML-RPCエラーの解決は①xmlrpc_enabledフィルターのコールバック確認・wp_remote_post(xmlrpc.php)でHTTPステータス確認・.htaccessでのXML-RPCブロック確認、②xmlrpc_enabledフィルターを削除して有効化・JetpackのIPレンジのみ許可する条件付き有効化・system.multicallなど危険なメソッドをxmlrpc_methodsフィルターで無効化、③.htaccessので特定IPのみアクセス許可・multicallを含むPOSTリクエストをmod_rewriteでブロック、④wp jetpack disconnect/connectでJetpack接続をリセット・XML-RPCエンドポイントへのJetpack疎通テスト、⑤xmlrpc_callフックで過剰リクエストを検知しレート制限・xmlrpc_login_errorフックで認証失敗を監視してIPブロックの手順で解決します。