Присоединяйтесь к конечным точкам API и выписывайте результатPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Присоединяйтесь к конечным точкам API и выписывайте результат

Сообщение Anonymous »

Я хотел бы объединить конечные точки и вернуть результат (в Wordpress). После получения результатов я хочу импортировать их с помощью плагина WP All Import, Hotels and Locations. Я использую тему Traveler.
API: https://www.postman.com/filipnet-team/k ... webservice
Я тоже сделал диаграмму:
Изображение

Объединить его следует следующим образом: Страны (->Сведения о стране) -> Регионы -> Курорты -> Отели (->Сведения об отеле)
Результаты должны отображаться на пустой странице.
Что Я попробовал - Остальные части работают нормально, за исключением 6-й, где я пытался присоединиться к конечным точкам API - Ошибка: ни одна страна не возвращена из API / На этом веб-сайте произошла критическая ошибка:
// ----------------------------
// 0. API_SECRET_TOKEN API
// ----------------------------
// Generate a long random token once and paste it here
define('API_SECRET_TOKEN', 'xxx');

add_action('init', function () {

$api_pages = array(
'kcountrylist-api' => array( /*CountryList*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '


XML.naturatravel
naturatravel

GetCountriesList


'
),
'kcountrydet-api' => array( /*CountryDetails*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '


XML.naturatravel
naturatravel

GetCountryDetails


{{CountryID}}

'
),
'kregionlist-api' => array( /*RegionList*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '


XML.naturatravel
naturatravel

GetRegionsList


{{CountryID}}

'
),
'kregiondet-api' => array( /*RegionDetails*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '



XML.naturatravel
naturatravel

GetRegionDetails


{{RegionID}}

'
),
'kresortlist-api' => array( /*ResortList*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '



XML.naturatravel
naturatravel

GetResortsList


{{CountryID}}
{{RegionID}}

'
),
'kresortdet-api' => array( /*ResortDet*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '



XML.naturatravel
naturatravel

GetResortDetails


{{ResortID}}

'
),
'khotelslist-api' => array( /*Hotels*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '



XML.naturatravel
naturatravel

GetHotelsList



{{RegionID}}
{{CountryID}}

'
),
'khoteldet-api' => array( /*Hotel Details*/
'endpoint' => 'https://webservice.karpaten.ro/webservice/',
'method' => 'POST',
'headers' => array('Content-Type' => 'text/xml; charset=utf-8'),
'body' => '



XML.naturatravel
naturatravel

GetHotelDetails


{{HotelID}}

'
)
);

if (isset($_GET['api_page']) && isset($api_pages[$_GET['api_page']])) {

if (!isset($_GET['token']) || $_GET['token'] !== API_SECRET_TOKEN) {
status_header(403);
wp_die('Forbidden: Invalid token');
}

$config = $api_pages[$_GET['api_page']];
$method = strtoupper($config['method']);

$body = $config['body'];

// ---- Handle dynamic parameters ----
if ($method === 'POST') {
foreach ($_GET as $key => $value) {
if (in_array($key, ['api_page','token','format'])) continue;
$value = sanitize_text_field($value);
$body = str_replace('{{'.$key.'}}', $value, $body);
}

if (stripos($config['headers']['Content-Type'], 'json') !== false) {
$body_arr = json_decode($body, true);
if (isset($body_arr['root']['main'])) {
foreach ($_GET as $key => $value) {
if (in_array($key, ['api_page','token','format'])) continue;
$body_arr['root']['main'][$key] = sanitize_text_field($value);
}
}
$body = json_encode($body_arr);
}
elseif (stripos($config['headers']['Content-Type'], 'xml') !== false) {
$body = preg_replace('/&(?![a-zA-Z#0-9]+;)/', '&', $body);
$xml = new DOMDocument();
$xml->loadXML($body);

$main = $xml->getElementsByTagName('main')->item(0);
foreach ($_GET as $key => $value) {
if (in_array($key, ['api_page','token','format'])) continue;
$found = $xml->getElementsByTagName($key)->item(0);
if (!$found) {
$el = $xml->createElement($key, htmlspecialchars($value, ENT_XML1 | ENT_COMPAT, 'UTF-8'));
$main->appendChild($el);
} else {
$found->nodeValue = htmlspecialchars($value, ENT_XML1 | ENT_COMPAT, 'UTF-8');
}
}
$body = $xml->saveXML();
}
}

// ---- Build request ----
$args = array(
'method' => $method,
'headers' => $config['headers']
);

if ($method === 'POST') {
$args['body'] = $body;
$url = $config['endpoint'];
} else {
$params = $_GET;
unset($params['api_page'], $params['token'], $params['format']);
$url = add_query_arg($params, $config['endpoint']);
}

// ---- Send ----
$response = wp_remote_request($url, $args);

if (is_wp_error($response)) {
wp_die($response->get_error_message());
}

$body = wp_remote_retrieve_body($response);

// ---- Clean ----
$body = html_entity_decode($body, ENT_QUOTES | ENT_HTML5 | ENT_SUBSTITUTE, 'UTF-8');
$body = preg_replace('/>\s+/s', '', $body);
//$body = preg_replace('/]+>|]+>$/', '', $raw);

// Encode HTML if requested
if ($encode_html) {
$inner = htmlentities($inner, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

$value = $inner;
}

if (isset($arr[$key])) {
if (!is_array($arr[$key]) || !isset($arr[$key][0])) {
$arr[$key] = [$arr[$key]];
}
$arr[$key][] = $value;
} else {
$arr[$key] = $value;
}
}

return $arr;
}
// ----------------------------
// 5. Examples
// ----------------------------
/*1. https://test.naturatravel.ro/?api_page= ... 04e28e20*/
/*2. https://test.naturatravel.ro/?api_page= ... ryID=187*/
/*3. https://test.naturatravel.ro/?api_page= ... ryID=215*/
/*4. https://test.naturatravel.ro/?api_page= ... onID=325*/
/*5. https://test.naturatravel.ro/?api_page= ... onID=325*/
/*6. https://test.naturatravel.ro/?api_page= ... tID=2133*/
/*7. https://test.naturatravel.ro/?api_page= ... ountryID=7 */
/*8. https://test.naturatravel.ro/?api_page= ... elID=29274 */
// ----------------------------
// Preserve HTML in post_content
// ----------------------------
add_filter('wpgetapi_api_to_posts_before_insert_post', function($post_data, $item, $map) {

// Apply only to st_location posts
if ($post_data['post_type'] === 'st_location') {

foreach($map as $field_map) {
if($field_map['post_field'] === 'post_content') {
$api_field = $field_map['api_field'];
if(isset($item[$api_field])) {
// Insert raw HTML from API
$post_data['post_content'] = $item[$api_field];
}
}
}
}

return $post_data;

}, 10, 3);
// ----------------------------
// 6. Custom Combined Hotels API
// ----------------------------
// ----------------------------
// 0. API_SECRET_TOKEN
// ----------------------------
//define('API_SECRET_TOKEN', 'xxx');

// ----------------------------
// Helper: fetch JSON from URL
// ----------------------------
function fetch_json($url) {
$res = wp_remote_get($url);
if (is_wp_error($res)) return null;
$body = wp_remote_retrieve_body($res);
$data = json_decode($body, true);
return $data ?: null;
}

// ----------------------------
// Full Hotels JSON
// ----------------------------
add_action('init', function() {

if(isset($_GET['api_page']) && $_GET['api_page'] === 'kfull-hotels-json') {

if(!isset($_GET['token']) || $_GET['token'] !== API_SECRET_TOKEN){
status_header(403);
wp_die('Forbidden: Invalid token');
}

$endpoint = 'https://test.naturatravel.ro/';
$token = $_GET['token'];
$final = [];

// 1️⃣ Countries
$countries_data = fetch_json("$endpoint?api_page=kcountrylist-api&token=$token");
if(!$countries_data || !isset($countries_data['GetCountriesList']['CountriesList']['Country'])) {
wp_die('No countries returned from API');
}

$countries = (array)$countries_data['GetCountriesList']['CountriesList']['Country'];

foreach($countries as $country) {
$c_id = $country['ID'];
$c_name = $country['Name'];
$c_code = $country['CodIso2'] ?? '';

// 2️⃣ CountryDetails
$c_det_data = fetch_json("$endpoint?api_page=kcountrydet-api&token=$token&CountryID=$c_id");
$c_desc = $c_det_data['GetCountryDetails']['Country']['Description'] ?? '';

// 3️⃣ Regions list
$regions_data = fetch_json("$endpoint?api_page=kregionlist-api&token=$token&CountryID=$c_id");
$regions_arr = [];
if(isset($regions_data['GetRegionsList']['RegionsList']['Region'])) {
$regions = (array)$regions_data['GetRegionsList']['RegionsList']['Region'];
foreach($regions as $region) {
$r_id = $region['ID'];
$r_name = $region['Name'];

// 4️⃣ Resort list
$resorts_data = fetch_json("$endpoint?api_page=kresortlist-api&token=$token&CountryID=$c_id&RegionID=$r_id");
$resorts_arr = [];
if(isset($resorts_data['GetResortsList']['ResortsList']['Resort'])) {
$resorts = (array)$resorts_data['GetResortsList']['ResortsList']['Resort'];
foreach($resorts as $resort) {
$res_id = $resort['ID'];
$res_name = $resort['Name'];

// 5️⃣ Hotels list
$hotels_data = fetch_json("$endpoint?api_page=khotelslist-api&token=$token&CountryID=$c_id&RegionID=$r_id");
$hotels_arr = [];
if(isset($hotels_data['GetHotelsList']['HotelsList']['Hotel'])) {
$hotels = (array)$hotels_data['GetHotelsList']['HotelsList']['Hotel'];
foreach($hotels as $hotel) {
$h_id = $hotel['ID'];
$h_name = $hotel['Name'];
$h_stars = $hotel['Stars'] ?? '';

// 6️⃣ HotelDetails
$h_det_data = fetch_json("$endpoint?api_page=khoteldet-api&token=$token&HotelID=$h_id");
$h_desc = $h_det_data['GetHotelDetails']['Hotel']['Description'] ?? '';
$h_policies = $h_det_data['GetHotelDetails']['Hotel']['Policies'] ?? '';

$hotels_arr[] = [
'hotel_id' => $h_id,
'hotel_name' => $h_name,
'stars' => $h_stars,
'description' => $h_desc,
'policies' => $h_policies
];
}
}

$resorts_arr[] = [
'resort_id' => $res_id,
'resort_name' => $res_name,
'hotels' => $hotels_arr
];
}
}

$regions_arr[] = [
'region_id' => $r_id,
'region_name' => $r_name,
'resorts' => $resorts_arr
];
}
}

$final[] = [
'country_id' => $c_id,
'country_name' => $c_name,
'country_code' => $c_code,
'description' => $c_desc,
'regions' => $regions_arr
];
}

header('Content-Type: application/json; charset=utf-8');
echo json_encode($final, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}

});


Подробнее здесь: https://stackoverflow.com/questions/797 ... out-result
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»