Вопрос или проблема
Я пытаюсь определить, связано ли это с тем, что у меня на сервере стоит последняя версия PHP, а я использую последнюю версию WordPress. Или я просто делаю что-то не так:
Вот моя функция, которая правильно возвращает значения (я вижу их, когда использую echo или var_dump):
function my_Get_CURL (){
$url="http://someotherserver/event/94303?radius=30";
// Инициализация CURL
$ch = curl_init();
// Отключить проверку SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// Вернуть ответ, если false - вывести ответ
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Заголовок
$headers = array(
'Content-type: application/json'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// Установить URL
curl_setopt($ch, CURLOPT_URL,$url);
// Выполнить
$json_content=curl_exec($ch);
$json = json_decode($json_content, true);
// echo $json_content;
return array(
'distance' => $json['distance'],
'data' => $json['data']
);
}
add_filter('the_content', 'my_Get_CURL', 1,3);
Вот что выводит var_dump или echo:
[{"distance": 0.0, "data": {"event_id": "1179", "post_id": "1564", "location_id": "19", "location_postcode": "94301"}}, {"distance": 2.162680661505968, "data": {"event_id": "1193", "post_id": "1578", "location_id": "19", "location_postcode": "94301"}}
Это я или, как я читал в некоторых невыраженных отчетах о json_decode в WordPress, это связано с тем, что я использую php v5.3.2?
Должен ли я использовать wp_remote_retrieve_body вместо этого? Какова разница между тем, что это делает, и параметрами CURL, которые я использую?
Кроме того, я также пробовал этот подход… который был учебным. Все равно ничего не возвращается:
function my_wpRemote() {
// Отправить GET-запрос на удаленный API
$api_url="http://remoteserver/event/94303?radius=30";
$api_response = wp_remote_get( $api_url );
// Получить JSON-объект
$json = wp_remote_retrieve_body( $api_response );
// Убедиться, что запрос был успешным, или вернуть false
if( empty( $json ) )
return false;
// Декодировать JSON-объект
// Вернуть массив
$json = json_decode( $json );
return array(
'distance' => $json->distance,
'data' => $json->data
);
}
add_filter('the_content', 'my_wpRemote', 1,3);
Используйте print_r();
и сохраните в переменную для дальнейшей работы.
Пример:
$convertObj = json_decode($fetchJobs);
$jobArray = print_r($convertObj->data, true);
Ответ или решение
Проблема с использованием функции json_decode()
может возникать по нескольким причинам. Давайте рассмотрим вашу ситуацию более детально и выделим основные моменты.
-
Формат JSON: Ваш вывод, который вы предоставили с помощью
var_dump
, показывает, что вы получаете массив объектов JSON. Однако, когда вы пытаетесь получить доступ к полямdistance
иdata
, вы делаете это неправильно. Ваша текущая структура возвращает массив, а не объект. Это означает, что вам нужно обращаться к элементам массива, например, через индексы. Если ваш JSON выглядит так:[ {"distance": 0.0, "data": {...}}, {"distance": 2.16268, "data": {...}} ]
Тогда вам нужно изменить ваш код на что-то вроде:
return array( 'distance' => $json[0]->distance, // Обращение к первому элементу массива 'data' => $json[0]->data );
-
Ошибка при декодировании: Вы можете проверить, была ли ошибка при декодировании JSON, добавив следующий код сразу после вызова
json_decode
:if (json_last_error() !== JSON_ERROR_NONE) { // Обработка ошибки return array('error' => json_last_error_msg()); }
-
Проблемы с HTTP-запросом: Возможно, запрос не возвращает корректный ответ. Убедитесь, что на сервере, к которому вы обращаетесь, работает API и он возвращает ожидаемый результат. Вы можете распечатать ответ (
$json_content
или$json
) до декодирования, чтобы убедиться, что это корректный JSON. -
Использование
wp_remote_get()
: Вы задали вопрос, стоит ли использоватьwp_remote_get()
вместо cURL. Рекомендуется использовать функции WordPress, такие какwp_remote_get()
, поскольку они автоматически обрабатывают некоторые аспекты, такие как кэширование и аутентификация. Ваш код сwp_remote_get()
выглядит корректным, но вам также стоит добавить проверку на наличие ошибок:if (is_wp_error($api_response)) { return array('error' => $api_response->get_error_message()); }
-
PHP 5.3.2: Сообщенные проблемы с
json_decode()
в WordPress в основном не связаны с версией PHP, если она поддерживает функции, используемые вами. Однако, если возможно, рекомендуется использовать более новую версию PHP, так как она предлагает больше возможностей и улучшений в производительности.
После внесения изменений, ваш окончательный код может выглядеть следующим образом:
function my_Get_CURL(){
$url = "http://someotherserver/event/94303?radius=30";
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = array('Content-type: application/json');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
$json_content = curl_exec($ch);
if (curl_errno($ch)) {
return array('error' => curl_error($ch));
}
$json = json_decode($json_content);
if (json_last_error() !== JSON_ERROR_NONE) {
return array('error' => json_last_error_msg());
}
return array(
'distance' => $json[0]->distance,
'data' => $json[0]->data
);
}
add_filter('the_content', 'my_Get_CURL', 1, 3);
И для wp_remote_get()
:
function my_wpRemote() {
$api_url = "http://remoteserver/event/94303?radius=30";
$api_response = wp_remote_get($api_url);
if (is_wp_error($api_response)) {
return array('error' => $api_response->get_error_message());
}
$json = wp_remote_retrieve_body($api_response);
if (empty($json)) {
return array('error' => 'Empty response');
}
$json = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
return array('error' => json_last_error_msg());
}
return array(
'distance' => $json[0]->distance,
'data' => $json[0]->data
);
}
add_filter('the_content', 'my_wpRemote', 1, 3);
С этими изменениями и хорошей проверкой ошибок ваш код должен работать корректно.