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 = [];
//
$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'] ?? '';
//
$c_det_data = fetch_json("$endpoint?api_page=kcountrydet-api&token=$token&CountryID=$c_id");
$c_desc = $c_det_data['GetCountryDetails']['Country']['Description'] ?? '';
//
$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'];
//
$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'];
//
$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'] ?? '';
//
$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
Мобильная версия