WordPress functions.php中file_get_contents()获取远程数据失效
WordPress子主题中file_get_contents()拉取外部HTTPS资源失效排查方案
常见故障原因
按出现概率从高到低排序:
- 服务器PHP配置关闭了
allow_url_fopen选项。绝大多数商用主机默认会关闭该配置降低安全风险,仅开启状态下file_get_contents()才能发起外部网络请求。可通过phpinfo()函数查看该配置项的实际值,为Off时该函数无法请求外部地址。 - 服务器缺少HTTPS请求所需的CA证书包,或证书包过期。你请求的三个地址均为HTTPS协议,PHP发起SSL连接时会校验目标站点证书有效性,本地无合法CA证书时请求会直接拦截返回false。
- 站点安全插件、服务器WAF、目标站点反爬策略拦截请求。
file_get_contents()默认发起的请求UA为PHP版本标识,很容易被防火墙或反爬规则标记拦截。 - 代码未做异常捕获,请求失败时
file_get_contents()返回false,直接传入json_decode()会得到null值,后续foreach循环会触发报错,而WordPress默认开启错误静默,导致看不到具体报错信息只看到功能失效。
最优修复方案
WordPress内核已经封装了兼容性极强的HTTP请求类WP_Http,不要在WordPress环境下直接使用原生file_get_contents()或手写cURL请求,内核方法会自动兼容不同主机环境、处理SSL校验、跳转、超时等逻辑,直接替换原有拉取逻辑即可:
<?php // 拉取保险公司列表 $bizt_a = []; $bizt_resp = wp_remote_get("https://karteritesed.hu/biztositok.json", [ 'timeout' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]); if (!is_wp_error($bizt_resp) && wp_remote_retrieve_response_code($bizt_resp) === 200) { $bizt_raw = wp_remote_retrieve_body($bizt_resp); $bizt_a = json_decode($bizt_raw, true) ?: []; } $bizt_lista = ""; foreach ($bizt_a as $bizt) { $bizt_lista .= "<option value=\"" . esc_attr($bizt) . "\">" . esc_html($bizt) . "</option>"; } // 拉取来源渠道列表 $hhr_a = []; $hhr_resp = wp_remote_get("https://karteritesed.hu/hol_hallott_rolunk.json", [ 'timeout' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]); if (!is_wp_error($hhr_resp) && wp_remote_retrieve_response_code($hhr_resp) === 200) { $hhr_raw = wp_remote_retrieve_body($hhr_resp); $hhr_a = json_decode($hhr_raw, true) ?: []; } $hhr_lista = ""; foreach ($hhr_a as $hhr) { $hhr_lista .= "<option value=\"" . esc_attr($hhr) . "\">" . esc_html($hhr) . "</option>"; } // 拉取维修地点列表 $jh_a = []; $jh_resp = wp_remote_get("https://karteritesed.hu/javitas_helye.json", [ 'timeout' => 10, 'user-agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ]); if (!is_wp_error($jh_resp) && wp_remote_retrieve_response_code($jh_resp) === 200) { $jh_raw = wp_remote_retrieve_body($jh_resp); $jh_a = json_decode($jh_raw, true) ?: []; } $jh_lista = ""; foreach ($jh_a as $jh) { $jh_lista .= "<option value=\"" . esc_attr($jh) . "\">" . esc_html($jh) . "</option>"; } if ($_POST) { $api_user = ""; $api_key = ""; $public_key = ""; $user = "insurance"; $array = array( "user" => $user, "public_key" => $public_key, "sikeres_url" => '', "sikertelen_url" => '', "v_nev" => isset($_POST['v_nev']) ? sanitize_text_field($_POST['v_nev']) : '', "u_nev" => isset($_POST['u_nev']) ? sanitize_text_field($_POST['u_nev']) : '', "email" => isset($_POST['email']) ? sanitize_email($_POST['email']) : '', "elso_uzembehelyezes" => isset($_POST['elso_uzembehelyezes']) ? sanitize_text_field($_POST['elso_uzembehelyezes']) : '', "karesemeny_idopont" => isset($_POST['karesemeny_idopont']) ? sanitize_text_field($_POST['karesemeny_idopont']) : '', "forgalmi_ertek" => isset($_POST['forgalmi_ertek']) ? floatval($_POST['forgalmi_ertek']) : 0, "munkadij" => isset($_POST['munkadij']) ? floatval($_POST['munkadij']) : 0, "anyagkoltseg" => isset($_POST['anyagkoltseg']) ? floatval($_POST['anyagkoltseg']) : 0, "rendszam" => isset($_POST['rendszam']) ? sanitize_text_field($_POST['rendszam']) : '', "alvazszam" => isset($_POST['alvazszam']) ? sanitize_text_field($_POST['alvazszam']) : '', "futott_km" => isset($_POST['futott_km']) ? intval($_POST['futott_km']) : 0, "biztosito" => isset($_POST['biztosito']) ? sanitize_text_field($_POST['biztosito']) : '', "hol_hallott_rolunk" => isset($_POST['hol_hallott_rolunk']) ? sanitize_text_field($_POST['hol_hallott_rolunk']) : '', "javitas_helye" => isset($_POST['javitas_helye']) ? sanitize_text_field($_POST['javitas_helye']) : '', ); // 后续业务逻辑自行补充 }
优化建议
- 三个JSON文件内容更新频率极低的话,直接把文件下载到子主题本地目录读取,不要每次页面加载都发起外部请求,既可以提升页面加载速度,也能避免外部站点故障、网络波动导致功能失效。
- 开发阶段可开启WordPress调试模式,直接查看具体报错信息,不要用
@符号压制错误,会提高排查成本。 - 输出HTML选项时必须用
esc_attr()、esc_html()做转义,符合WordPress开发安全规范,避免XSS漏洞。 - 非必要不要强行修改php.ini开启
allow_url_fopen,会提升站点被攻击的风险。
内容的提问来源于stack exchange,提问作者FREXSAI
相关产品推荐
相关产品推荐

