2026年9月30日
2026年9月30日
WordPressのSSL・HTTPSエラーを解決する方法
はじめに
WordPressサイトをHTTPSに移行した後に管理画面にアクセスできなくなった・ブラウザに「このページの一部のコンテンツはセキュリティで保護されていません」という混在コンテンツ警告が表示される・FORCE_SSL_ADMIN=trueを設定したらリダイレクトループが発生した・wp_remote_get()でSSL証明書エラーが返ってくる・ロードバランサーやCloudflareを使っているためHTTPSが正しく検知されないといった問題は、WordPressのURL設定とSSL関連の設定を正しく行うことで解決できます。
症状・原因
siteurlとhomeオプションがHTTPのままになっている- プロキシ・CDN経由のリクエストで
$_SERVER['HTTPS']がonにならない - 画像・CSS・JavaScriptのURLがHTTPのままで混在コンテンツが発生している
- SSL証明書の検証に失敗してWordPress内部のHTTPリクエストが失敗している
解決手順
ステップ1:SSL・HTTPS設定の状態を診断する
# siteurl と home の設定を確認
wp option get siteurl
wp option get home
# HTTPSへのリダイレクトが機能しているか確認
curl -I http://example.com/
# SSL証明書の有効期限を確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
# 混在コンテンツを含むURLを確認
wp db query "SELECT guid FROM wp_posts WHERE guid LIKE 'http://%' AND post_status='publish' LIMIT 10"
# wp-config.php のSSL設定を確認
grep -i "ssl\|https\|force" /var/www/html/wp-config.php
ステップ2:WordPress URLをHTTPSに変更する
// wp-config.php: URLをHTTPSに設定(最優先)
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
// プロキシ・ロードバランサー環境でHTTPSを正しく検知
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
// CloudFlare を使用している場合
if (isset($_SERVER['HTTP_CF_VISITOR'])) {
$cf_visitor = json_decode($_SERVER['HTTP_CF_VISITOR'], true);
if (isset($cf_visitor['scheme']) && $cf_visitor['scheme'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
}
// 管理画面をHTTPSに強制
define('FORCE_SSL_ADMIN', true);
# データベース内のHTTP URLをHTTPSに一括変換
wp search-replace 'http://example.com' 'https://example.com' --all-tables --precise
# 確認
wp option get siteurl
wp option get home
ステップ3:混在コンテンツを修正する
// functions.php: 出力バッファリングで混在コンテンツを修正
add_action('template_redirect', function(): void {
if (is_ssl()) {
ob_start(function(string $buffer): string {
$home_http = 'http://' . parse_url(home_url(), PHP_URL_HOST);
$home_https = 'https://' . parse_url(home_url(), PHP_URL_HOST);
return str_replace($home_http, $home_https, $buffer);
});
}
});
// アップロードファイルのURLをHTTPSに変換
add_filter('wp_get_attachment_url', function(string $url): string {
return set_url_scheme($url, 'https');
});
// content_url や plugins_url を常にHTTPSで返す
add_filter('content_url', function(string $url): string {
return set_url_scheme($url, 'https');
});
ステップ4:内部HTTPリクエストのSSLエラーを修正する
// wp_remote_get/post でSSL証明書エラーが発生する場合
// (開発環境や自己署名証明書の場合のみ使用・本番環境では使わない)
add_filter('https_ssl_verify', function(bool $verify): bool {
if (defined('WP_DEBUG') && WP_DEBUG) {
return false; // 開発環境のみ
}
return $verify;
});
// 独自のSSL証明書バンドルを指定
add_filter('https_local_ssl_verify', '__return_false'); // ローカル環境のみ
// wp_remote_get のタイムアウトとSSL設定をカスタマイズ
$response = wp_remote_get('https://api.example.com/data', [
'timeout' => 30,
'sslverify' => true,
'sslcertificates' => ABSPATH . 'wp-includes/certificates/ca-bundle.crt',
]);
if (is_wp_error($response)) {
error_log('Remote request failed: ' . $response->get_error_message());
}
ステップ5:.htaccessでHTTPからHTTPSへリダイレクトする
# .htaccess: HTTPをHTTPSにリダイレクト
# WordPress ルールの前に追加
RewriteEngine On
# プロキシ環境でのHTTPS検知
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 直接接続の場合
# RewriteCond %{HTTPS} off
# RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# HSTS ヘッダーを追加(HTTPSを強制・1年間)
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
// PHP から HSTS ヘッダーを追加
add_action('send_headers', function(): void {
if (is_ssl()) {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
}
});
注意事項
wp search-replaceでHTTPをHTTPSに変換する前に必ずデータベースのバックアップを取ってください。シリアライズされたデータも正しく変換されますが、バックアップは必須です- HSTSを設定すると指定期間はHTTPSでのみアクセスされます。証明書の有効期限が切れるとサイトに一切アクセスできなくなるため、自動更新を必ず設定してください
まとめ
WordPress SSL/HTTPSエラーの解決は①wp option get siteurl/homeでURL確認・curl -Iでリダイレクト確認・SSL証明書の有効期限をopensslで確認、②WP_HOME/WP_SITEURLをhttps://に設定・プロキシ環境は$_SERVER['HTTP_X_FORWARDED_PROTO']でHTTPS検知・FORCE_SSL_ADMIN=trueで管理画面をHTTPS強制、③wp search-replaceでDB内のHTTP URLを一括HTTPS変換・set_url_schemeフィルターで添付ファイルURLを修正・出力バッファリングで残った混在コンテンツを変換、④https_ssl_verifyフィルターで内部リクエストのSSL検証を制御・wp_remote_getのタイムアウトとSSL設定をカスタマイズ・本番環境ではsslverify=trueを維持、⑤.htaccessでHTTP→HTTPSの301リダイレクト・Strict-Transport-SecurityヘッダーでHSTSを設定・send_headersフックでPHPからHSTSを追加の手順で解決します。