Паяю, делаю антенны, собираю в эфире DX и все остальное, contest’s.
add_action( 'wp_ajax_swd_get_sfi_ssn_data', 'swd_get_sfi_ssn_data' ); add_action( 'wp_ajax_nopriv_swd_get_sfi_ssn_data', 'swd_get_sfi_ssn_data' ); function swd_get_sfi_ssn_data() { $cache_key = 'swd_daily_sfi_ssn_v7'; $cached = get_transient( $cache_key ); if ( $cached !== false && is_array( $cached ) && ! empty( $cached ) ) { wp_send_json_success( $cached ); } /* ---- 1. SFI: ежедневные данные за последние ~40 дней ---- */ $sfi_recent = []; $url_sfi = 'https://services.swpc.noaa.gov/json/f107_cm_flux.json'; $body_sfi = swd_curl_fetch( $url_sfi, false, 8 ); if ( $body_sfi ) { $arr = json_decode( $body_sfi, true ); if ( is_array( $arr ) ) { $temp = []; foreach ( $arr as $row ) { if ( ! isset( $row['time_tag'], $row['flux'] ) ) continue; $date = substr( $row['time_tag'], 0, 10 ); $v = (float) $row['flux']; if ( $v <= 0 ) continue; if ( ! isset( $temp[ $date ] ) ) $temp[ $date ] = []; $temp[ $date ][] = $v; } foreach ( $temp as $d => $vals ) { $sfi_recent[ $d ] = round( array_sum( $vals ) / count( $vals ), 1 ); } } } /* ---- 2. Месячные SFI и SSN из NOAA ---- */ $sfi_monthly = []; $ssn_monthly = []; $url_noaa = 'https://services.swpc.noaa.gov/json/solar-cycle/observed-solar-cycle-indices.json'; $body_noaa = swd_curl_fetch( $url_noaa, false, 8 ); if ( $body_noaa ) { $arr = json_decode( $body_noaa, true ); if ( is_array( $arr ) ) { $arr = array_slice( $arr, -24 * 12 ); foreach ( $arr as $row ) { if ( ! isset( $row['time-tag'] ) ) continue; $tag = $row['time-tag']; if ( isset( $row['f10.7'] ) && $row['f10.7'] > 0 ) $sfi_monthly[ $tag ] = (float) $row['f10.7']; if ( isset( $row['ssn'] ) && $row['ssn'] >= 0 ) $ssn_monthly[ $tag ] = (float) $row['ssn']; } } } /* ---- 3. SSN: ежедневные данные SILSO (по годам!) ---- */ $ssn_daily = []; $this_year = (int) date( 'Y' ); // Запрашиваем файл за прошлый и текущий год $silso_urls = [ 'https://www.sidc.be/silso/DATA/EISN/EISN_' . ( $this_year - 1 ) . '.csv', 'https://www.sidc.be/silso/DATA/EISN/EISN_' . $this_year . '.csv', ]; foreach ( $silso_urls as $url ) { $body = swd_curl_fetch( $url, false, 10 ); if ( ! $body ) continue; $lines = explode( "\n", $body ); foreach ( $lines as $line ) { $line = trim( $line ); if ( $line === '' || $line[0] === '#' ) continue; // Формат SILSO: Year;Month;Day;Decimal_Date;SSN;Std_Dev;... $parts = explode( ';', $line ); if ( count( $parts ) < 5 ) continue; $y = (int) trim( $parts[0] ); $m = (int) trim( $parts[1] ); $d = (int) trim( $parts[2] ); if ( $y <= 0 || $m <= 0 || $d <= 0 ) continue; $ssn = (float) trim( $parts[4] ); // 5-й столбец (индекс 4) = SSN if ( $ssn < 0 ) continue; $date = sprintf( '%04d-%02d-%02d', $y, $m, $d ); $ssn_daily[ $date ] = $ssn; } } /* ---- 4. Собираем итоговый массив по дням ---- */ $by_date = []; foreach ( $sfi_monthly as $tag => $val ) { $p = explode( '-', $tag ); if ( count( $p ) < 2 ) continue; $y = (int) $p[0]; $m = (int) $p[1]; $days = (int) date( 't', mktime( 0, 0, 0, $m, 1, $y ) ); for ( $d = 1; $d <= $days; $d++ ) { $date = sprintf( '%04d-%02d-%02d', $y, $m, $d ); if ( ! isset( $by_date[ $date ] ) ) $by_date[ $date ] = [ 'date' => $date, 'sfi' => null, 'ssn' => null ]; $by_date[ $date ]['sfi'] = $val; } } foreach ( $ssn_monthly as $tag => $val ) { $p = explode( '-', $tag ); if ( count( $p ) < 2 ) continue; $y = (int) $p[0]; $m = (int) $p[1]; $days = (int) date( 't', mktime( 0, 0, 0, $m, 1, $y ) ); for ( $d = 1; $d <= $days; $d++ ) { $date = sprintf( '%04d-%02d-%02d', $y, $m, $d ); if ( ! isset( $by_date[ $date ] ) ) $by_date[ $date ] = [ 'date' => $date, 'sfi' => null, 'ssn' => null ]; $by_date[ $date ]['ssn'] = $val; } } // Ежедневные SFI перекрывают месячные foreach ( $sfi_recent as $date => $val ) { if ( ! isset( $by_date[ $date ] ) ) $by_date[ $date ] = [ 'date' => $date, 'sfi' => null, 'ssn' => null ]; $by_date[ $date ]['sfi'] = $val; } // Ежедневные SSN SILSO перекрывают месячные foreach ( $ssn_daily as $date => $val ) { if ( ! isset( $by_date[ $date ] ) ) $by_date[ $date ] = [ 'date' => $date, 'sfi' => null, 'ssn' => null ]; $by_date[ $date ]['ssn'] = $val; } $merged = array_values( $by_date ); usort( $merged, function( $a, $b ) { return strcmp( $a['date'], $b['date'] ); } ); set_transient( $cache_key, $merged, 3600 * 12 ); wp_send_json_success( $merged ); }
Паяю, делаю антенны, собираю в эфире DX и все остальное, contest’s.