Проблемы с применением фильтров тела JSON в API ПОИСКА портала F&T ЕС с интеграцией WordPressPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Проблемы с применением фильтров тела JSON в API ПОИСКА портала F&T ЕС с интеграцией WordPress

Сообщение Anonymous »

Я пытаюсь использовать службу SEARCH API общедоступных API REST портала EU F&T для получения данных для дальнейшей интеграции с моим проектом, но у меня возникли некоторые проблемы.
Я пытаюсь это сделать. использование WordPress в качестве CMS с плагином ACF|Advanced Custom Fields. Цель системы — выполнить вызов API, получить все результаты и сохранить каждый параметр в настраиваемом поле, а не постоянно выполнять вызовы API. Согласно документации API (текстовой), там говорится, что «Критерии поиска (запрос) могут быть отправлены в «Данные формы» запроса POST в формате JSON», но у меня возникли проблемы с реализацией фильтра в WordPress.
В документации указано, как получить запрос для фильтра, поэтому я хочу применить что-то вроде этого: {'bool':{'must':[{'terms':{'type ':['1', '2', '8']}},{'terms':{'status':['31094501', '31094502']}}]} Так что я бы только получите ответы со статусом 31094501 (Предстоят) или 31094502 (Открыты для отправки). Но когда я делаю вызов API, иногда я не получаю результатов, а иногда получаю результаты, которые не соответствуют примененному фильтру.
Я пытался применить фильтр следующим образом:
Я пытался применить фильтр следующим образом:
р>

Код: Выделить всё

add_action('init', 'register_EUopportunity');

function register_EUopportunity() {
register_post_type('opportunity', [
'label' => 'EU opportunities',
'public' => true,
'capability_type' => 'post',
]);
}

add_action('wp_ajax_nopriv_get_opportunities_from_api', 'get_opportunities_from_api');
add_action('wp_ajax_get_opportunities_from_api', 'get_opportunities_from_api');

function get_opportunities_from_api() {
$current_page = ( ! empty($_POST['current_page']) ) ? $_POST['current_page'] : 1;
$opportunities = [];

$body = array(
'bool' => array(
'must' => array(
array(
'terms' => array(
'type' => array('1', '2', '8')
)
),
array(
'terms' => array(
'status' => array('31094501', '31094502')
)
)
)
)
);

$args = array(
'headers' => array(
'Content-Type' => 'application/json'
),
'body' => json_encode($body),
);

$response = wp_remote_post('https://api.tech.ec.europa.eu/search-api/prod/rest/search?apiKey=SEDIA&text=***&pageSize=50&pageNumber=' .  $current_page, $args);

if (is_wp_error($response)) {
return false;
}

$response_body = wp_remote_retrieve_body($response);
$response_body = json_decode($response_body, true);

if (!is_array($response_body) || empty($response_body['results'])) {
return false;
}

$opportunities = $response_body['results'];

foreach ($opportunities as $opportunity) {
$opportunity_slug = sanitize_title($opportunity['reference']);
$inserted_opportunity = wp_insert_post([
'post_name' => $opportunity_slug,
'post_title' => $opportunity_slug,
'post_type' => 'opportunity',
'post_status' => 'publish'
]);

if (is_wp_error($inserted_opportunity)) {
continue;
}

$fillable = [
'field_6708df10da74e' => 'reference',
'field_6708d325a3d11' => 'url',
'field_6708d52fe3556' => 'summary',
'field_6708f69748573' => 'frameworkProgramme',
'field_670901cfc55e8' => 'deadlineDate',
'field_67090647166a6' => 'callTitle',
'field_67090684813cd' => 'identifier',
'field_6709088554ec8' => 'descriptionByte',
'field_670f704b8482f' => 'status',
];

foreach ($fillable as $key => $name) {
if ($name === 'frameworkProgramme' && !empty($opportunity['metadata']['frameworkProgramme'])) {
update_field($key, $opportunity['metadata']['frameworkProgramme'][0], $inserted_opportunity);
} elseif($name === 'deadlineDate' && !empty($opportunity['metadata']['deadlineDate'])){
update_field($key, $opportunity['metadata']['deadlineDate'][0], $inserted_opportunity);
} elseif($name === 'callTitle' && !empty($opportunity['metadata']['callTitle'])){
update_field($key, $opportunity['metadata']['callTitle'][0], $inserted_opportunity);
} elseif($name === 'identifier' && !empty($opportunity['metadata']['identifier'])){
update_field($key, $opportunity['metadata']['identifier'][0], $inserted_opportunity);
} elseif($name === 'descriptionByte' && !empty($opportunity['metadata']['descriptionByte'])){
update_field($key, $opportunity['metadata']['descriptionByte'][0], $inserted_opportunity);
} elseif($name === 'status' && !empty($opportunity['metadata']['status'])){
update_field($key, $opportunity['metadata']['status'][0], $inserted_opportunity);
} elseif (!empty($opportunity[$name])) {
update_field($key, $opportunity[$name], $inserted_opportunity);
}
}
}

$current_page = $current_page + 1;
wp_remote_post(admin_url('admin-ajax.php?action=get_opportunities_from_api'), [
'blocking' => false,
'sslverify' => false,
'body' => [
'current_page' => $current_page
]
]);
}
Если я не применяю никаких фильтров, код работает нормально. Результаты получены, добавлены как сообщения и настраиваемые поля заполнены. Но когда я применяю фильтры, я должен получить только результаты со статусом 31094501 или 31094502, но, как я уже говорил, похоже, что фильтр не работаю, и иногда я не получаю никаких результатов, а иногда я получаю результаты, статус которых отличается от 31094501 или 31094502.
Что может случиться? Я также пробовал использовать точно такой же фильтр в POSTMAN. Там все работает нормально и получены ожидаемые результаты. Но в WordPress это, похоже, не работает.

Подробнее здесь: https://stackoverflow.com/questions/791 ... dpress-int
Ответить

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

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

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

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

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