Почему json_decode не работает?

Вопрос или проблема

Я пытаюсь определить, связано ли это с тем, что у меня на сервере стоит последняя версия 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() может возникать по нескольким причинам. Давайте рассмотрим вашу ситуацию более детально и выделим основные моменты.

  1. Формат 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
    );
  2. Ошибка при декодировании: Вы можете проверить, была ли ошибка при декодировании JSON, добавив следующий код сразу после вызова json_decode:

    if (json_last_error() !== JSON_ERROR_NONE) {
       // Обработка ошибки
       return array('error' => json_last_error_msg());
    }
  3. Проблемы с HTTP-запросом: Возможно, запрос не возвращает корректный ответ. Убедитесь, что на сервере, к которому вы обращаетесь, работает API и он возвращает ожидаемый результат. Вы можете распечатать ответ ($json_content или $json) до декодирования, чтобы убедиться, что это корректный JSON.

  4. Использование 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());
    }
  5. 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);

С этими изменениями и хорошей проверкой ошибок ваш код должен работать корректно.

Оцените материал
Добавить комментарий

Капча загружается...