Я пытаюсь это сделать. использование 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
]
]);
}
Что может случиться? Я также пробовал использовать точно такой же фильтр в POSTMAN. Там все работает нормально и получены ожидаемые результаты. Но в WordPress это, похоже, не работает.
Подробнее здесь: https://stackoverflow.com/questions/791 ... dpress-int
Мобильная версия